#include "a.h"

/*
* 4 - Text filling, centering, and adjusting.
*      "\ " - unbreakable space
*      .n register - length of last line
*      nl register - text baseline position on this page
*      .h register - baseline high water mark
*      .k register - current horizontal output position
*      \p - cause break at end of word, justify
*      \& - non-printing zero-width filler
*      tr - output translation
*      \c - break (but don't) input line in .nf mode
*      \c - break (but don't) word in .fi mode
*/

int
e_space(void)
{
       return 0xA0;    /* non-breaking space */
}

int
e_amp(void)
{
       return Uempty;
}

int
e_c(void)
{
       getrune();
       bol = 1;
       return 0;
}

void
r_br(int argc, Rune **argv)
{
       USED(argc);
       USED(argv);
       br();
}

/* fill mode on */
void
r_fi(int argc, Rune **argv)
{
       USED(argc);
       USED(argv);
       nr(L(".fi"), 1);
// warn(".fi");
}

/* no-fill mode */
void
r_nf(int argc, Rune **argv)
{
       USED(argc);
       USED(argv);
       nr(L(".fi"), 0);
}

/* adjust */
void
r_ad(int argc, Rune **argv)
{
       int c, n;

       nr(L(".j"), getnr(L(".j"))|1);
       if(argc < 2)
               return;
       c = argv[1][0];
       switch(c){
       default:
               fprint(2, "%L: bad adjust %C\n", c);
               return;
       case 'r':
               n = 2*2|1;
               break;
       case 'l':
               n = 0;
               break;
       case 'c':
               n = 1*2|1;
               break;
       case 'b':
       case 'n':
               n = 0*2|1;
               break;
       case '0':
       case '1':
       case '2':
       case '3':
       case '4':
       case '5':
               n = c-'0';
               break;
       }
       nr(L(".j"), n);
}

/* no adjust */
void
r_na(int argc, Rune **argv)
{
       USED(argc);
       USED(argv);

       nr(L(".j"), getnr(L(".j"))&~1);
}

/* center next N lines */
void
r_ce(int argc, Rune **argv)
{
       if(argc < 2)
               nr(L(".ce"), 1);
       else
               nr(L(".ce"), eval(argv[1]));
       /* XXX set trap */
}

void
t4init(void)
{
       nr(L(".fi"), 1);
       nr(L(".j"), 1);

       addreq(L("br"), r_br, 0);
       addreq(L("fi"), r_fi, 0);
       addreq(L("nf"), r_nf, 0);
       addreq(L("ad"), r_ad, -1);
       addreq(L("na"), r_na, 0);
       addreq(L("ce"), r_ce, -1);

       addesc(' ', e_space, 0);
       addesc('p', e_warn, 0);
       addesc('&', e_amp, 0);
       addesc('c', e_c, 0);
}