1*14f51593SDavid du Colombier #define _BSD_EXTENSION 2*14f51593SDavid du Colombier #define _POSIX_SOURCE 3*14f51593SDavid du Colombier 43e12c5d1SDavid du Colombier #include <stdio.h> 53e12c5d1SDavid du Colombier #include <stdlib.h> 6*14f51593SDavid du Colombier #include <unistd.h> 7219b2ee8SDavid du Colombier #include <limits.h> 83e12c5d1SDavid du Colombier #include <ctype.h> 93e12c5d1SDavid du Colombier #include <string.h> 103e12c5d1SDavid du Colombier 113e12c5d1SDavid du Colombier #define NROFF (!TROFF) 123e12c5d1SDavid du Colombier 133e12c5d1SDavid du Colombier 143e12c5d1SDavid du Colombier /* Site dependent definitions */ 153e12c5d1SDavid du Colombier 163e12c5d1SDavid du Colombier #ifndef TMACDIR 17219b2ee8SDavid du Colombier #define TMACDIR "lib/tmac/tmac." 183e12c5d1SDavid du Colombier #endif 193e12c5d1SDavid du Colombier #ifndef FONTDIR 20219b2ee8SDavid du Colombier #define FONTDIR "lib/font" 213e12c5d1SDavid du Colombier #endif 223e12c5d1SDavid du Colombier #ifndef NTERMDIR 23219b2ee8SDavid du Colombier #define NTERMDIR "lib/term/tab." 243e12c5d1SDavid du Colombier #endif 253e12c5d1SDavid du Colombier #ifndef TDEVNAME 26219b2ee8SDavid du Colombier #define TDEVNAME "post" 273e12c5d1SDavid du Colombier #endif 283e12c5d1SDavid du Colombier #ifndef NDEVNAME 293e12c5d1SDavid du Colombier #define NDEVNAME "37" 303e12c5d1SDavid du Colombier #endif 313e12c5d1SDavid du Colombier #ifndef TEXHYPHENS 323e12c5d1SDavid du Colombier #define TEXHYPHENS "/usr/lib/tex/macros/hyphen.tex" 333e12c5d1SDavid du Colombier #endif 34219b2ee8SDavid du Colombier #ifndef ALTHYPHENS 35219b2ee8SDavid du Colombier #define ALTHYPHENS "lib/tmac/hyphen.tex" /* another place to look */ 36219b2ee8SDavid du Colombier #endif 373e12c5d1SDavid du Colombier 38219b2ee8SDavid du Colombier typedef unsigned char Uchar; 39219b2ee8SDavid du Colombier typedef unsigned short Ushort; 403e12c5d1SDavid du Colombier 413e12c5d1SDavid du Colombier typedef /*unsigned*/ long Tchar; 423e12c5d1SDavid du Colombier 433e12c5d1SDavid du Colombier typedef struct Blockp Blockp; 443e12c5d1SDavid du Colombier typedef struct Diver Diver; 453e12c5d1SDavid du Colombier typedef struct Stack Stack; 46219b2ee8SDavid du Colombier typedef struct Divsiz Divsiz; 473e12c5d1SDavid du Colombier typedef struct Contab Contab; 483e12c5d1SDavid du Colombier typedef struct Numtab Numtab; 49219b2ee8SDavid du Colombier typedef struct Numerr Numerr; 503e12c5d1SDavid du Colombier typedef struct Env Env; 513e12c5d1SDavid du Colombier typedef struct Term Term; 523e12c5d1SDavid du Colombier typedef struct Chwid Chwid; 533e12c5d1SDavid du Colombier typedef struct Font Font; 543e12c5d1SDavid du Colombier typedef struct Spnames Spnames; 553e12c5d1SDavid du Colombier typedef struct Wcache Wcache; 56219b2ee8SDavid du Colombier typedef struct Tbuf Tbuf; 573e12c5d1SDavid du Colombier 583e12c5d1SDavid du Colombier /* this simulates printf into a buffer that gets flushed sporadically */ 593e12c5d1SDavid du Colombier /* the BSD goo is because SunOS sprintf doesn't return anything useful */ 603e12c5d1SDavid du Colombier 613e12c5d1SDavid du Colombier #ifdef BSD4_2 623e12c5d1SDavid du Colombier #define OUT (obufp += strlen(sprintf(obufp, 633e12c5d1SDavid du Colombier #define PUT ))) > obuf+BUFSIZ ? flusho() : 1 643e12c5d1SDavid du Colombier #else 653e12c5d1SDavid du Colombier #define OUT (obufp += sprintf(obufp, 663e12c5d1SDavid du Colombier #define PUT )) > obuf+BUFSIZ ? flusho() : 1 673e12c5d1SDavid du Colombier #endif 683e12c5d1SDavid du Colombier 693e12c5d1SDavid du Colombier #define oputs(a) OUT "%s", a PUT 703e12c5d1SDavid du Colombier #define oput(c) ( *obufp++ = (c), obufp > obuf+BUFSIZ ? flusho() : 1 ) 713e12c5d1SDavid du Colombier 723e12c5d1SDavid du Colombier extern char errbuf[]; 733e12c5d1SDavid du Colombier #define ERROR sprintf(errbuf, 743e12c5d1SDavid du Colombier #define WARN ), errprint() 753e12c5d1SDavid du Colombier #define FATAL ), errprint(), exit(1) 763e12c5d1SDavid du Colombier 773e12c5d1SDavid du Colombier /* starting values for typesetting parameters: */ 783e12c5d1SDavid du Colombier 793e12c5d1SDavid du Colombier #define PS 10 /* default point size */ 803e12c5d1SDavid du Colombier #define FT 1 /* default font position */ 813e12c5d1SDavid du Colombier #define ULFONT 2 /* default underline font */ 823e12c5d1SDavid du Colombier #define BDFONT 3 /* default emboldening font */ 833e12c5d1SDavid du Colombier #define BIFONT 4 /* default bold italic font */ 843e12c5d1SDavid du Colombier #define LL (unsigned) 65*INCH/10 /* line length; 39picas=6.5in */ 853e12c5d1SDavid du Colombier #define VS ((12*INCH)/72) /* initial vert space */ 863e12c5d1SDavid du Colombier 873e12c5d1SDavid du Colombier 883e12c5d1SDavid du Colombier #define EMPTS(pts) (((long)Inch*(pts) + 36) / 72) 893e12c5d1SDavid du Colombier #define EM (TROFF? EMPTS(pts): t.Em) 903e12c5d1SDavid du Colombier #define INCH (TROFF? Inch: 240) 913e12c5d1SDavid du Colombier #define HOR (TROFF? Hor: t.Adj) 923e12c5d1SDavid du Colombier #define VERT (TROFF? Vert: t.Vert) 933e12c5d1SDavid du Colombier #define PO (TROFF? Inch: 0) 943e12c5d1SDavid du Colombier #define SPS (TROFF? EMPTS(pts)/3: INCH/10) 953e12c5d1SDavid du Colombier #define SS (TROFF? 12: INCH/10) 963e12c5d1SDavid du Colombier #define ICS (TROFF? EMPTS(pts): 2*INCH/10) 973e12c5d1SDavid du Colombier #define DTAB (TROFF? (INCH/2): 0) 983e12c5d1SDavid du Colombier 993e12c5d1SDavid du Colombier /* These "characters" are used to encode various internal functions 1003e12c5d1SDavid du Colombier /* Some make use of the fact that most ascii characters between 1013e12c5d1SDavid du Colombier /* 0 and 040 don't have any graphic or other function. 1023e12c5d1SDavid du Colombier /* The few that do have a purpose (e.g., \n, \b, \t, ... 1033e12c5d1SDavid du Colombier /* are avoided by the ad hoc choices here. 1043e12c5d1SDavid du Colombier /* See ifilt[] in n1.c for others -- 1, 2, 3, 5, 6, 7, 010, 011, 012 1053e12c5d1SDavid du Colombier */ 1063e12c5d1SDavid du Colombier 1073e12c5d1SDavid du Colombier #define LEADER 001 1083e12c5d1SDavid du Colombier #define IMP 004 /* impossible char; glues things together */ 1093e12c5d1SDavid du Colombier #define TAB 011 1103e12c5d1SDavid du Colombier #define RPT 014 /* next character is to be repeated many times */ 1113e12c5d1SDavid du Colombier #define CHARHT 015 /* size field sets character height */ 1123e12c5d1SDavid du Colombier #define SLANT 016 /* size field sets amount of slant */ 1133e12c5d1SDavid du Colombier #define DRAWFCN 017 /* next several chars describe arb drawing fcns */ 1143e12c5d1SDavid du Colombier # define DRAWLINE 'l' /* line: 'l' dx dy char */ 1153e12c5d1SDavid du Colombier # define DRAWCIRCLE 'c' /* circle: 'c' r */ 1163e12c5d1SDavid du Colombier # define DRAWELLIPSE 'e' /* ellipse: 'e' rx ry */ 1173e12c5d1SDavid du Colombier # define DRAWARC 'a' /* arc: 'a' dx dy dx dy */ 1183e12c5d1SDavid du Colombier # define DRAWSPLINE '~' /* quadratic B spline: '~' dx dy dx dy ... */ 1193e12c5d1SDavid du Colombier /* other splines go thru too */ 1203e12c5d1SDavid du Colombier /* NOTE: the use of ~ is a botch since it's often used in .tr commands */ 1213e12c5d1SDavid du Colombier /* better to use a letter like s, but change it in the postprocessors too */ 1223e12c5d1SDavid du Colombier /* for now, this is taken care of in n9.c and t10.c */ 1233e12c5d1SDavid du Colombier # define DRAWBUILD 'b' /* built-up character (e.g., { */ 1243e12c5d1SDavid du Colombier 1253e12c5d1SDavid du Colombier #define LEFT 020 /* \{ */ 1263e12c5d1SDavid du Colombier #define RIGHT 021 /* \} */ 1273e12c5d1SDavid du Colombier #define FILLER 022 /* \& and similar purposes */ 1283e12c5d1SDavid du Colombier #define XON 023 /* \X'...' starts here */ 1293e12c5d1SDavid du Colombier #define OHC 024 /* optional hyphenation character \% */ 1303e12c5d1SDavid du Colombier #define CONT 025 /* \c character */ 1313e12c5d1SDavid du Colombier #define PRESC 026 /* printable escape */ 1323e12c5d1SDavid du Colombier #define UNPAD 027 /* unpaddable blank */ 1333e12c5d1SDavid du Colombier #define XPAR 030 /* transparent mode indicator */ 1343e12c5d1SDavid du Colombier #define FLSS 031 /* next Tchar contains vertical space */ 1353e12c5d1SDavid du Colombier /* used when recalling diverted text */ 1363e12c5d1SDavid du Colombier #define WORDSP 032 /* paddable word space */ 1373e12c5d1SDavid du Colombier #define ESC 033 /* current escape character */ 1383e12c5d1SDavid du Colombier #define XOFF 034 /* \X'...' ends here */ 1393e12c5d1SDavid du Colombier /* matches XON, but they will probably never nest */ 1403e12c5d1SDavid du Colombier /* so could drop this when another control is needed */ 1413e12c5d1SDavid du Colombier #define HX 035 /* next character is value of \x'...' */ 1423e12c5d1SDavid du Colombier #define MOTCH 036 /* this "character" is really motion; used by cbits() */ 1433e12c5d1SDavid du Colombier 1443e12c5d1SDavid du Colombier #define HYPHEN c_hyphen 1453e12c5d1SDavid du Colombier #define EMDASH c_emdash /* \(em */ 1463e12c5d1SDavid du Colombier #define RULE c_rule /* \(ru */ 1473e12c5d1SDavid du Colombier #define MINUS c_minus /* minus sign on current font */ 1483e12c5d1SDavid du Colombier #define LIG_FI c_fi /* \(ff */ 1493e12c5d1SDavid du Colombier #define LIG_FL c_fl /* \(fl */ 1503e12c5d1SDavid du Colombier #define LIG_FF c_ff /* \(ff */ 1513e12c5d1SDavid du Colombier #define LIG_FFI c_ffi /* \(Fi */ 1523e12c5d1SDavid du Colombier #define LIG_FFL c_ffl /* \(Fl */ 1533e12c5d1SDavid du Colombier #define ACUTE c_acute /* acute accent \(aa */ 1543e12c5d1SDavid du Colombier #define GRAVE c_grave /* grave accent \(ga */ 1553e12c5d1SDavid du Colombier #define UNDERLINE c_under /* \(ul */ 1563e12c5d1SDavid du Colombier #define ROOTEN c_rooten /* root en \(rn */ 1573e12c5d1SDavid du Colombier #define BOXRULE c_boxrule /* box rule \(br */ 1583e12c5d1SDavid du Colombier #define LEFTHAND c_lefthand /* left hand for word overflow */ 1593e12c5d1SDavid du Colombier #define DAGGER c_dagger /* dagger for end of sentence/footnote */ 1603e12c5d1SDavid du Colombier 1613e12c5d1SDavid du Colombier #define HYPHALG 1 /* hyphenation algorithm: 0=>good old troff, 1=>tex */ 1623e12c5d1SDavid du Colombier 1633e12c5d1SDavid du Colombier 1643e12c5d1SDavid du Colombier /* array sizes, and similar limits: */ 1653e12c5d1SDavid du Colombier 1663e12c5d1SDavid du Colombier #define MAXFONTS 99 /* Maximum number of fonts in fontab */ 167219b2ee8SDavid du Colombier #define NM 90 /* requests + macros */ 168219b2ee8SDavid du Colombier #define NN NNAMES /* number registers */ 1693e12c5d1SDavid du Colombier #define NNAMES 15 /* predefined reg names */ 1703e12c5d1SDavid du Colombier #define NIF 15 /* if-else nesting */ 1713e12c5d1SDavid du Colombier #define NS 128 /* name buffer */ 172219b2ee8SDavid du Colombier #define NTM 1024 /* tm buffer */ 1733e12c5d1SDavid du Colombier #define NEV 3 /* environments */ 1743e12c5d1SDavid du Colombier #define EVLSZ 10 /* size of ev stack */ 1753e12c5d1SDavid du Colombier 1763039af76SDavid du Colombier #define STACKSIZE (12*1024) /* stack for macros and strings in progress */ 1773e12c5d1SDavid du Colombier #define NHYP 10 /* max hyphens per word */ 1783e12c5d1SDavid du Colombier #define NHEX 512 /* byte size of exception word list */ 179219b2ee8SDavid du Colombier #define NTAB 100 /* tab stops */ 1803e12c5d1SDavid du Colombier #define NSO 5 /* "so" depth */ 1813e12c5d1SDavid du Colombier #define NMF 5 /* number of -m flags */ 182219b2ee8SDavid du Colombier #define WDSIZE 500 /* word buffer click size */ 183219b2ee8SDavid du Colombier #define LNSIZE 4000 /* line buffer click size */ 184219b2ee8SDavid du Colombier #define OLNSIZE 5000 /* output line buffer click; bigger for 'w', etc. */ 1853e12c5d1SDavid du Colombier #define NDI 5 /* number of diversions */ 1863e12c5d1SDavid du Colombier 1873e12c5d1SDavid du Colombier #define ALPHABET alphabet /* number of characters in basic alphabet. */ 1883e12c5d1SDavid du Colombier /* 128 for parochial USA 7-bit ascii, */ 1893e12c5d1SDavid du Colombier /* 256 for "European" mode with e.g., Latin-1 */ 1903e12c5d1SDavid du Colombier 1913e12c5d1SDavid du Colombier /* NCHARS must be greater than 1923e12c5d1SDavid du Colombier ALPHABET (ascii stuff) + total number of distinct char names 1933e12c5d1SDavid du Colombier from all fonts that will be run in this job (including 1943e12c5d1SDavid du Colombier unnamed ones and \N's) 1953e12c5d1SDavid du Colombier */ 1963e12c5d1SDavid du Colombier 1973e12c5d1SDavid du Colombier #define NCHARS (8*1024) /* maximum size of troff character set*/ 1983e12c5d1SDavid du Colombier 1993e12c5d1SDavid du Colombier 2003e12c5d1SDavid du Colombier /* However for nroff you want only : 2013e12c5d1SDavid du Colombier 1. number of special codes in charset of DESC, which ends up being the 2023e12c5d1SDavid du Colombier value of nchtab and which must be less than 512. 2033e12c5d1SDavid du Colombier 2. ALPHABET, which apparently is the size of the portion of the tables reserved 2043e12c5d1SDavid du Colombier for special control symbols 2053e12c5d1SDavid du Colombier Apparently the max N of \N is irrelevant; */ 2063e12c5d1SDavid du Colombier /* to allow \N of up to 254 with up to 338 special characters 2073e12c5d1SDavid du Colombier you need NCHARS of 338 + ALPHABET = 466 */ 2083e12c5d1SDavid du Colombier 209219b2ee8SDavid du Colombier #define NROFFCHARS 1024 /* maximum size of nroff character set */ 2103e12c5d1SDavid du Colombier 2113e12c5d1SDavid du Colombier #define NTRTAB NCHARS /* number of items in trtab[] */ 2123e12c5d1SDavid du Colombier #define NWIDCACHE NCHARS /* number of items in widcache[] */ 2133e12c5d1SDavid du Colombier 2143e12c5d1SDavid du Colombier #define NTRAP 20 /* number of traps */ 2153e12c5d1SDavid du Colombier #define NPN 20 /* numbers in "-o" */ 2163e12c5d1SDavid du Colombier #define FBUFSZ 512 /* field buf size words */ 2173e12c5d1SDavid du Colombier #define IBUFSZ 4096 /* bytes */ 2183e12c5d1SDavid du Colombier #define NC 1024 /* cbuf size words */ 2193e12c5d1SDavid du Colombier #define NOV 10 /* number of overstrike chars */ 2203e12c5d1SDavid du Colombier #define NPP 10 /* pads per field */ 2213e12c5d1SDavid du Colombier 2223e12c5d1SDavid du Colombier /* 2233e12c5d1SDavid du Colombier Internal character representation: 2243e12c5d1SDavid du Colombier Internally, every character is carried around as 2253e12c5d1SDavid du Colombier a 32 bit cookie, called a "Tchar" (typedef long). 2263e12c5d1SDavid du Colombier Bits are numbered 31..0 from left to right. 2273e12c5d1SDavid du Colombier If bit 15 is 1, the character is motion, with 2283e12c5d1SDavid du Colombier if bit 16 it's vertical motion 2293e12c5d1SDavid du Colombier if bit 17 it's negative motion 2303e12c5d1SDavid du Colombier If bit 15 is 0, the character is a real character. 2313e12c5d1SDavid du Colombier if bit 31 zero motion 2323e12c5d1SDavid du Colombier bits 30..24 size 2333e12c5d1SDavid du Colombier bits 23..16 font 2343e12c5d1SDavid du Colombier */ 2353e12c5d1SDavid du Colombier 2363e12c5d1SDavid du Colombier /* in the following, "L" should really be a Tchar, but ... */ 2373e12c5d1SDavid du Colombier /* numerology leaves room for 16 bit chars */ 2383e12c5d1SDavid du Colombier 2393e12c5d1SDavid du Colombier #define MOT (01uL << 16) /* motion character indicator */ 2403e12c5d1SDavid du Colombier #define VMOT (01uL << 30) /* vertical motion bit */ 2413e12c5d1SDavid du Colombier #define NMOT (01uL << 29) /* negative motion indicator */ 2423e12c5d1SDavid du Colombier /* #define MOTV (MOT|VMOT|NMOT) /* motion flags */ 2433e12c5d1SDavid du Colombier /* #define MAXMOT (~MOTV) /* maximum motion permitted */ 2443e12c5d1SDavid du Colombier #define MAXMOT 0xFFFF 2453e12c5d1SDavid du Colombier 2463e12c5d1SDavid du Colombier #define ismot(n) ((n) & MOT) 2473e12c5d1SDavid du Colombier #define isvmot(n) (((n) & (MOT|VMOT)) == (MOT|VMOT)) /* must have tested MOT previously */ 2483e12c5d1SDavid du Colombier #define isnmot(n) (((n) & (MOT|NMOT)) == (MOT|NMOT)) /* ditto */ 2493e12c5d1SDavid du Colombier #define absmot(n) ((n) & 0xFFFF) 2503e12c5d1SDavid du Colombier 2513e12c5d1SDavid du Colombier #define ZBIT (01uL << 31) /* zero width char */ 2523e12c5d1SDavid du Colombier #define iszbit(n) ((n) & ZBIT) 2533e12c5d1SDavid du Colombier 2543e12c5d1SDavid du Colombier #define FSHIFT 17 2553e12c5d1SDavid du Colombier #define SSHIFT (FSHIFT+7) 2563e12c5d1SDavid du Colombier #define SMASK (0177uL << SSHIFT) /* 128 distinct sizes */ 2573e12c5d1SDavid du Colombier #define FMASK (0177uL << FSHIFT) /* 128 distinct fonts */ 2583e12c5d1SDavid du Colombier #define SFMASK (SMASK|FMASK) /* size and font in a Tchar */ 2593e12c5d1SDavid du Colombier #define sbits(n) (((n) >> SSHIFT) & 0177) 2603e12c5d1SDavid du Colombier #define fbits(n) (((n) >> FSHIFT) & 0177) 2613e12c5d1SDavid du Colombier #define sfbits(n) (((n) & SFMASK) >> FSHIFT) 2623e12c5d1SDavid du Colombier #define cbits(n) ((n) & 0x1FFFF) /* isolate character bits, */ 2633e12c5d1SDavid du Colombier /* but don't include motions */ 2643e12c5d1SDavid du Colombier extern int realcbits(Tchar); 2653e12c5d1SDavid du Colombier 2663e12c5d1SDavid du Colombier #define setsbits(n,s) n = (n & ~SMASK) | (Tchar)(s) << SSHIFT 2673e12c5d1SDavid du Colombier #define setfbits(n,f) n = (n & ~FMASK) | (Tchar)(f) << FSHIFT 2683e12c5d1SDavid du Colombier #define setsfbits(n,sf) n = (n & ~SFMASK) | (Tchar)(sf) << FSHIFT 2693e12c5d1SDavid du Colombier #define setcbits(n,c) n = (n & ~0xFFFFuL | (c)) /* set character bits */ 2703e12c5d1SDavid du Colombier 2713e12c5d1SDavid du Colombier #define BYTEMASK 0377 2723e12c5d1SDavid du Colombier #define BYTE 8 2733e12c5d1SDavid du Colombier 274219b2ee8SDavid du Colombier #define SHORTMASK 0XFFFF 275219b2ee8SDavid du Colombier #define SHORT 16 276219b2ee8SDavid du Colombier 277219b2ee8SDavid du Colombier #define TABMASK ((unsigned) INT_MAX >> 1) 278219b2ee8SDavid du Colombier #define RTAB ((TABMASK << 1) & ~TABMASK) 279219b2ee8SDavid du Colombier #define CTAB (RTAB << 1) 2803e12c5d1SDavid du Colombier 2813e12c5d1SDavid du Colombier #define TABBIT 02 /* bits in gchtab */ 2823e12c5d1SDavid du Colombier #define LDRBIT 04 2833e12c5d1SDavid du Colombier #define FCBIT 010 2843e12c5d1SDavid du Colombier 285219b2ee8SDavid du Colombier #define PAIR(A,B) (A|(B<<SHORT)) 2863e12c5d1SDavid du Colombier 2873e12c5d1SDavid du Colombier 2883e12c5d1SDavid du Colombier extern int Inch, Hor, Vert, Unitwidth; 2893e12c5d1SDavid du Colombier 2903e12c5d1SDavid du Colombier struct Spnames 2913e12c5d1SDavid du Colombier { 2923e12c5d1SDavid du Colombier int *n; 2933e12c5d1SDavid du Colombier char *v; 2943e12c5d1SDavid du Colombier }; 2953e12c5d1SDavid du Colombier 2963e12c5d1SDavid du Colombier extern Spnames spnames[]; 2973e12c5d1SDavid du Colombier 2983e12c5d1SDavid du Colombier /* 2993e12c5d1SDavid du Colombier String and macro definitions are stored conceptually in a giant array 3003e12c5d1SDavid du Colombier indexed by type Offset. In olden times, this array was real, and thus 3013e12c5d1SDavid du Colombier both huge and limited in size, leading to the "Out of temp file space" 3023e12c5d1SDavid du Colombier error. In this version, the array is represented by a list of blocks, 3033e12c5d1SDavid du Colombier pointed to by blist[].bp. Each block is of size BLK Tchars, and BLK 3043e12c5d1SDavid du Colombier MUST be a power of 2 for the macros below to work. 3053e12c5d1SDavid du Colombier 3063e12c5d1SDavid du Colombier The blocks associated with a particular string or macro are chained 3073e12c5d1SDavid du Colombier together in the array blist[]. Each blist[i].nextoff contains the 3083e12c5d1SDavid du Colombier Offset associated with the next block in the giant array, or -1 if 3093e12c5d1SDavid du Colombier this is the last block in the chain. If .nextoff is 0, the block is 3103e12c5d1SDavid du Colombier free. 3113e12c5d1SDavid du Colombier 3123e12c5d1SDavid du Colombier To find the right index in blist for an Offset, divide by BLK. 3133e12c5d1SDavid du Colombier */ 3143e12c5d1SDavid du Colombier 3153e12c5d1SDavid du Colombier #define NBLIST 2048 /* starting number of blocks in all definitions */ 3163e12c5d1SDavid du Colombier 3173e12c5d1SDavid du Colombier #define BLK 128 /* number of Tchars in a block; must be 2^N with defns below */ 3183e12c5d1SDavid du Colombier 3193e12c5d1SDavid du Colombier #define rbf0(o) (blist[bindex(o)].bp[boffset(o)]) 3203e12c5d1SDavid du Colombier #define bindex(o) ((o) / BLK) 3213e12c5d1SDavid du Colombier #define boffset(o) ((o) & (BLK-1)) 3223e12c5d1SDavid du Colombier #define pastend(o) (((o) & (BLK-1)) == 0) 3233e12c5d1SDavid du Colombier /* #define incoff(o) ( (++o & (BLK-1)) ? o : blist[bindex(o-1)].nextoff ) */ 3243e12c5d1SDavid du Colombier #define incoff(o) ( (((o)+1) & (BLK-1)) ? o+1 : blist[bindex(o)].nextoff ) 3253e12c5d1SDavid du Colombier 326219b2ee8SDavid du Colombier #define skipline(f) while (getc(f) != '\n') 327219b2ee8SDavid du Colombier #define is(s) (strcmp(cmd, s) == 0) 328219b2ee8SDavid du Colombier #define eq(s1, s2) (strcmp(s1, s2) == 0) 329219b2ee8SDavid du Colombier 330219b2ee8SDavid du Colombier 3313e12c5d1SDavid du Colombier typedef unsigned long Offset; /* an offset in macro/string storage */ 3323e12c5d1SDavid du Colombier 3333e12c5d1SDavid du Colombier struct Blockp { /* info about a block: */ 3343e12c5d1SDavid du Colombier Tchar *bp; /* the data */ 3353e12c5d1SDavid du Colombier Offset nextoff; /* offset of next block in a chain */ 3363e12c5d1SDavid du Colombier }; 3373e12c5d1SDavid du Colombier 3383e12c5d1SDavid du Colombier extern Blockp *blist; 3393e12c5d1SDavid du Colombier 3403e12c5d1SDavid du Colombier #define RD_OFFSET (1 * BLK) /* .rd command uses block 1 */ 3413e12c5d1SDavid du Colombier 3423e12c5d1SDavid du Colombier struct Diver { /* diversion */ 3433e12c5d1SDavid du Colombier Offset op; 3443e12c5d1SDavid du Colombier int dnl; 3453e12c5d1SDavid du Colombier int dimac; 3463e12c5d1SDavid du Colombier int ditrap; 3473e12c5d1SDavid du Colombier int ditf; 3483e12c5d1SDavid du Colombier int alss; 3493e12c5d1SDavid du Colombier int blss; 3503e12c5d1SDavid du Colombier int nls; 3513e12c5d1SDavid du Colombier int mkline; 3523e12c5d1SDavid du Colombier int maxl; 3533e12c5d1SDavid du Colombier int hnl; 3543e12c5d1SDavid du Colombier int curd; 3553e12c5d1SDavid du Colombier }; 3563e12c5d1SDavid du Colombier 3573e12c5d1SDavid du Colombier struct Stack { /* stack frame */ 3583e12c5d1SDavid du Colombier int nargs; 3593e12c5d1SDavid du Colombier Stack *pframe; 3603e12c5d1SDavid du Colombier Offset pip; 3613e12c5d1SDavid du Colombier int pnchar; 3623e12c5d1SDavid du Colombier Tchar prchar; 3633e12c5d1SDavid du Colombier int ppendt; 3643e12c5d1SDavid du Colombier Tchar pch; 3653e12c5d1SDavid du Colombier Tchar *lastpbp; 3663e12c5d1SDavid du Colombier int mname; 3673e12c5d1SDavid du Colombier }; 3683e12c5d1SDavid du Colombier 3693e12c5d1SDavid du Colombier extern Stack s; 3703e12c5d1SDavid du Colombier 371219b2ee8SDavid du Colombier struct Divsiz { 372219b2ee8SDavid du Colombier int dix; 373219b2ee8SDavid du Colombier int diy; 374219b2ee8SDavid du Colombier }; 375219b2ee8SDavid du Colombier 3763e12c5d1SDavid du Colombier struct Contab { /* command or macro */ 377219b2ee8SDavid du Colombier unsigned int rq; 3783e12c5d1SDavid du Colombier Contab *link; 3793e12c5d1SDavid du Colombier void (*f)(void); 3803e12c5d1SDavid du Colombier Offset mx; 381219b2ee8SDavid du Colombier Offset emx; 382219b2ee8SDavid du Colombier Divsiz *divsiz; 3833e12c5d1SDavid du Colombier }; 3843e12c5d1SDavid du Colombier 385219b2ee8SDavid du Colombier #define C(a,b) {a, 0, b, 0, 0} /* how to initialize a contab entry */ 386219b2ee8SDavid du Colombier 3873e12c5d1SDavid du Colombier extern Contab contab[NM]; 3883e12c5d1SDavid du Colombier 3893e12c5d1SDavid du Colombier struct Numtab { /* number registers */ 390219b2ee8SDavid du Colombier unsigned int r; /* name */ 391219b2ee8SDavid du Colombier int val; 3923e12c5d1SDavid du Colombier short fmt; 3933e12c5d1SDavid du Colombier short inc; 3943e12c5d1SDavid du Colombier Numtab *link; 3953e12c5d1SDavid du Colombier }; 3963e12c5d1SDavid du Colombier 3973e12c5d1SDavid du Colombier extern Numtab numtab[NN]; 3983e12c5d1SDavid du Colombier 3993e12c5d1SDavid du Colombier #define PN 0 4003e12c5d1SDavid du Colombier #define NL 1 4013e12c5d1SDavid du Colombier #define YR 2 4023e12c5d1SDavid du Colombier #define HP 3 4033e12c5d1SDavid du Colombier #define CT 4 4043e12c5d1SDavid du Colombier #define DN 5 4053e12c5d1SDavid du Colombier #define MO 6 4063e12c5d1SDavid du Colombier #define DY 7 4073e12c5d1SDavid du Colombier #define DW 8 4083e12c5d1SDavid du Colombier #define LN 9 4093e12c5d1SDavid du Colombier #define DL 10 4103e12c5d1SDavid du Colombier #define ST 11 4113e12c5d1SDavid du Colombier #define SB 12 4123e12c5d1SDavid du Colombier #define CD 13 4133e12c5d1SDavid du Colombier #define PID 14 4143e12c5d1SDavid du Colombier 4153e12c5d1SDavid du Colombier struct Wcache { /* width cache, indexed by character */ 4163e12c5d1SDavid du Colombier short fontpts; 4173e12c5d1SDavid du Colombier short width; 4183e12c5d1SDavid du Colombier }; 4193e12c5d1SDavid du Colombier 420219b2ee8SDavid du Colombier struct Tbuf { /* growable Tchar buffer */ 421219b2ee8SDavid du Colombier Tchar *_bufp; 422219b2ee8SDavid du Colombier unsigned int _size; 423219b2ee8SDavid du Colombier }; 4243e12c5d1SDavid du Colombier 4253e12c5d1SDavid du Colombier /* the infamous environment block */ 4263e12c5d1SDavid du Colombier 4273e12c5d1SDavid du Colombier #define ics envp->_ics 4283e12c5d1SDavid du Colombier #define sps envp->_sps 4293e12c5d1SDavid du Colombier #define spacesz envp->_spacesz 4303e12c5d1SDavid du Colombier #define lss envp->_lss 4313e12c5d1SDavid du Colombier #define lss1 envp->_lss1 4323e12c5d1SDavid du Colombier #define ll envp->_ll 4333e12c5d1SDavid du Colombier #define ll1 envp->_ll1 4343e12c5d1SDavid du Colombier #define lt envp->_lt 4353e12c5d1SDavid du Colombier #define lt1 envp->_lt1 4363e12c5d1SDavid du Colombier #define ic envp->_ic 4373e12c5d1SDavid du Colombier #define icf envp->_icf 4383e12c5d1SDavid du Colombier #define chbits envp->_chbits 4393e12c5d1SDavid du Colombier #define spbits envp->_spbits 4403e12c5d1SDavid du Colombier #define nmbits envp->_nmbits 4413e12c5d1SDavid du Colombier #define apts envp->_apts 4423e12c5d1SDavid du Colombier #define apts1 envp->_apts1 4433e12c5d1SDavid du Colombier #define pts envp->_pts 4443e12c5d1SDavid du Colombier #define pts1 envp->_pts1 4453e12c5d1SDavid du Colombier #define font envp->_font 4463e12c5d1SDavid du Colombier #define font1 envp->_font1 4473e12c5d1SDavid du Colombier #define ls envp->_ls 4483e12c5d1SDavid du Colombier #define ls1 envp->_ls1 4493e12c5d1SDavid du Colombier #define ad envp->_ad 4503e12c5d1SDavid du Colombier #define nms envp->_nms 4513e12c5d1SDavid du Colombier #define ndf envp->_ndf 452219b2ee8SDavid du Colombier #define nmwid envp->_nmwid 4533e12c5d1SDavid du Colombier #define fi envp->_fi 4543e12c5d1SDavid du Colombier #define cc envp->_cc 4553e12c5d1SDavid du Colombier #define c2 envp->_c2 4563e12c5d1SDavid du Colombier #define ohc envp->_ohc 4573e12c5d1SDavid du Colombier #define tdelim envp->_tdelim 4583e12c5d1SDavid du Colombier #define hyf envp->_hyf 4593e12c5d1SDavid du Colombier #define hyoff envp->_hyoff 4603e12c5d1SDavid du Colombier #define hyphalg envp->_hyphalg 4613e12c5d1SDavid du Colombier #define un1 envp->_un1 4623e12c5d1SDavid du Colombier #define tabc envp->_tabc 4633e12c5d1SDavid du Colombier #define dotc envp->_dotc 4643e12c5d1SDavid du Colombier #define adsp envp->_adsp 4653e12c5d1SDavid du Colombier #define adrem envp->_adrem 4663e12c5d1SDavid du Colombier #define lastl envp->_lastl 4673e12c5d1SDavid du Colombier #define nel envp->_nel 4683e12c5d1SDavid du Colombier #define admod envp->_admod 4693e12c5d1SDavid du Colombier #define wordp envp->_wordp 4703e12c5d1SDavid du Colombier #define spflg envp->_spflg 4713e12c5d1SDavid du Colombier #define linep envp->_linep 4723e12c5d1SDavid du Colombier #define wdend envp->_wdend 4733e12c5d1SDavid du Colombier #define wdstart envp->_wdstart 4743e12c5d1SDavid du Colombier #define wne envp->_wne 4753e12c5d1SDavid du Colombier #define ne envp->_ne 4763e12c5d1SDavid du Colombier #define nc envp->_nc 4773e12c5d1SDavid du Colombier #define nb envp->_nb 4783e12c5d1SDavid du Colombier #define lnmod envp->_lnmod 4793e12c5d1SDavid du Colombier #define nwd envp->_nwd 4803e12c5d1SDavid du Colombier #define nn envp->_nn 4813e12c5d1SDavid du Colombier #define ni envp->_ni 4823e12c5d1SDavid du Colombier #define ul envp->_ul 4833e12c5d1SDavid du Colombier #define cu envp->_cu 4843e12c5d1SDavid du Colombier #define ce envp->_ce 4853e12c5d1SDavid du Colombier #define in envp->_in 4863e12c5d1SDavid du Colombier #define in1 envp->_in1 4873e12c5d1SDavid du Colombier #define un envp->_un 4883e12c5d1SDavid du Colombier #define wch envp->_wch 4893e12c5d1SDavid du Colombier #define pendt envp->_pendt 4903e12c5d1SDavid du Colombier #define pendw envp->_pendw 4913e12c5d1SDavid du Colombier #define pendnf envp->_pendnf 4923e12c5d1SDavid du Colombier #define spread envp->_spread 4933e12c5d1SDavid du Colombier #define it envp->_it 4943e12c5d1SDavid du Colombier #define itmac envp->_itmac 4953e12c5d1SDavid du Colombier #define hyptr envp->_hyptr 4963e12c5d1SDavid du Colombier #define tabtab envp->_tabtab 497219b2ee8SDavid du Colombier #define line envp->_line._bufp 498219b2ee8SDavid du Colombier #define lnsize envp->_line._size 499219b2ee8SDavid du Colombier #define word envp->_word._bufp 500219b2ee8SDavid du Colombier #define wdsize envp->_word._size 501219b2ee8SDavid du Colombier 502219b2ee8SDavid du Colombier #define oline _oline._bufp 503219b2ee8SDavid du Colombier #define olnsize _oline._size 5043e12c5d1SDavid du Colombier 5053e12c5d1SDavid du Colombier /* 5063e12c5d1SDavid du Colombier * Note: 5073e12c5d1SDavid du Colombier * If this structure changes in ni.c, you must change 5083e12c5d1SDavid du Colombier * this as well, and vice versa. 5093e12c5d1SDavid du Colombier */ 5103e12c5d1SDavid du Colombier 5113e12c5d1SDavid du Colombier struct Env { 5123e12c5d1SDavid du Colombier int _ics; 5133e12c5d1SDavid du Colombier int _sps; 5143e12c5d1SDavid du Colombier int _spacesz; 5153e12c5d1SDavid du Colombier int _lss; 5163e12c5d1SDavid du Colombier int _lss1; 5173e12c5d1SDavid du Colombier int _ll; 5183e12c5d1SDavid du Colombier int _ll1; 5193e12c5d1SDavid du Colombier int _lt; 5203e12c5d1SDavid du Colombier int _lt1; 5213e12c5d1SDavid du Colombier Tchar _ic; 5223e12c5d1SDavid du Colombier int _icf; 5233e12c5d1SDavid du Colombier Tchar _chbits; 5243e12c5d1SDavid du Colombier Tchar _spbits; 5253e12c5d1SDavid du Colombier Tchar _nmbits; 5263e12c5d1SDavid du Colombier int _apts; 5273e12c5d1SDavid du Colombier int _apts1; 5283e12c5d1SDavid du Colombier int _pts; 5293e12c5d1SDavid du Colombier int _pts1; 5303e12c5d1SDavid du Colombier int _font; 5313e12c5d1SDavid du Colombier int _font1; 5323e12c5d1SDavid du Colombier int _ls; 5333e12c5d1SDavid du Colombier int _ls1; 5343e12c5d1SDavid du Colombier int _ad; 5353e12c5d1SDavid du Colombier int _nms; 5363e12c5d1SDavid du Colombier int _ndf; 537219b2ee8SDavid du Colombier int _nmwid; 5383e12c5d1SDavid du Colombier int _fi; 5393e12c5d1SDavid du Colombier int _cc; 5403e12c5d1SDavid du Colombier int _c2; 5413e12c5d1SDavid du Colombier int _ohc; 5423e12c5d1SDavid du Colombier int _tdelim; 5433e12c5d1SDavid du Colombier int _hyf; 5443e12c5d1SDavid du Colombier int _hyoff; 5453e12c5d1SDavid du Colombier int _hyphalg; 5463e12c5d1SDavid du Colombier int _un1; 5473e12c5d1SDavid du Colombier int _tabc; 5483e12c5d1SDavid du Colombier int _dotc; 5493e12c5d1SDavid du Colombier int _adsp; 5503e12c5d1SDavid du Colombier int _adrem; 5513e12c5d1SDavid du Colombier int _lastl; 5523e12c5d1SDavid du Colombier int _nel; 5533e12c5d1SDavid du Colombier int _admod; 5543e12c5d1SDavid du Colombier Tchar *_wordp; 5553e12c5d1SDavid du Colombier int _spflg; 5563e12c5d1SDavid du Colombier Tchar *_linep; 5573e12c5d1SDavid du Colombier Tchar *_wdend; 5583e12c5d1SDavid du Colombier Tchar *_wdstart; 5593e12c5d1SDavid du Colombier int _wne; 5603e12c5d1SDavid du Colombier int _ne; 5613e12c5d1SDavid du Colombier int _nc; 5623e12c5d1SDavid du Colombier int _nb; 5633e12c5d1SDavid du Colombier int _lnmod; 5643e12c5d1SDavid du Colombier int _nwd; 5653e12c5d1SDavid du Colombier int _nn; 5663e12c5d1SDavid du Colombier int _ni; 5673e12c5d1SDavid du Colombier int _ul; 5683e12c5d1SDavid du Colombier int _cu; 5693e12c5d1SDavid du Colombier int _ce; 5703e12c5d1SDavid du Colombier int _in; 5713e12c5d1SDavid du Colombier int _in1; 5723e12c5d1SDavid du Colombier int _un; 5733e12c5d1SDavid du Colombier int _wch; 5743e12c5d1SDavid du Colombier int _pendt; 5753e12c5d1SDavid du Colombier Tchar *_pendw; 5763e12c5d1SDavid du Colombier int _pendnf; 5773e12c5d1SDavid du Colombier int _spread; 5783e12c5d1SDavid du Colombier int _it; 5793e12c5d1SDavid du Colombier int _itmac; 5803e12c5d1SDavid du Colombier Tchar *_hyptr[NHYP]; 581219b2ee8SDavid du Colombier long _tabtab[NTAB]; 582219b2ee8SDavid du Colombier Tbuf _line; 583219b2ee8SDavid du Colombier Tbuf _word; 5843e12c5d1SDavid du Colombier }; 5853e12c5d1SDavid du Colombier 5863e12c5d1SDavid du Colombier extern Env env[]; 5873e12c5d1SDavid du Colombier extern Env *envp; 5883e12c5d1SDavid du Colombier 5893e12c5d1SDavid du Colombier enum { MBchar = 'U', Troffchar = 'C', Number = 'N', Install = 'i', Lookup = 'l' }; 5903e12c5d1SDavid du Colombier /* U => utf, for instance; C => \(xx, N => \N'...' */ 5913e12c5d1SDavid du Colombier 5923e12c5d1SDavid du Colombier 593219b2ee8SDavid du Colombier 5943e12c5d1SDavid du Colombier struct Chwid { /* data on one character */ 595219b2ee8SDavid du Colombier Ushort num; /* character number: 5963e12c5d1SDavid du Colombier 0 -> not on this font 5973e12c5d1SDavid du Colombier >= ALPHABET -> its number among all Cxy's */ 598219b2ee8SDavid du Colombier Ushort code; /* char code for actual device. used for \N */ 5993e12c5d1SDavid du Colombier char *str; /* code string for nroff */ 600219b2ee8SDavid du Colombier Uchar wid; /* width */ 601219b2ee8SDavid du Colombier Uchar kern; /* ascender/descender */ 6023e12c5d1SDavid du Colombier }; 6033e12c5d1SDavid du Colombier 6043e12c5d1SDavid du Colombier struct Font { /* characteristics of a font */ 6053e12c5d1SDavid du Colombier int name; /* int name, e.g., BI (2 chars) */ 60680ee5cbfSDavid du Colombier char longname[64]; /* long name of this font (e.g., "Bembo" */ 6073e12c5d1SDavid du Colombier char *truename; /* path name of table if not in standard place */ 6083e12c5d1SDavid du Colombier int nchars; /* number of width entries for this font */ 6093e12c5d1SDavid du Colombier char specfont; /* 1 == special font */ 6103e12c5d1SDavid du Colombier int spacewidth; /* width of space on this font */ 6113e12c5d1SDavid du Colombier int defaultwidth; /* default width of characters on this font */ 6123e12c5d1SDavid du Colombier Chwid *wp; /* widths, etc., of the real characters */ 6133e12c5d1SDavid du Colombier char ligfont; /* 1 == ligatures exist on this font */ 6143e12c5d1SDavid du Colombier }; 6153e12c5d1SDavid du Colombier 6163e12c5d1SDavid du Colombier /* ligatures, ORed into ligfont */ 6173e12c5d1SDavid du Colombier 6183e12c5d1SDavid du Colombier #define LFF 01 6193e12c5d1SDavid du Colombier #define LFI 02 6203e12c5d1SDavid du Colombier #define LFL 04 6213e12c5d1SDavid du Colombier #define LFFI 010 6223e12c5d1SDavid du Colombier #define LFFL 020 6233e12c5d1SDavid du Colombier 624219b2ee8SDavid du Colombier /* tracing modes */ 625219b2ee8SDavid du Colombier #define TRNARGS 01 /* trace legality of numeric arguments */ 626219b2ee8SDavid du Colombier #define TRREQ 02 /* trace requests */ 627219b2ee8SDavid du Colombier #define TRMAC 04 /* trace macros */ 628219b2ee8SDavid du Colombier #define RQERR 01 /* processing request/macro */ 629219b2ee8SDavid du Colombier 6303e12c5d1SDavid du Colombier /* typewriter driving table structure */ 6313e12c5d1SDavid du Colombier 6323e12c5d1SDavid du Colombier 633219b2ee8SDavid du Colombier extern Term t; 6343e12c5d1SDavid du Colombier struct Term { 6353e12c5d1SDavid du Colombier int bset; /* these bits have to be on */ 6363e12c5d1SDavid du Colombier int breset; /* these bits have to be off */ 6373e12c5d1SDavid du Colombier int Hor; /* #units in minimum horiz motion */ 6383e12c5d1SDavid du Colombier int Vert; /* #units in minimum vert motion */ 6393e12c5d1SDavid du Colombier int Newline; /* #units in single line space */ 6403e12c5d1SDavid du Colombier int Char; /* #units in character width */ 6413e12c5d1SDavid du Colombier int Em; /* ditto */ 6423e12c5d1SDavid du Colombier int Halfline; /* half line units */ 6433e12c5d1SDavid du Colombier int Adj; /* minimum units for horizontal adjustment */ 6443e12c5d1SDavid du Colombier char *twinit; /* initialize terminal */ 6453e12c5d1SDavid du Colombier char *twrest; /* reinitialize terminal */ 6463e12c5d1SDavid du Colombier char *twnl; /* terminal sequence for newline */ 6473e12c5d1SDavid du Colombier char *hlr; /* half-line reverse */ 6483e12c5d1SDavid du Colombier char *hlf; /* half-line forward */ 6493e12c5d1SDavid du Colombier char *flr; /* full-line reverse */ 6503e12c5d1SDavid du Colombier char *bdon; /* turn bold mode on */ 6513e12c5d1SDavid du Colombier char *bdoff; /* turn bold mode off */ 6523e12c5d1SDavid du Colombier char *iton; /* turn italic mode on */ 6533e12c5d1SDavid du Colombier char *itoff; /* turn italic mode off */ 6543e12c5d1SDavid du Colombier char *ploton; /* turn plot mode on */ 6553e12c5d1SDavid du Colombier char *plotoff; /* turn plot mode off */ 6563e12c5d1SDavid du Colombier char *up; /* sequence to move up in plot mode */ 6573e12c5d1SDavid du Colombier char *down; /* ditto */ 6583e12c5d1SDavid du Colombier char *right; /* ditto */ 6593e12c5d1SDavid du Colombier char *left; /* ditto */ 6603e12c5d1SDavid du Colombier 6613e12c5d1SDavid du Colombier Font tfont; /* widths and other info, as in a troff font */ 6623e12c5d1SDavid du Colombier }; 6633e12c5d1SDavid du Colombier 6643e12c5d1SDavid du Colombier extern Term t; 665219b2ee8SDavid du Colombier 666219b2ee8SDavid du Colombier /* 667219b2ee8SDavid du Colombier * for error reporting; keep track of escapes/requests with numeric arguments 668219b2ee8SDavid du Colombier */ 669219b2ee8SDavid du Colombier struct Numerr { 670219b2ee8SDavid du Colombier char type; /* request or escape? */ 671219b2ee8SDavid du Colombier char esc; /* was escape sequence named esc */ 672219b2ee8SDavid du Colombier char escarg; /* argument of esc's like \D'l' */ 673219b2ee8SDavid du Colombier unsigned int req; /* was request or macro named req */ 674219b2ee8SDavid du Colombier }; 675