391 lines
8.3 KiB
C
391 lines
8.3 KiB
C
#include <stdio.h>
|
|
#include "tdef.h"
|
|
#include "fns.h"
|
|
#include "ext.h"
|
|
|
|
char termtab[NS]; /* term type added in ptinit() */
|
|
char fontdir[NS]; /* added in casefp; not used by nroff */
|
|
char devname[20]; /* default output device */
|
|
|
|
Numtab numtab[NN] = {
|
|
{ PAIR('%', 0) },
|
|
{ PAIR('n', 'l') },
|
|
{ PAIR('y', 'r') },
|
|
{ PAIR('h', 'p') },
|
|
{ PAIR('c', 't') },
|
|
{ PAIR('d', 'n') },
|
|
{ PAIR('m', 'o') },
|
|
{ PAIR('d', 'y') },
|
|
{ PAIR('d', 'w') },
|
|
{ PAIR('l', 'n') },
|
|
{ PAIR('d', 'l') },
|
|
{ PAIR('s', 't') },
|
|
{ PAIR('s', 'b') },
|
|
{ PAIR('c', '.') },
|
|
{ PAIR('$', '$') },
|
|
};
|
|
|
|
|
|
int alphabet = 256; /* latin-1 */
|
|
int pto = 10000;
|
|
int pfrom = 1;
|
|
int print = 1;
|
|
char nextf[NS] = TMACDIR;
|
|
char mfiles[NMF][NS];
|
|
int nmfi = 0;
|
|
int oldbits = -1;
|
|
int init = 1;
|
|
int fc = IMP; /* field character */
|
|
int eschar = '\\';
|
|
int pl;
|
|
int po;
|
|
FILE *ptid = stdout;
|
|
|
|
int dfact = 1;
|
|
int dfactd = 1;
|
|
int res = 1;
|
|
int smnt = 0; /* beginning of special fonts */
|
|
int ascii = 0; /* ascii normally off for troff, on for nroff; -a turns on */
|
|
int lg;
|
|
int pnlist[NPN] = { -1 };
|
|
|
|
|
|
int *pnp = pnlist;
|
|
int npn = 1;
|
|
int npnflg = 1;
|
|
int dpn = -1;
|
|
int totout = 1;
|
|
int ulfont = ULFONT;
|
|
int tabch = TAB;
|
|
int ldrch = LEADER;
|
|
|
|
|
|
Contab contab[NM] = {
|
|
C(PAIR('d', 's'), caseds),
|
|
C(PAIR('a', 's'), caseas),
|
|
C(PAIR('s', 'p'), casesp),
|
|
C(PAIR('f', 't'), caseft),
|
|
C(PAIR('p', 's'), caseps),
|
|
C(PAIR('v', 's'), casevs),
|
|
C(PAIR('n', 'r'), casenr),
|
|
C(PAIR('i', 'f'), caseif),
|
|
C(PAIR('i', 'e'), caseie),
|
|
C(PAIR('e', 'l'), caseel),
|
|
C(PAIR('p', 'o'), casepo),
|
|
C(PAIR('t', 'l'), casetl),
|
|
C(PAIR('t', 'm'), casetm),
|
|
C(PAIR('f', 'm'), casefm),
|
|
C(PAIR('b', 'p'), casebp),
|
|
C(PAIR('c', 'h'), casech),
|
|
C(PAIR('p', 'n'), casepn),
|
|
C(PAIR('b', 'r'), tbreak),
|
|
C(PAIR('t', 'i'), caseti),
|
|
C(PAIR('n', 'e'), casene),
|
|
C(PAIR('n', 'f'), casenf),
|
|
C(PAIR('c', 'e'), casece),
|
|
C(PAIR('f', 'i'), casefi),
|
|
C(PAIR('i', 'n'), casein),
|
|
C(PAIR('l', 'l'), casell),
|
|
C(PAIR('n', 's'), casens),
|
|
C(PAIR('m', 'k'), casemk),
|
|
C(PAIR('r', 't'), casert),
|
|
C(PAIR('a', 'm'), caseam),
|
|
C(PAIR('d', 'e'), casede),
|
|
C(PAIR('d', 'i'), casedi),
|
|
C(PAIR('d', 'a'), caseda),
|
|
C(PAIR('w', 'h'), casewh),
|
|
C(PAIR('d', 't'), casedt),
|
|
C(PAIR('i', 't'), caseit),
|
|
C(PAIR('r', 'm'), caserm),
|
|
C(PAIR('r', 'r'), caserr),
|
|
C(PAIR('r', 'n'), casern),
|
|
C(PAIR('a', 'd'), casead),
|
|
C(PAIR('r', 's'), casers),
|
|
C(PAIR('n', 'a'), casena),
|
|
C(PAIR('p', 'l'), casepl),
|
|
C(PAIR('t', 'a'), caseta),
|
|
C(PAIR('t', 'r'), casetr),
|
|
C(PAIR('u', 'l'), caseul),
|
|
C(PAIR('c', 'u'), casecu),
|
|
C(PAIR('l', 't'), caselt),
|
|
C(PAIR('n', 'x'), casenx),
|
|
C(PAIR('s', 'o'), caseso),
|
|
C(PAIR('i', 'g'), caseig),
|
|
C(PAIR('t', 'c'), casetc),
|
|
C(PAIR('f', 'c'), casefc),
|
|
C(PAIR('e', 'c'), caseec),
|
|
C(PAIR('e', 'o'), caseeo),
|
|
C(PAIR('l', 'c'), caselc),
|
|
C(PAIR('e', 'v'), caseev),
|
|
C(PAIR('r', 'd'), caserd),
|
|
C(PAIR('a', 'b'), caseab),
|
|
C(PAIR('f', 'l'), casefl),
|
|
C(PAIR('e', 'x'), caseex),
|
|
C(PAIR('s', 's'), casess),
|
|
C(PAIR('f', 'p'), casefp),
|
|
C(PAIR('c', 's'), casecs),
|
|
C(PAIR('b', 'd'), casebd),
|
|
C(PAIR('l', 'g'), caselg),
|
|
C(PAIR('h', 'c'), casehc),
|
|
C(PAIR('h', 'y'), casehy),
|
|
C(PAIR('n', 'h'), casenh),
|
|
C(PAIR('n', 'm'), casenm),
|
|
C(PAIR('n', 'n'), casenn),
|
|
C(PAIR('s', 'v'), casesv),
|
|
C(PAIR('o', 's'), caseos),
|
|
C(PAIR('l', 's'), casels),
|
|
C(PAIR('c', 'c'), casecc),
|
|
C(PAIR('c', '2'), casec2),
|
|
C(PAIR('e', 'm'), caseem),
|
|
C(PAIR('a', 'f'), caseaf),
|
|
C(PAIR('h', 'a'), caseha),
|
|
C(PAIR('h', 'w'), casehw),
|
|
C(PAIR('m', 'c'), casemc),
|
|
C(PAIR('p', 'm'), casepm),
|
|
C(PAIR('p', 'i'), casepi),
|
|
C(PAIR('u', 'f'), caseuf),
|
|
C(PAIR('p', 'c'), casepc),
|
|
C(PAIR('h', 't'), caseht),
|
|
C(PAIR('c', 'f'), casecf),
|
|
C(PAIR('s', 'y'), casesy),
|
|
C(PAIR('l', 'f'), caself),
|
|
C(PAIR('p', 't'), casept),
|
|
C(PAIR('g', 'd'), casegd),
|
|
};
|
|
|
|
|
|
Tbuf _oline;
|
|
|
|
/*
|
|
* troff environment block
|
|
*/
|
|
|
|
Env env[NEV] = { { /* this sets up env[0] */
|
|
/* int ics */ 0, /* insertion character space, set by .mc */
|
|
/* int sps */ 0,
|
|
/* int spacesz */ 0,
|
|
/* int lss */ 0,
|
|
/* int lss1 */ 0,
|
|
/* int ll */ 0,
|
|
/* int ll1 */ 0,
|
|
/* int lt */ 0,
|
|
/* int lt1 */ 0,
|
|
/* Tchar ic */ 0, /* insertion character (= margin character) */
|
|
/* int icf */ 0, /* insertion character flag */
|
|
/* Tchar chbits */ 0, /* size+font bits for current character */
|
|
/* Tchar spbits */ 0,
|
|
/* Tchar nmbits */ 0, /* size+font bits for number from .nm */
|
|
/* int apts */ PS, /* actual point size -- as requested by user */
|
|
/* int apts1 */ PS, /* need not match an existent size */
|
|
/* int pts */ PS, /* hence, this is the size that really exists */
|
|
/* int pts1 */ PS,
|
|
/* int font */ FT,
|
|
/* int font1 */ FT,
|
|
/* int ls */ 1,
|
|
/* int ls1 */ 1,
|
|
/* int ad */ 1,
|
|
/* int nms */ 1, /* .nm multiplier */
|
|
/* int ndf */ 1, /* .nm separator */
|
|
/* int nmwid */ 3, /* max width of .nm numbers */
|
|
/* int fi */ 1,
|
|
/* int cc */ '.',
|
|
/* int c2 */ '\'',
|
|
/* int ohc */ OHC,
|
|
/* int tdelim */ IMP,
|
|
/* int hyf */ 1,
|
|
/* int hyoff */ 0,
|
|
/* int hyphalg */ HYPHALG,
|
|
/* int un1 */ -1,
|
|
/* int tabc */ 0,
|
|
/* int dotc */ '.',
|
|
/* int adsp */ 0, /* add this much space to each padding point */
|
|
/* int adrem */ 0, /* excess space to add until it runs out */
|
|
/* int lastl */ 0, /* last text on current output line */
|
|
/* int nel */ 0, /* how much space left on current output line */
|
|
/* int admod */ 0, /* adjust mode */
|
|
/* Tchar *wordp */ 0,
|
|
/* int spflg */ 0, /* probably to indicate space after punctuation needed */
|
|
/* Tchar *linep */ 0,
|
|
/* Tchar *wdend */ 0,
|
|
/* Tchar *wdstart */ 0,
|
|
/* int wne */ 0,
|
|
/* int ne */ 0, /* how much space taken on current output line */
|
|
/* int nc */ 0, /* #characters (incl blank) on output line */
|
|
/* int nb */ 0,
|
|
/* int lnmod */ 0, /* line number mode, set by .nm */
|
|
/* int nwd */ 0, /* number of words on current output line */
|
|
/* int nn */ 0, /* from .nn command */
|
|
/* int ni */ 0, /* indent of .nm numbers, probably */
|
|
/* int ul */ 0,
|
|
/* int cu */ 0,
|
|
/* int ce */ 0,
|
|
/* int in */ 0, /* indent and previous value */
|
|
/* int in1 */ 0,
|
|
/* int un */ 0, /* unindent of left margin in some way */
|
|
/* int wch */ 0,
|
|
/* int pendt */ 0,
|
|
/* Tchar *pendw */ (Tchar *)0,
|
|
/* int pendnf */ 0,
|
|
/* int spread */ 0,
|
|
/* int it */ 0, /* input trap count */
|
|
/* int itmac */ 0,
|
|
} };
|
|
|
|
Env *envp = env; /* start off in env 0 */
|
|
|
|
Numerr numerr;
|
|
|
|
Stack *frame, *stk, *ejl;
|
|
Stack *nxf;
|
|
|
|
int pipeflg;
|
|
int hflg; /* used in nroff only */
|
|
int eqflg; /* used in nroff only */
|
|
|
|
int xpts;
|
|
int ppts;
|
|
int pfont;
|
|
int mpts;
|
|
int mfont;
|
|
int cs;
|
|
int ccs;
|
|
int bd;
|
|
|
|
int stdi;
|
|
int quiet;
|
|
int stop;
|
|
char ibuf[IBUFSZ];
|
|
char xbuf[IBUFSZ];
|
|
char *ibufp;
|
|
char *xbufp;
|
|
char *eibuf;
|
|
char *xeibuf;
|
|
Tchar pbbuf[NC]; /* pushback buffer for arguments, \n, etc. */
|
|
Tchar *pbp = pbbuf; /* next free slot in pbbuf */
|
|
Tchar *lastpbp = pbbuf; /* pbp in previous stack frame */
|
|
int nx;
|
|
int mflg;
|
|
Tchar ch = 0;
|
|
int ibf;
|
|
int ifi;
|
|
int iflg;
|
|
int rargc;
|
|
char **argp;
|
|
Ushort trtab[NTRTAB];
|
|
int lgf;
|
|
int copyf;
|
|
Offset ip;
|
|
int nlflg;
|
|
int donef;
|
|
int nflush;
|
|
int nfo;
|
|
int padc;
|
|
int raw;
|
|
int flss;
|
|
int nonumb;
|
|
int trap;
|
|
int tflg;
|
|
int ejf;
|
|
int dilev;
|
|
Offset offset;
|
|
int em;
|
|
int ds;
|
|
Offset woff;
|
|
int app;
|
|
int ndone;
|
|
int lead;
|
|
int ralss;
|
|
Offset nextb;
|
|
Tchar nrbits;
|
|
int nform;
|
|
int oldmn;
|
|
int newmn;
|
|
int macerr;
|
|
Offset apptr;
|
|
int diflg;
|
|
int evi;
|
|
int vflag;
|
|
int noscale;
|
|
int po1;
|
|
int nlist[NTRAP];
|
|
int mlist[NTRAP];
|
|
int evlist[EVLSZ];
|
|
int ev;
|
|
int tty;
|
|
int sfont = FT; /* appears to be "standard" font; used by .ul */
|
|
int sv;
|
|
int esc;
|
|
int widthp;
|
|
int xfont;
|
|
int setwdf;
|
|
int over;
|
|
int nhyp;
|
|
Tchar **hyp;
|
|
Tchar *olinep;
|
|
int dotT;
|
|
char *unlkp;
|
|
Wcache widcache[NWIDCACHE];
|
|
Diver d[NDI];
|
|
Diver *dip;
|
|
|
|
int c_hyphen;
|
|
int c_emdash;
|
|
int c_rule;
|
|
int c_minus;
|
|
int c_fi;
|
|
int c_fl;
|
|
int c_ff;
|
|
int c_ffi;
|
|
int c_ffl;
|
|
int c_acute;
|
|
int c_grave;
|
|
int c_under;
|
|
int c_rooten;
|
|
int c_boxrule;
|
|
int c_lefthand;
|
|
int c_dagger;
|
|
int c_isalnum;
|
|
|
|
Spnames spnames[] =
|
|
{
|
|
&c_hyphen, "hy",
|
|
&c_emdash, "em",
|
|
&c_rule, "ru",
|
|
&c_minus, "\\-",
|
|
&c_fi, "fi",
|
|
&c_fl, "fl",
|
|
&c_ff, "ff",
|
|
&c_ffi, "Fi",
|
|
&c_ffl, "Fl",
|
|
&c_acute, "aa",
|
|
&c_grave, "ga",
|
|
&c_under, "ul",
|
|
&c_rooten, "rn",
|
|
&c_boxrule, "br",
|
|
&c_lefthand, "lh",
|
|
&c_dagger, "dg", /* not in nroff?? */
|
|
&c_isalnum, "__",
|
|
0, 0
|
|
};
|
|
|
|
|
|
Tchar (*hmot)(void);
|
|
Tchar (*makem)(int i);
|
|
Tchar (*setabs)(void);
|
|
Tchar (*setch)(int c);
|
|
Tchar (*sethl)(int k);
|
|
Tchar (*setht)(void);
|
|
Tchar (*setslant)(void);
|
|
Tchar (*vmot)(void);
|
|
Tchar (*xlss)(void);
|
|
int (*findft)(int i);
|
|
int (*width)(Tchar j);
|
|
void (*mchbits)(void);
|
|
void (*ptlead)(void);
|
|
void (*ptout)(Tchar i);
|
|
void (*ptpause)(void);
|
|
void (*setfont)(int a);
|
|
void (*setps)(void);
|
|
void (*setwd)(void);
|
|
|