tdef.h - 9base - revived minimalist port of Plan 9 userland to Unix
 (HTM) git clone git://git.suckless.org/9base
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tdef.h (18400B)
       ---
            1 #include <stdio.h>
            2 #include <stdlib.h>
            3 #include <limits.h>
            4 #include <ctype.h>
            5 #include <string.h>
            6 #include <unistd.h>
            7 
            8 #undef MB_CUR_MAX
            9 #define MB_CUR_MAX 3
           10 
           11 #define        NROFF        (!TROFF)
           12 
           13 /* Site dependent definitions */
           14 
           15 #ifndef TMACDIR
           16 #define TMACDIR                "lib/tmac/tmac."
           17 #endif
           18 #ifndef FONTDIR
           19 #define FONTDIR                "lib/font"
           20 #endif
           21 #ifndef NTERMDIR
           22 #define NTERMDIR        "lib/term/tab."
           23 #endif
           24 #ifndef TDEVNAME
           25 #define TDEVNAME        "post"
           26 #endif
           27 #ifndef NDEVNAME
           28 #define NDEVNAME        "37"
           29 #endif
           30 #ifndef TEXHYPHENS
           31 #define        TEXHYPHENS        "/usr/lib/tex/macros/hyphen.tex"
           32 #endif
           33 #ifndef ALTHYPHENS
           34 #define        ALTHYPHENS        "lib/tmac/hyphen.tex"        /* another place to look */
           35 #endif
           36 
           37 typedef        unsigned char        Uchar;
           38 typedef unsigned short        Ushort;
           39 
           40 typedef        /*unsigned*/ long        Tchar;
           41 
           42 typedef        struct        Blockp        Blockp;
           43 typedef        struct        Diver        Diver;
           44 typedef        struct        Stack        Stack;
           45 typedef        struct        Divsiz        Divsiz;
           46 typedef        struct        Contab        Contab;
           47 typedef        struct        Numtab        Numtab;
           48 typedef        struct        Numerr        Numerr;
           49 typedef        struct        Env        Env;
           50 typedef        struct        Term        Term;
           51 typedef struct        Chwid        Chwid;
           52 typedef struct        Font        Font;
           53 typedef        struct        Spnames        Spnames;
           54 typedef        struct        Wcache        Wcache;
           55 typedef        struct        Tbuf        Tbuf;
           56 
           57 /* this simulates printf into a buffer that gets flushed sporadically */
           58 /* the BSD goo is because SunOS sprintf doesn't return anything useful */
           59 
           60 #ifdef BSD4_2
           61 #define        OUT                (obufp += strlen((sprintf)(obufp,
           62 #define        PUT                ))) > obuf+BUFSIZ ? flusho() : 1
           63 #else
           64 #define        OUT                (obufp += (sprintf)(obufp,
           65 #define        PUT                )) > obuf+BUFSIZ ? flusho() : 1
           66 #endif
           67 
           68 #define        oputs(a)        OUT "%s", a PUT
           69 #define        oput(c)                ( *obufp++ = (c), obufp > obuf+BUFSIZ ? flusho() : 1 )
           70 
           71 extern        char        errbuf[];
           72 #define        ERROR        (sprintf)(errbuf,
           73 #define        WARN        ), errprint()
           74 #define        FATAL        ), errprint(), exit(1)
           75 
           76 /* starting values for typesetting parameters: */
           77 
           78 #define        PS        10        /* default point size */
           79 #define        FT        1        /* default font position */
           80 #define ULFONT        2        /* default underline font */
           81 #define        BDFONT        3        /* default emboldening font */
           82 #define        BIFONT        4        /* default bold italic font */
           83 #define        LL        (unsigned) 65*INCH/10        /* line length; 39picas=6.5in */
           84 #define        VS        ((12*INCH)/72)        /* initial vert space */
           85 
           86 
           87 #define        EMPTS(pts)        (((long)Inch*(pts) + 36) / 72)
           88 #define        EM        (TROFF? EMPTS(pts): t.Em)
           89 #define        INCH        (TROFF? Inch: 240)
           90 #define        HOR        (TROFF? Hor: t.Adj)
           91 #define        VERT        (TROFF? Vert: t.Vert)
           92 #define        PO        (TROFF? Inch: 0)
           93 #define        SPS        (TROFF? EMPTS(pts)/3: INCH/10)
           94 #define        SS        (TROFF? 12: INCH/10)
           95 #define        ICS        (TROFF? EMPTS(pts): 2*INCH/10)
           96 #define        DTAB        (TROFF? (INCH/2): 0)
           97 
           98 /* These "characters" are used to encode various internal functions
           99 /* Some make use of the fact that most ascii characters between
          100 /* 0 and 040 don't have any graphic or other function.
          101 /* The few that do have a purpose (e.g., \n, \b, \t, ...
          102 /* are avoided by the ad hoc choices here.
          103 /* See ifilt[] in n1.c for others -- 1, 2, 3, 5, 6, 7, 010, 011, 012 
          104 */
          105 
          106 #define        LEADER        001
          107 #define        IMP        004        /* impossible char; glues things together */
          108 #define        TAB        011
          109 #define        RPT        014        /* next character is to be repeated many times */
          110 #define        CHARHT        015        /* size field sets character height */
          111 #define        SLANT        016        /* size field sets amount of slant */
          112 #define        DRAWFCN        017        /* next several chars describe arb drawing fcns */
          113 #        define        DRAWLINE        'l'        /* line: 'l' dx dy char */
          114 #        define        DRAWCIRCLE        'c'        /* circle: 'c' r */
          115 #        define        DRAWELLIPSE        'e'        /* ellipse: 'e' rx ry */
          116 #        define        DRAWARC                'a'        /* arc: 'a' dx dy dx dy */
          117 #        define        DRAWSPLINE        '~'        /* quadratic B spline: '~' dx dy dx dy ... */
          118                                         /* other splines go thru too */
          119 /* NOTE:  the use of ~ is a botch since it's often used in .tr commands */
          120 /* better to use a letter like s, but change it in the postprocessors too */
          121 /* for now, this is taken care of in n9.c and t10.c */
          122 #        define        DRAWBUILD        'b'        /* built-up character (e.g., { */
          123 
          124 #define        LEFT        020        /* \{ */
          125 #define        RIGHT        021        /* \} */
          126 #define        FILLER        022        /* \& and similar purposes */
          127 #define        XON        023        /* \X'...' starts here */
          128 #define        OHC        024        /* optional hyphenation character \% */
          129 #define        CONT        025        /* \c character */
          130 #define        PRESC        026        /* printable escape */
          131 #define        UNPAD        027        /* unpaddable blank */
          132 #define        XPAR        030        /* transparent mode indicator */
          133 #define        FLSS        031        /* next Tchar contains vertical space */
          134                         /* used when recalling diverted text */
          135 #define        WORDSP        032        /* paddable word space */
          136 #define        ESC        033        /* current escape character */
          137 #define        XOFF        034        /* \X'...' ends here */
          138                         /* matches XON, but they will probably never nest */
          139                         /* so could drop this when another control is needed */
          140 #define        HX        035        /* next character is value of \x'...' */
          141 #define MOTCH        036        /* this "character" is really motion; used by cbits() */
          142 
          143 #define        HYPHEN        c_hyphen
          144 #define        EMDASH        c_emdash        /* \(em */
          145 #define        RULE        c_rule                /* \(ru */
          146 #define        MINUS        c_minus                /* minus sign on current font */
          147 #define        LIG_FI        c_fi                /* \(ff */
          148 #define        LIG_FL        c_fl                /* \(fl */
          149 #define        LIG_FF        c_ff                /* \(ff */
          150 #define        LIG_FFI        c_ffi                /* \(Fi */
          151 #define        LIG_FFL        c_ffl                /* \(Fl */
          152 #define        ACUTE        c_acute                /* acute accent \(aa */
          153 #define        GRAVE        c_grave                /* grave accent \(ga */
          154 #define        UNDERLINE c_under        /* \(ul */
          155 #define        ROOTEN        c_rooten        /* root en \(rn */
          156 #define        BOXRULE        c_boxrule        /* box rule \(br */
          157 #define        LEFTHAND c_lefthand        /* left hand for word overflow */
          158 #define        DAGGER         c_dagger        /* dagger for end of sentence/footnote */
          159 
          160 #define        HYPHALG        1        /* hyphenation algorithm: 0=>good old troff, 1=>tex */
          161 
          162 
          163 /* array sizes, and similar limits: */
          164 
          165 #define MAXFONTS 99        /* Maximum number of fonts in fontab */
          166 #define        NM        91        /* requests + macros */
          167 #define        NN        NNAMES        /* number registers */
          168 #define        NNAMES        15        /* predefined reg names */
          169 #define        NIF        15        /* if-else nesting */
          170 #define        NS        128        /* name buffer */
          171 #define        NTM        1024        /* tm buffer */
          172 #define        NEV        3        /* environments */
          173 #define        EVLSZ        10        /* size of ev stack */
          174 
          175 #define        STACKSIZE (12*1024)        /* stack for macros and strings in progress */
          176 #define        NHYP        10        /* max hyphens per word */
          177 #define        NHEX        512        /* byte size of exception word list */
          178 #define        NTAB        100        /* tab stops */
          179 #define        NSO        5        /* "so" depth */
          180 #define        NMF        5        /* number of -m flags */
          181 #define        WDSIZE        500        /* word buffer click size */
          182 #define        LNSIZE        4000        /* line buffer click size */
          183 #define        OLNSIZE        5000        /* output line buffer click; bigger for 'w', etc. */
          184 #define        NDI        5        /* number of diversions */
          185 
          186 #define        ALPHABET alphabet        /* number of characters in basic alphabet. */
          187                         /* 128 for parochial USA 7-bit ascii, */
          188                         /* 256 for "European" mode with e.g., Latin-1 */
          189 
          190         /* NCHARS must be greater than 
          191                 ALPHABET (ascii stuff) + total number of distinct char names
          192                 from all fonts that will be run in this job (including
          193                 unnamed ones and \N's)
          194         */
          195 
          196 #define        NCHARS        (8*1024)        /* maximum size of troff character set*/
          197 
          198 
          199         /* However for nroff you want only :
          200         1. number of special codes in charset of DESC, which ends up being the
          201                 value of nchtab and which must be less than 512.
          202         2. ALPHABET, which apparently is the size of the portion of the tables reserved
          203                 for special control symbols
          204         Apparently the max N of \N is irrelevant; */
          205         /* to allow \N of up to 254 with up to 338 special characters
          206                 you need NCHARS of 338 + ALPHABET = 466 */
          207 
          208 #define        NROFFCHARS        1024        /* maximum size of nroff character set */
          209 
          210 #define        NTRTAB                NCHARS        /* number of items in trtab[] */
          211 #define NWIDCACHE        NCHARS        /* number of items in widcache[] */
          212 
          213 #define        NTRAP        20        /* number of traps */
          214 #define        NPN        20        /* numbers in "-o" */
          215 #define        FBUFSZ        512        /* field buf size words */
          216 #define        IBUFSZ        4096        /* bytes */
          217 #define        NC        1024        /* cbuf size words */
          218 #define        NOV        10        /* number of overstrike chars */
          219 #define        NPP        10        /* pads per field */
          220 
          221 /*
          222         Internal character representation:
          223         Internally, every character is carried around as
          224         a 32 bit cookie, called a "Tchar" (typedef long).
          225         Bits are numbered 31..0 from left to right.
          226         If bit 15 is 1, the character is motion, with
          227                 if bit 16 it's vertical motion
          228                 if bit 17 it's negative motion
          229         If bit 15 is 0, the character is a real character.
          230                 if bit 31        zero motion
          231                 bits 30..24        size
          232                 bits 23..16        font
          233 */
          234 
          235 /* in the following, "L" should really be a Tchar, but ... */
          236 /* numerology leaves room for 16 bit chars */
          237 
          238 #define        MOT        (01uL << 16)        /* motion character indicator */
          239 #define        VMOT        (01uL << 30)        /* vertical motion bit */
          240 #define        NMOT        (01uL << 29)        /* negative motion indicator */
          241 /* #define        MOTV        (MOT|VMOT|NMOT)        /* motion flags */
          242 /* #define        MAXMOT        (~MOTV)                /* maximum motion permitted */
          243 #define        MAXMOT        0xFFFF
          244 
          245 #define        ismot(n)        ((n) & MOT)
          246 #define        isvmot(n)        (((n) & (MOT|VMOT)) == (MOT|VMOT))        /* must have tested MOT previously */
          247 #define        isnmot(n)        (((n) & (MOT|NMOT)) == (MOT|NMOT))        /* ditto */
          248 #define        absmot(n)        ((n) & 0xFFFF)
          249 
          250 #define        ZBIT        (01uL << 31)        /* zero width char */
          251 #define        iszbit(n)        ((n) &  ZBIT)
          252 
          253 #define        FSHIFT        17
          254 #define        SSHIFT        (FSHIFT+7)
          255 #define        SMASK                (0177uL << SSHIFT)        /* 128 distinct sizes */
          256 #define        FMASK                (0177uL << FSHIFT)        /* 128 distinct fonts */
          257 #define        SFMASK                (SMASK|FMASK)        /* size and font in a Tchar */
          258 #define        sbits(n)        (((n) >> SSHIFT) & 0177)
          259 #define        fbits(n)        (((n) >> FSHIFT) & 0177)
          260 #define        sfbits(n)        (((n) & SFMASK) >> FSHIFT)
          261 #define        cbits(n)        ((n) & 0x1FFFF)                /* isolate character bits,  */
          262                                                 /* but don't include motions */
          263 extern        int        realcbits(Tchar);
          264 
          265 #define        setsbits(n,s)        n = (n & ~SMASK) | (Tchar)(s) << SSHIFT
          266 #define        setfbits(n,f)        n = (n & ~FMASK) | (Tchar)(f) << FSHIFT
          267 #define        setsfbits(n,sf)        n = (n & ~SFMASK) | (Tchar)(sf) << FSHIFT
          268 #define        setcbits(n,c)        n = (n & ~0xFFFFuL | (c))        /* set character bits */
          269 
          270 #define        BYTEMASK 0377
          271 #define        BYTE         8
          272 
          273 #define        SHORTMASK 0XFFFF
          274 #define        SHORT         16
          275 
          276 #define        TABMASK         ((unsigned) INT_MAX >> 1)
          277 #define        RTAB        ((TABMASK << 1) & ~TABMASK)
          278 #define        CTAB        (RTAB << 1)
          279 
          280 #define        TABBIT        02                /* bits in gchtab */
          281 #define        LDRBIT        04
          282 #define        FCBIT        010
          283 
          284 #define        PAIR(A,B)        (A|(B<<SHORT))
          285 
          286 
          287 extern        int        Inch, Hor, Vert, Unitwidth;
          288 
          289 struct        Spnames
          290 {
          291         int        *n;
          292         char        *v;
          293 };
          294 
          295 extern        Spnames        spnames[];
          296 
          297 /*
          298         String and macro definitions are stored conceptually in a giant array
          299         indexed by type Offset.  In olden times, this array was real, and thus
          300         both huge and limited in size, leading to the "Out of temp file space"
          301         error.  In this version, the array is represented by a list of blocks,
          302         pointed to by blist[].bp.  Each block is of size BLK Tchars, and BLK
          303         MUST be a power of 2 for the macros below to work.
          304         
          305         The blocks associated with a particular string or macro are chained
          306         together in the array blist[].  Each blist[i].nextoff contains the
          307         Offset associated with the next block in the giant array, or -1 if
          308         this is the last block in the chain.  If .nextoff is 0, the block is
          309         free.
          310         
          311         To find the right index in blist for an Offset, divide by BLK.
          312 */
          313 
          314 #define        NBLIST        2048        /* starting number of blocks in all definitions */
          315 
          316 #define        BLK        128        /* number of Tchars in a block; must be 2^N with defns below */
          317 
          318 #define        rbf0(o)                (blist[bindex(o)].bp[boffset(o)])
          319 #define        bindex(o)        ((o) / BLK)
          320 #define        boffset(o)        ((o) & (BLK-1))
          321 #define        pastend(o)        (((o) & (BLK-1)) == 0)
          322 /* #define        incoff(o)        ( (++o & (BLK-1)) ? o : blist[bindex(o-1)].nextoff ) */
          323 #define        incoff(o)        ( (((o)+1) & (BLK-1)) ? o+1 : blist[bindex(o)].nextoff )
          324 
          325 #define        skipline(f)        while (getc(f) != '\n')
          326 #define is(s)                (strcmp(cmd, s) == 0)
          327 #define        eq(s1, s2)        (strcmp(s1, s2) == 0)
          328 
          329 
          330 typedef        unsigned long        Offset;                /* an offset in macro/string storage */
          331 
          332 struct Blockp {                /* info about a block: */
          333         Tchar        *bp;                /* the data */
          334         Offset        nextoff;        /* offset of next block in a chain */
          335 };
          336 
          337 extern        Blockp        *blist;
          338 
          339 #define        RD_OFFSET        (1 * BLK)        /* .rd command uses block 1 */
          340 
          341 struct Diver {                /* diversion */
          342         Offset        op;
          343         int        dnl;
          344         int        dimac;
          345         int        ditrap;
          346         int        ditf;
          347         int        alss;
          348         int        blss;
          349         int        nls;
          350         int        mkline;
          351         int        maxl;
          352         int        hnl;
          353         int        curd;
          354 };
          355 
          356 struct Stack {                /* stack frame */
          357         int        nargs;
          358         Stack        *pframe;
          359         Offset        pip;
          360         int        pnchar;
          361         Tchar        prchar;
          362         int        ppendt;
          363         Tchar        pch;
          364         Tchar        *lastpbp;
          365         int        mname;
          366 };
          367 
          368 extern        Stack        s;
          369 
          370 struct Divsiz {
          371         int dix;
          372         int diy;
          373 };
          374 
          375 struct Contab {                /* command or macro */
          376         unsigned int        rq;
          377         Contab        *link;
          378         void        (*f)(void);
          379         Offset        mx;
          380         Offset        emx;
          381         Divsiz        *divsiz;
          382 };
          383 
          384 #define        C(a,b)        {a, 0, b, 0, 0}                /* how to initialize a contab entry */
          385 
          386 extern        Contab        contab[NM];
          387 
          388 struct Numtab {        /* number registers */
          389         unsigned int        r;                /* name */
          390         int        val;
          391         short        fmt;
          392         short        inc;
          393         Numtab        *link;
          394 };
          395 
          396 extern        Numtab        numtab[NN];
          397 
          398 #define        PN        0
          399 #define        NL        1
          400 #define        YR        2
          401 #define        HP        3
          402 #define        CT        4
          403 #define        DN        5
          404 #define        MO        6
          405 #define        DY        7
          406 #define        DW        8
          407 #define        LN        9
          408 #define        DL        10
          409 #define        ST        11
          410 #define        SB        12
          411 #define        CD        13
          412 #define        PID        14
          413 
          414 struct        Wcache {        /* width cache, indexed by character */
          415         short        fontpts;
          416         short        width;
          417 };
          418 
          419 struct        Tbuf {                /* growable Tchar buffer */
          420         Tchar *_bufp;
          421         unsigned int _size;
          422 };
          423 
          424 /* the infamous environment block */
          425 
          426 #define        ics        envp->_ics
          427 #define        sps        envp->_sps
          428 #define        spacesz        envp->_spacesz
          429 #define        lss        envp->_lss
          430 #define        lss1        envp->_lss1
          431 #define        ll        envp->_ll
          432 #define        ll1        envp->_ll1
          433 #define        lt        envp->_lt
          434 #define        lt1        envp->_lt1
          435 #define        ic        envp->_ic
          436 #define        icf        envp->_icf
          437 #define        chbits        envp->_chbits
          438 #define        spbits        envp->_spbits
          439 #define        nmbits        envp->_nmbits
          440 #define        apts        envp->_apts
          441 #define        apts1        envp->_apts1
          442 #define        pts        envp->_pts
          443 #define        pts1        envp->_pts1
          444 #define        font        envp->_font
          445 #define        font1        envp->_font1
          446 #define        ls        envp->_ls
          447 #define        ls1        envp->_ls1
          448 #define        ad        envp->_ad
          449 #define        nms        envp->_nms
          450 #define        ndf        envp->_ndf
          451 #define        nmwid        envp->_nmwid
          452 #define        fi        envp->_fi
          453 #define        cc        envp->_cc
          454 #define        c2        envp->_c2
          455 #define        ohc        envp->_ohc
          456 #define        tdelim        envp->_tdelim
          457 #define        hyf        envp->_hyf
          458 #define        hyoff        envp->_hyoff
          459 #define        hyphalg        envp->_hyphalg
          460 #define        un1        envp->_un1
          461 #define        tabc        envp->_tabc
          462 #define        dotc        envp->_dotc
          463 #define        adsp        envp->_adsp
          464 #define        adrem        envp->_adrem
          465 #define        lastl        envp->_lastl
          466 #define        nel        envp->_nel
          467 #define        admod        envp->_admod
          468 #define        wordp        envp->_wordp
          469 #define        spflg        envp->_spflg
          470 #define        linep        envp->_linep
          471 #define        wdend        envp->_wdend
          472 #define        wdstart        envp->_wdstart
          473 #define        wne        envp->_wne
          474 #define        ne        envp->_ne
          475 #define        nc        envp->_nc
          476 #define        nb        envp->_nb
          477 #define        lnmod        envp->_lnmod
          478 #define        nwd        envp->_nwd
          479 #define        nn        envp->_nn
          480 #define        ni        envp->_ni
          481 #define        ul        envp->_ul
          482 #define        cu        envp->_cu
          483 #define        ce        envp->_ce
          484 #define        in        envp->_in
          485 #define        in1        envp->_in1
          486 #define        un        envp->_un
          487 #define        wch        envp->_wch
          488 #define        pendt        envp->_pendt
          489 #define        pendw        envp->_pendw
          490 #define        pendnf        envp->_pendnf
          491 #define        spread        envp->_spread
          492 #define        it        envp->_it
          493 #define        itmac        envp->_itmac
          494 #define        hyptr        envp->_hyptr
          495 #define        tabtab        envp->_tabtab
          496 #define        line        envp->_line._bufp
          497 #define        lnsize        envp->_line._size
          498 #define        word        envp->_word._bufp
          499 #define wdsize        envp->_word._size
          500 
          501 #define oline        _oline._bufp
          502 #define olnsize        _oline._size
          503 
          504 /*
          505  * Note:
          506  * If this structure changes in ni.c, you must change
          507  * this as well, and vice versa.
          508  */
          509 
          510 struct Env {
          511         int        _ics;
          512         int        _sps;
          513         int        _spacesz;
          514         int        _lss;
          515         int        _lss1;
          516         int        _ll;
          517         int        _ll1;
          518         int        _lt;
          519         int        _lt1;
          520         Tchar        _ic;
          521         int        _icf;
          522         Tchar        _chbits;
          523         Tchar        _spbits;
          524         Tchar        _nmbits;
          525         int        _apts;
          526         int        _apts1;
          527         int        _pts;
          528         int        _pts1;
          529         int        _font;
          530         int        _font1;
          531         int        _ls;
          532         int        _ls1;
          533         int        _ad;
          534         int        _nms;
          535         int        _ndf;
          536         int        _nmwid;
          537         int        _fi;
          538         int        _cc;
          539         int        _c2;
          540         int        _ohc;
          541         int        _tdelim;
          542         int        _hyf;
          543         int        _hyoff;
          544         int        _hyphalg;
          545         int        _un1;
          546         int        _tabc;
          547         int        _dotc;
          548         int        _adsp;
          549         int        _adrem;
          550         int        _lastl;
          551         int        _nel;
          552         int        _admod;
          553         Tchar        *_wordp;
          554         int        _spflg;
          555         Tchar        *_linep;
          556         Tchar        *_wdend;
          557         Tchar        *_wdstart;
          558         int        _wne;
          559         int        _ne;
          560         int        _nc;
          561         int        _nb;
          562         int        _lnmod;
          563         int        _nwd;
          564         int        _nn;
          565         int        _ni;
          566         int        _ul;
          567         int        _cu;
          568         int        _ce;
          569         int        _in;
          570         int        _in1;
          571         int        _un;
          572         int        _wch;
          573         int        _pendt;
          574         Tchar        *_pendw;
          575         int        _pendnf;
          576         int        _spread;
          577         int        _it;
          578         int        _itmac;
          579         Tchar        *_hyptr[NHYP];
          580         long        _tabtab[NTAB];
          581         Tbuf        _line;
          582         Tbuf        _word;
          583 };
          584 
          585 extern        Env        env[];
          586 extern        Env        *envp;
          587 
          588 enum {        MBchar = 'U', Troffchar = 'C', Number = 'N', Install = 'i', Lookup = 'l' };
          589         /* U => utf, for instance;  C => \(xx, N => \N'...' */
          590 
          591 
          592 
          593 struct Chwid {        /* data on one character */
          594         Ushort        num;                /* character number:
          595                                         0 -> not on this font
          596                                         >= ALPHABET -> its number among all Cxy's */
          597         Ushort        code;                /* char code for actual device.  used for \N */
          598         char        *str;                /* code string for nroff */
          599         Uchar        wid;                /* width */
          600         Uchar        kern;                /* ascender/descender */
          601 };
          602 
          603 struct Font {        /* characteristics of a font */
          604         int        name;                /* int name, e.g., BI (2 chars) */
          605         char        longname[64];        /* long name of this font (e.g., "Bembo" */
          606         char        *truename;        /* path name of table if not in standard place */
          607         int        nchars;                /* number of width entries for this font */
          608         char        specfont;        /* 1 == special font */
          609         int        spacewidth;        /* width of space on this font */
          610         int        defaultwidth;        /* default width of characters on this font */
          611         Chwid        *wp;                /* widths, etc., of the real characters */
          612         char        ligfont;        /* 1 == ligatures exist on this font */
          613 };
          614 
          615 /* ligatures, ORed into ligfont */
          616 
          617 #define        LFF        01
          618 #define        LFI        02
          619 #define        LFL        04
          620 #define        LFFI        010
          621 #define        LFFL        020
          622 
          623 /* tracing modes */
          624 #define TRNARGS        01                /* trace legality of numeric arguments */
          625 #define TRREQ        02                /* trace requests */
          626 #define TRMAC        04                /* trace macros */
          627 #define RQERR        01                /* processing request/macro */
          628 
          629 /* typewriter driving table structure */
          630 
          631 
          632 extern        Term        t;
          633 struct Term {
          634         int        bset;                /* these bits have to be on */
          635         int        breset;                /* these bits have to be off */
          636         int        Hor;                /* #units in minimum horiz motion */
          637         int        Vert;                /* #units in minimum vert motion */
          638         int        Newline;        /* #units in single line space */
          639         int        Char;                /* #units in character width */
          640         int        Em;                /* ditto */
          641         int        Halfline;        /* half line units */
          642         int        Adj;                /* minimum units for horizontal adjustment */
          643         char        *twinit;        /* initialize terminal */
          644         char        *twrest;        /* reinitialize terminal */
          645         char        *twnl;                /* terminal sequence for newline */
          646         char        *hlr;                /* half-line reverse */
          647         char        *hlf;                /* half-line forward */
          648         char        *flr;                /* full-line reverse */
          649         char        *bdon;                /* turn bold mode on */
          650         char        *bdoff;                /* turn bold mode off */
          651         char        *iton;                /* turn italic mode on */
          652         char        *itoff;                /* turn italic mode off */
          653         char        *ploton;        /* turn plot mode on */
          654         char        *plotoff;        /* turn plot mode off */
          655         char        *up;                /* sequence to move up in plot mode */
          656         char        *down;                /* ditto */
          657         char        *right;                /* ditto */
          658         char        *left;                /* ditto */
          659 
          660         Font        tfont;                /* widths and other info, as in a troff font */
          661 };
          662 
          663 extern        Term        t;
          664 
          665 /*
          666  * for error reporting; keep track of escapes/requests with numeric arguments
          667  */
          668 struct Numerr {
          669         char        type;        /* request or escape? */
          670         char        esc;        /* was escape sequence named esc */
          671         char        escarg;        /* argument of esc's like \D'l' */
          672         unsigned int        req;        /* was request or macro named req */
          673 };