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