|  | #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; | 
|  |  | 
|  | 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); | 
|  |  |