Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#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);
}