123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670 |
- #include <stdio.h>
- #include <stdlib.h>
- #include <limits.h>
- #include <ctype.h>
- #include <string.h>
- #define NROFF (!TROFF)
- /* Site dependent definitions */
- #ifndef TMACDIR
- #define TMACDIR "lib/tmac/tmac."
- #endif
- #ifndef FONTDIR
- #define FONTDIR "lib/font"
- #endif
- #ifndef NTERMDIR
- #define NTERMDIR "lib/term/tab."
- #endif
- #ifndef TDEVNAME
- #define TDEVNAME "post"
- #endif
- #ifndef NDEVNAME
- #define NDEVNAME "37"
- #endif
- #ifndef TEXHYPHENS
- #define TEXHYPHENS "/usr/lib/tex/macros/hyphen.tex"
- #endif
- #ifndef ALTHYPHENS
- #define ALTHYPHENS "lib/tmac/hyphen.tex" /* another place to look */
- #endif
- typedef unsigned char Uchar;
- typedef unsigned short Ushort;
- typedef /*unsigned*/ long Tchar;
- typedef struct Blockp Blockp;
- typedef struct Diver Diver;
- typedef struct Stack Stack;
- typedef struct Divsiz Divsiz;
- typedef struct Contab Contab;
- typedef struct Numtab Numtab;
- typedef struct Numerr Numerr;
- typedef struct Env Env;
- typedef struct Term Term;
- typedef struct Chwid Chwid;
- typedef struct Font Font;
- typedef struct Spnames Spnames;
- typedef struct Wcache Wcache;
- typedef struct Tbuf Tbuf;
- /* this simulates printf into a buffer that gets flushed sporadically */
- /* the BSD goo is because SunOS sprintf doesn't return anything useful */
- #ifdef BSD4_2
- #define OUT (obufp += strlen(sprintf(obufp,
- #define PUT ))) > obuf+BUFSIZ ? flusho() : 1
- #else
- #define OUT (obufp += sprintf(obufp,
- #define PUT )) > obuf+BUFSIZ ? flusho() : 1
- #endif
- #define oputs(a) OUT "%s", a PUT
- #define oput(c) ( *obufp++ = (c), obufp > obuf+BUFSIZ ? flusho() : 1 )
- extern char errbuf[];
- #define ERROR sprintf(errbuf,
- #define WARN ), errprint()
- #define FATAL ), errprint(), exit(1)
- /* starting values for typesetting parameters: */
- #define PS 10 /* default point size */
- #define FT 1 /* default font position */
- #define ULFONT 2 /* default underline font */
- #define BDFONT 3 /* default emboldening font */
- #define BIFONT 4 /* default bold italic font */
- #define LL (unsigned) 65*INCH/10 /* line length; 39picas=6.5in */
- #define VS ((12*INCH)/72) /* initial vert space */
- #define EMPTS(pts) (((long)Inch*(pts) + 36) / 72)
- #define EM (TROFF? EMPTS(pts): t.Em)
- #define INCH (TROFF? Inch: 240)
- #define HOR (TROFF? Hor: t.Adj)
- #define VERT (TROFF? Vert: t.Vert)
- #define PO (TROFF? Inch: 0)
- #define SPS (TROFF? EMPTS(pts)/3: INCH/10)
- #define SS (TROFF? 12: INCH/10)
- #define ICS (TROFF? EMPTS(pts): 2*INCH/10)
- #define DTAB (TROFF? (INCH/2): 0)
- /* These "characters" are used to encode various internal functions
- /* Some make use of the fact that most ascii characters between
- /* 0 and 040 don't have any graphic or other function.
- /* The few that do have a purpose (e.g., \n, \b, \t, ...
- /* are avoided by the ad hoc choices here.
- /* See ifilt[] in n1.c for others -- 1, 2, 3, 5, 6, 7, 010, 011, 012
- */
- #define LEADER 001
- #define IMP 004 /* impossible char; glues things together */
- #define TAB 011
- #define RPT 014 /* next character is to be repeated many times */
- #define CHARHT 015 /* size field sets character height */
- #define SLANT 016 /* size field sets amount of slant */
- #define DRAWFCN 017 /* next several chars describe arb drawing fcns */
- # define DRAWLINE 'l' /* line: 'l' dx dy char */
- # define DRAWCIRCLE 'c' /* circle: 'c' r */
- # define DRAWELLIPSE 'e' /* ellipse: 'e' rx ry */
- # define DRAWARC 'a' /* arc: 'a' dx dy dx dy */
- # define DRAWSPLINE '~' /* quadratic B spline: '~' dx dy dx dy ... */
- /* other splines go thru too */
- /* NOTE: the use of ~ is a botch since it's often used in .tr commands */
- /* better to use a letter like s, but change it in the postprocessors too */
- /* for now, this is taken care of in n9.c and t10.c */
- # define DRAWBUILD 'b' /* built-up character (e.g., { */
- #define LEFT 020 /* \{ */
- #define RIGHT 021 /* \} */
- #define FILLER 022 /* \& and similar purposes */
- #define XON 023 /* \X'...' starts here */
- #define OHC 024 /* optional hyphenation character \% */
- #define CONT 025 /* \c character */
- #define PRESC 026 /* printable escape */
- #define UNPAD 027 /* unpaddable blank */
- #define XPAR 030 /* transparent mode indicator */
- #define FLSS 031 /* next Tchar contains vertical space */
- /* used when recalling diverted text */
- #define WORDSP 032 /* paddable word space */
- #define ESC 033 /* current escape character */
- #define XOFF 034 /* \X'...' ends here */
- /* matches XON, but they will probably never nest */
- /* so could drop this when another control is needed */
- #define HX 035 /* next character is value of \x'...' */
- #define MOTCH 036 /* this "character" is really motion; used by cbits() */
- #define HYPHEN c_hyphen
- #define EMDASH c_emdash /* \(em */
- #define RULE c_rule /* \(ru */
- #define MINUS c_minus /* minus sign on current font */
- #define LIG_FI c_fi /* \(ff */
- #define LIG_FL c_fl /* \(fl */
- #define LIG_FF c_ff /* \(ff */
- #define LIG_FFI c_ffi /* \(Fi */
- #define LIG_FFL c_ffl /* \(Fl */
- #define ACUTE c_acute /* acute accent \(aa */
- #define GRAVE c_grave /* grave accent \(ga */
- #define UNDERLINE c_under /* \(ul */
- #define ROOTEN c_rooten /* root en \(rn */
- #define BOXRULE c_boxrule /* box rule \(br */
- #define LEFTHAND c_lefthand /* left hand for word overflow */
- #define DAGGER c_dagger /* dagger for end of sentence/footnote */
- #define HYPHALG 1 /* hyphenation algorithm: 0=>good old troff, 1=>tex */
- /* array sizes, and similar limits: */
- #define MAXFONTS 99 /* Maximum number of fonts in fontab */
- #define NM 90 /* requests + macros */
- #define NN NNAMES /* number registers */
- #define NNAMES 15 /* predefined reg names */
- #define NIF 15 /* if-else nesting */
- #define NS 128 /* name buffer */
- #define NTM 1024 /* tm buffer */
- #define NEV 3 /* environments */
- #define EVLSZ 10 /* size of ev stack */
- #define STACKSIZE (12*1024) /* stack for macros and strings in progress */
- #define NHYP 10 /* max hyphens per word */
- #define NHEX 512 /* byte size of exception word list */
- #define NTAB 100 /* tab stops */
- #define NSO 5 /* "so" depth */
- #define NMF 5 /* number of -m flags */
- #define WDSIZE 500 /* word buffer click size */
- #define LNSIZE 4000 /* line buffer click size */
- #define OLNSIZE 5000 /* output line buffer click; bigger for 'w', etc. */
- #define NDI 5 /* number of diversions */
- #define ALPHABET alphabet /* number of characters in basic alphabet. */
- /* 128 for parochial USA 7-bit ascii, */
- /* 256 for "European" mode with e.g., Latin-1 */
- /* NCHARS must be greater than
- ALPHABET (ascii stuff) + total number of distinct char names
- from all fonts that will be run in this job (including
- unnamed ones and \N's)
- */
- #define NCHARS (8*1024) /* maximum size of troff character set*/
- /* However for nroff you want only :
- 1. number of special codes in charset of DESC, which ends up being the
- value of nchtab and which must be less than 512.
- 2. ALPHABET, which apparently is the size of the portion of the tables reserved
- for special control symbols
- Apparently the max N of \N is irrelevant; */
- /* to allow \N of up to 254 with up to 338 special characters
- you need NCHARS of 338 + ALPHABET = 466 */
- #define NROFFCHARS 1024 /* maximum size of nroff character set */
- #define NTRTAB NCHARS /* number of items in trtab[] */
- #define NWIDCACHE NCHARS /* number of items in widcache[] */
- #define NTRAP 20 /* number of traps */
- #define NPN 20 /* numbers in "-o" */
- #define FBUFSZ 512 /* field buf size words */
- #define IBUFSZ 4096 /* bytes */
- #define NC 1024 /* cbuf size words */
- #define NOV 10 /* number of overstrike chars */
- #define NPP 10 /* pads per field */
- /*
- Internal character representation:
- Internally, every character is carried around as
- a 32 bit cookie, called a "Tchar" (typedef long).
- Bits are numbered 31..0 from left to right.
- If bit 15 is 1, the character is motion, with
- if bit 16 it's vertical motion
- if bit 17 it's negative motion
- If bit 15 is 0, the character is a real character.
- if bit 31 zero motion
- bits 30..24 size
- bits 23..16 font
- */
- /* in the following, "L" should really be a Tchar, but ... */
- /* numerology leaves room for 16 bit chars */
- #define MOT (01uL << 16) /* motion character indicator */
- #define VMOT (01uL << 30) /* vertical motion bit */
- #define NMOT (01uL << 29) /* negative motion indicator */
- /* #define MOTV (MOT|VMOT|NMOT) /* motion flags */
- /* #define MAXMOT (~MOTV) /* maximum motion permitted */
- #define MAXMOT 0xFFFF
- #define ismot(n) ((n) & MOT)
- #define isvmot(n) (((n) & (MOT|VMOT)) == (MOT|VMOT)) /* must have tested MOT previously */
- #define isnmot(n) (((n) & (MOT|NMOT)) == (MOT|NMOT)) /* ditto */
- #define absmot(n) ((n) & 0xFFFF)
- #define ZBIT (01uL << 31) /* zero width char */
- #define iszbit(n) ((n) & ZBIT)
- #define FSHIFT 17
- #define SSHIFT (FSHIFT+7)
- #define SMASK (0177uL << SSHIFT) /* 128 distinct sizes */
- #define FMASK (0177uL << FSHIFT) /* 128 distinct fonts */
- #define SFMASK (SMASK|FMASK) /* size and font in a Tchar */
- #define sbits(n) (((n) >> SSHIFT) & 0177)
- #define fbits(n) (((n) >> FSHIFT) & 0177)
- #define sfbits(n) (((n) & SFMASK) >> FSHIFT)
- #define cbits(n) ((n) & 0x1FFFF) /* isolate character bits, */
- /* but don't include motions */
- extern int realcbits(Tchar);
- #define setsbits(n,s) n = (n & ~SMASK) | (Tchar)(s) << SSHIFT
- #define setfbits(n,f) n = (n & ~FMASK) | (Tchar)(f) << FSHIFT
- #define setsfbits(n,sf) n = (n & ~SFMASK) | (Tchar)(sf) << FSHIFT
- #define setcbits(n,c) n = (n & ~0xFFFFuL | (c)) /* set character bits */
- #define BYTEMASK 0377
- #define BYTE 8
- #define SHORTMASK 0XFFFF
- #define SHORT 16
- #define TABMASK ((unsigned) INT_MAX >> 1)
- #define RTAB ((TABMASK << 1) & ~TABMASK)
- #define CTAB (RTAB << 1)
- #define TABBIT 02 /* bits in gchtab */
- #define LDRBIT 04
- #define FCBIT 010
- #define PAIR(A,B) (A|(B<<SHORT))
- extern int Inch, Hor, Vert, Unitwidth;
- struct Spnames
- {
- int *n;
- char *v;
- };
- extern Spnames spnames[];
- /*
- String and macro definitions are stored conceptually in a giant array
- indexed by type Offset. In olden times, this array was real, and thus
- both huge and limited in size, leading to the "Out of temp file space"
- error. In this version, the array is represented by a list of blocks,
- pointed to by blist[].bp. Each block is of size BLK Tchars, and BLK
- MUST be a power of 2 for the macros below to work.
-
- The blocks associated with a particular string or macro are chained
- together in the array blist[]. Each blist[i].nextoff contains the
- Offset associated with the next block in the giant array, or -1 if
- this is the last block in the chain. If .nextoff is 0, the block is
- free.
-
- To find the right index in blist for an Offset, divide by BLK.
- */
- #define NBLIST 2048 /* starting number of blocks in all definitions */
- #define BLK 128 /* number of Tchars in a block; must be 2^N with defns below */
- #define rbf0(o) (blist[bindex(o)].bp[boffset(o)])
- #define bindex(o) ((o) / BLK)
- #define boffset(o) ((o) & (BLK-1))
- #define pastend(o) (((o) & (BLK-1)) == 0)
- /* #define incoff(o) ( (++o & (BLK-1)) ? o : blist[bindex(o-1)].nextoff ) */
- #define incoff(o) ( (((o)+1) & (BLK-1)) ? o+1 : blist[bindex(o)].nextoff )
- #define skipline(f) while (getc(f) != '\n')
- #define is(s) (strcmp(cmd, s) == 0)
- #define eq(s1, s2) (strcmp(s1, s2) == 0)
- typedef unsigned long Offset; /* an offset in macro/string storage */
- struct Blockp { /* info about a block: */
- Tchar *bp; /* the data */
- Offset nextoff; /* offset of next block in a chain */
- };
- extern Blockp *blist;
- #define RD_OFFSET (1 * BLK) /* .rd command uses block 1 */
- struct Diver { /* diversion */
- Offset op;
- int dnl;
- int dimac;
- int ditrap;
- int ditf;
- int alss;
- int blss;
- int nls;
- int mkline;
- int maxl;
- int hnl;
- int curd;
- };
- struct Stack { /* stack frame */
- int nargs;
- Stack *pframe;
- Offset pip;
- int pnchar;
- Tchar prchar;
- int ppendt;
- Tchar pch;
- Tchar *lastpbp;
- int mname;
- };
- extern Stack s;
- struct Divsiz {
- int dix;
- int diy;
- };
- struct Contab { /* command or macro */
- unsigned int rq;
- Contab *link;
- void (*f)(void);
- Offset mx;
- Offset emx;
- Divsiz *divsiz;
- };
- #define C(a,b) {a, 0, b, 0, 0} /* how to initialize a contab entry */
- extern Contab contab[NM];
- struct Numtab { /* number registers */
- unsigned int r; /* name */
- int val;
- short fmt;
- short inc;
- Numtab *link;
- };
- extern Numtab numtab[NN];
- #define PN 0
- #define NL 1
- #define YR 2
- #define HP 3
- #define CT 4
- #define DN 5
- #define MO 6
- #define DY 7
- #define DW 8
- #define LN 9
- #define DL 10
- #define ST 11
- #define SB 12
- #define CD 13
- #define PID 14
- struct Wcache { /* width cache, indexed by character */
- short fontpts;
- short width;
- };
- struct Tbuf { /* growable Tchar buffer */
- Tchar *_bufp;
- unsigned int _size;
- };
- /* the infamous environment block */
- #define ics envp->_ics
- #define sps envp->_sps
- #define spacesz envp->_spacesz
- #define lss envp->_lss
- #define lss1 envp->_lss1
- #define ll envp->_ll
- #define ll1 envp->_ll1
- #define lt envp->_lt
- #define lt1 envp->_lt1
- #define ic envp->_ic
- #define icf envp->_icf
- #define chbits envp->_chbits
- #define spbits envp->_spbits
- #define nmbits envp->_nmbits
- #define apts envp->_apts
- #define apts1 envp->_apts1
- #define pts envp->_pts
- #define pts1 envp->_pts1
- #define font envp->_font
- #define font1 envp->_font1
- #define ls envp->_ls
- #define ls1 envp->_ls1
- #define ad envp->_ad
- #define nms envp->_nms
- #define ndf envp->_ndf
- #define nmwid envp->_nmwid
- #define fi envp->_fi
- #define cc envp->_cc
- #define c2 envp->_c2
- #define ohc envp->_ohc
- #define tdelim envp->_tdelim
- #define hyf envp->_hyf
- #define hyoff envp->_hyoff
- #define hyphalg envp->_hyphalg
- #define un1 envp->_un1
- #define tabc envp->_tabc
- #define dotc envp->_dotc
- #define adsp envp->_adsp
- #define adrem envp->_adrem
- #define lastl envp->_lastl
- #define nel envp->_nel
- #define admod envp->_admod
- #define wordp envp->_wordp
- #define spflg envp->_spflg
- #define linep envp->_linep
- #define wdend envp->_wdend
- #define wdstart envp->_wdstart
- #define wne envp->_wne
- #define ne envp->_ne
- #define nc envp->_nc
- #define nb envp->_nb
- #define lnmod envp->_lnmod
- #define nwd envp->_nwd
- #define nn envp->_nn
- #define ni envp->_ni
- #define ul envp->_ul
- #define cu envp->_cu
- #define ce envp->_ce
- #define in envp->_in
- #define in1 envp->_in1
- #define un envp->_un
- #define wch envp->_wch
- #define pendt envp->_pendt
- #define pendw envp->_pendw
- #define pendnf envp->_pendnf
- #define spread envp->_spread
- #define it envp->_it
- #define itmac envp->_itmac
- #define hyptr envp->_hyptr
- #define tabtab envp->_tabtab
- #define line envp->_line._bufp
- #define lnsize envp->_line._size
- #define word envp->_word._bufp
- #define wdsize envp->_word._size
- #define oline _oline._bufp
- #define olnsize _oline._size
- /*
- * Note:
- * If this structure changes in ni.c, you must change
- * this as well, and vice versa.
- */
- struct Env {
- int _ics;
- int _sps;
- int _spacesz;
- int _lss;
- int _lss1;
- int _ll;
- int _ll1;
- int _lt;
- int _lt1;
- Tchar _ic;
- int _icf;
- Tchar _chbits;
- Tchar _spbits;
- Tchar _nmbits;
- int _apts;
- int _apts1;
- int _pts;
- int _pts1;
- int _font;
- int _font1;
- int _ls;
- int _ls1;
- int _ad;
- int _nms;
- int _ndf;
- int _nmwid;
- int _fi;
- int _cc;
- int _c2;
- int _ohc;
- int _tdelim;
- int _hyf;
- int _hyoff;
- int _hyphalg;
- int _un1;
- int _tabc;
- int _dotc;
- int _adsp;
- int _adrem;
- int _lastl;
- int _nel;
- int _admod;
- Tchar *_wordp;
- int _spflg;
- Tchar *_linep;
- Tchar *_wdend;
- Tchar *_wdstart;
- int _wne;
- int _ne;
- int _nc;
- int _nb;
- int _lnmod;
- int _nwd;
- int _nn;
- int _ni;
- int _ul;
- int _cu;
- int _ce;
- int _in;
- int _in1;
- int _un;
- int _wch;
- int _pendt;
- Tchar *_pendw;
- int _pendnf;
- int _spread;
- int _it;
- int _itmac;
- Tchar *_hyptr[NHYP];
- long _tabtab[NTAB];
- Tbuf _line;
- Tbuf _word;
- };
- extern Env env[];
- extern Env *envp;
- enum { MBchar = 'U', Troffchar = 'C', Number = 'N', Install = 'i', Lookup = 'l' };
- /* U => utf, for instance; C => \(xx, N => \N'...' */
- struct Chwid { /* data on one character */
- Ushort num; /* character number:
- 0 -> not on this font
- >= ALPHABET -> its number among all Cxy's */
- Ushort code; /* char code for actual device. used for \N */
- char *str; /* code string for nroff */
- Uchar wid; /* width */
- Uchar kern; /* ascender/descender */
- };
- struct Font { /* characteristics of a font */
- int name; /* int name, e.g., BI (2 chars) */
- char longname[64]; /* long name of this font (e.g., "Bembo" */
- char *truename; /* path name of table if not in standard place */
- int nchars; /* number of width entries for this font */
- char specfont; /* 1 == special font */
- int spacewidth; /* width of space on this font */
- int defaultwidth; /* default width of characters on this font */
- Chwid *wp; /* widths, etc., of the real characters */
- char ligfont; /* 1 == ligatures exist on this font */
- };
- /* ligatures, ORed into ligfont */
- #define LFF 01
- #define LFI 02
- #define LFL 04
- #define LFFI 010
- #define LFFL 020
- /* tracing modes */
- #define TRNARGS 01 /* trace legality of numeric arguments */
- #define TRREQ 02 /* trace requests */
- #define TRMAC 04 /* trace macros */
- #define RQERR 01 /* processing request/macro */
- /* typewriter driving table structure */
- extern Term t;
- struct Term {
- int bset; /* these bits have to be on */
- int breset; /* these bits have to be off */
- int Hor; /* #units in minimum horiz motion */
- int Vert; /* #units in minimum vert motion */
- int Newline; /* #units in single line space */
- int Char; /* #units in character width */
- int Em; /* ditto */
- int Halfline; /* half line units */
- int Adj; /* minimum units for horizontal adjustment */
- char *twinit; /* initialize terminal */
- char *twrest; /* reinitialize terminal */
- char *twnl; /* terminal sequence for newline */
- char *hlr; /* half-line reverse */
- char *hlf; /* half-line forward */
- char *flr; /* full-line reverse */
- char *bdon; /* turn bold mode on */
- char *bdoff; /* turn bold mode off */
- char *iton; /* turn italic mode on */
- char *itoff; /* turn italic mode off */
- char *ploton; /* turn plot mode on */
- char *plotoff; /* turn plot mode off */
- char *up; /* sequence to move up in plot mode */
- char *down; /* ditto */
- char *right; /* ditto */
- char *left; /* ditto */
- Font tfont; /* widths and other info, as in a troff font */
- };
- extern Term t;
- /*
- * for error reporting; keep track of escapes/requests with numeric arguments
- */
- struct Numerr {
- char type; /* request or escape? */
- char esc; /* was escape sequence named esc */
- char escarg; /* argument of esc's like \D'l' */
- unsigned int req; /* was request or macro named req */
- };
|