xref: /plan9/sys/src/cmd/troff/ni.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include <stdio.h>
23e12c5d1SDavid du Colombier #include "tdef.h"
33e12c5d1SDavid du Colombier #include "fns.h"
43e12c5d1SDavid du Colombier #include "ext.h"
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier char	termtab[NS];	/* term type added in ptinit() */
73e12c5d1SDavid du Colombier char	fontdir[NS];	/* added in casefp; not used by nroff */
83e12c5d1SDavid du Colombier char	devname[20];	/* default output device */
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier Numtab numtab[NN] = {
113e12c5d1SDavid du Colombier 	{ PAIR('%', 0) },
123e12c5d1SDavid du Colombier 	{ PAIR('n', 'l') },
133e12c5d1SDavid du Colombier 	{ PAIR('y', 'r') },
143e12c5d1SDavid du Colombier 	{ PAIR('h', 'p') },
153e12c5d1SDavid du Colombier 	{ PAIR('c', 't') },
163e12c5d1SDavid du Colombier 	{ PAIR('d', 'n') },
173e12c5d1SDavid du Colombier 	{ PAIR('m', 'o') },
183e12c5d1SDavid du Colombier 	{ PAIR('d', 'y') },
193e12c5d1SDavid du Colombier 	{ PAIR('d', 'w') },
203e12c5d1SDavid du Colombier 	{ PAIR('l', 'n') },
213e12c5d1SDavid du Colombier 	{ PAIR('d', 'l') },
223e12c5d1SDavid du Colombier 	{ PAIR('s', 't') },
233e12c5d1SDavid du Colombier 	{ PAIR('s', 'b') },
243e12c5d1SDavid du Colombier 	{ PAIR('c', '.') },
253e12c5d1SDavid du Colombier 	{ PAIR('$', '$') },
263e12c5d1SDavid du Colombier };
273e12c5d1SDavid du Colombier 
28*219b2ee8SDavid du Colombier 
293e12c5d1SDavid du Colombier int	alphabet	= 256;	/* latin-1 */
303e12c5d1SDavid du Colombier int	pto	= 10000;
313e12c5d1SDavid du Colombier int	pfrom	= 1;
323e12c5d1SDavid du Colombier int	print	= 1;
333e12c5d1SDavid du Colombier char	nextf[NS]	= TMACDIR;
343e12c5d1SDavid du Colombier char	mfiles[NMF][NS];
353e12c5d1SDavid du Colombier int	nmfi	= 0;
363e12c5d1SDavid du Colombier int	oldbits	= -1;
373e12c5d1SDavid du Colombier int	init	= 1;
383e12c5d1SDavid du Colombier int	fc	= IMP;	/* field character */
393e12c5d1SDavid du Colombier int	eschar	= '\\';
403e12c5d1SDavid du Colombier int	pl;
413e12c5d1SDavid du Colombier int	po;
423e12c5d1SDavid du Colombier FILE	*ptid	= stdout;
433e12c5d1SDavid du Colombier 
443e12c5d1SDavid du Colombier int	dfact	= 1;
453e12c5d1SDavid du Colombier int	dfactd	= 1;
463e12c5d1SDavid du Colombier int	res	= 1;
473e12c5d1SDavid du Colombier int	smnt	= 0;	/* beginning of special fonts */
483e12c5d1SDavid du Colombier int	ascii	= 0;	/* ascii normally off for troff, on for nroff;  -a turns on */
493e12c5d1SDavid du Colombier int	lg;
503e12c5d1SDavid du Colombier int	pnlist[NPN] = { -1 };
513e12c5d1SDavid du Colombier 
523e12c5d1SDavid du Colombier 
533e12c5d1SDavid du Colombier int	*pnp	= pnlist;
543e12c5d1SDavid du Colombier int	npn	= 1;
553e12c5d1SDavid du Colombier int	npnflg	=  1;
563e12c5d1SDavid du Colombier int	dpn	=  -1;
573e12c5d1SDavid du Colombier int	totout	=  1;
583e12c5d1SDavid du Colombier int	ulfont	=  ULFONT;
593e12c5d1SDavid du Colombier int	tabch	=  TAB;
603e12c5d1SDavid du Colombier int	ldrch	=  LEADER;
613e12c5d1SDavid du Colombier 
623e12c5d1SDavid du Colombier 
633e12c5d1SDavid du Colombier Contab contab[NM] = {
643e12c5d1SDavid du Colombier 	C(PAIR('d', 's'), caseds),
653e12c5d1SDavid du Colombier 	C(PAIR('a', 's'), caseas),
663e12c5d1SDavid du Colombier 	C(PAIR('s', 'p'), casesp),
673e12c5d1SDavid du Colombier 	C(PAIR('f', 't'), caseft),
683e12c5d1SDavid du Colombier 	C(PAIR('p', 's'), caseps),
693e12c5d1SDavid du Colombier 	C(PAIR('v', 's'), casevs),
703e12c5d1SDavid du Colombier 	C(PAIR('n', 'r'), casenr),
713e12c5d1SDavid du Colombier 	C(PAIR('i', 'f'), caseif),
723e12c5d1SDavid du Colombier 	C(PAIR('i', 'e'), caseie),
733e12c5d1SDavid du Colombier 	C(PAIR('e', 'l'), caseel),
743e12c5d1SDavid du Colombier 	C(PAIR('p', 'o'), casepo),
753e12c5d1SDavid du Colombier 	C(PAIR('t', 'l'), casetl),
763e12c5d1SDavid du Colombier 	C(PAIR('t', 'm'), casetm),
77*219b2ee8SDavid du Colombier 	C(PAIR('f', 'm'), casefm),
783e12c5d1SDavid du Colombier 	C(PAIR('b', 'p'), casebp),
793e12c5d1SDavid du Colombier 	C(PAIR('c', 'h'), casech),
803e12c5d1SDavid du Colombier 	C(PAIR('p', 'n'), casepn),
813e12c5d1SDavid du Colombier 	C(PAIR('b', 'r'), tbreak),
823e12c5d1SDavid du Colombier 	C(PAIR('t', 'i'), caseti),
833e12c5d1SDavid du Colombier 	C(PAIR('n', 'e'), casene),
843e12c5d1SDavid du Colombier 	C(PAIR('n', 'f'), casenf),
853e12c5d1SDavid du Colombier 	C(PAIR('c', 'e'), casece),
863e12c5d1SDavid du Colombier 	C(PAIR('f', 'i'), casefi),
873e12c5d1SDavid du Colombier 	C(PAIR('i', 'n'), casein),
883e12c5d1SDavid du Colombier 	C(PAIR('l', 'l'), casell),
893e12c5d1SDavid du Colombier 	C(PAIR('n', 's'), casens),
903e12c5d1SDavid du Colombier 	C(PAIR('m', 'k'), casemk),
913e12c5d1SDavid du Colombier 	C(PAIR('r', 't'), casert),
923e12c5d1SDavid du Colombier 	C(PAIR('a', 'm'), caseam),
933e12c5d1SDavid du Colombier 	C(PAIR('d', 'e'), casede),
943e12c5d1SDavid du Colombier 	C(PAIR('d', 'i'), casedi),
953e12c5d1SDavid du Colombier 	C(PAIR('d', 'a'), caseda),
963e12c5d1SDavid du Colombier 	C(PAIR('w', 'h'), casewh),
973e12c5d1SDavid du Colombier 	C(PAIR('d', 't'), casedt),
983e12c5d1SDavid du Colombier 	C(PAIR('i', 't'), caseit),
993e12c5d1SDavid du Colombier 	C(PAIR('r', 'm'), caserm),
1003e12c5d1SDavid du Colombier 	C(PAIR('r', 'r'), caserr),
1013e12c5d1SDavid du Colombier 	C(PAIR('r', 'n'), casern),
1023e12c5d1SDavid du Colombier 	C(PAIR('a', 'd'), casead),
1033e12c5d1SDavid du Colombier 	C(PAIR('r', 's'), casers),
1043e12c5d1SDavid du Colombier 	C(PAIR('n', 'a'), casena),
1053e12c5d1SDavid du Colombier 	C(PAIR('p', 'l'), casepl),
1063e12c5d1SDavid du Colombier 	C(PAIR('t', 'a'), caseta),
1073e12c5d1SDavid du Colombier 	C(PAIR('t', 'r'), casetr),
1083e12c5d1SDavid du Colombier 	C(PAIR('u', 'l'), caseul),
1093e12c5d1SDavid du Colombier 	C(PAIR('c', 'u'), casecu),
1103e12c5d1SDavid du Colombier 	C(PAIR('l', 't'), caselt),
1113e12c5d1SDavid du Colombier 	C(PAIR('n', 'x'), casenx),
1123e12c5d1SDavid du Colombier 	C(PAIR('s', 'o'), caseso),
1133e12c5d1SDavid du Colombier 	C(PAIR('i', 'g'), caseig),
1143e12c5d1SDavid du Colombier 	C(PAIR('t', 'c'), casetc),
1153e12c5d1SDavid du Colombier 	C(PAIR('f', 'c'), casefc),
1163e12c5d1SDavid du Colombier 	C(PAIR('e', 'c'), caseec),
1173e12c5d1SDavid du Colombier 	C(PAIR('e', 'o'), caseeo),
1183e12c5d1SDavid du Colombier 	C(PAIR('l', 'c'), caselc),
1193e12c5d1SDavid du Colombier 	C(PAIR('e', 'v'), caseev),
1203e12c5d1SDavid du Colombier 	C(PAIR('r', 'd'), caserd),
1213e12c5d1SDavid du Colombier 	C(PAIR('a', 'b'), caseab),
1223e12c5d1SDavid du Colombier 	C(PAIR('f', 'l'), casefl),
1233e12c5d1SDavid du Colombier 	C(PAIR('e', 'x'), caseex),
1243e12c5d1SDavid du Colombier 	C(PAIR('s', 's'), casess),
1253e12c5d1SDavid du Colombier 	C(PAIR('f', 'p'), casefp),
1263e12c5d1SDavid du Colombier 	C(PAIR('c', 's'), casecs),
1273e12c5d1SDavid du Colombier 	C(PAIR('b', 'd'), casebd),
1283e12c5d1SDavid du Colombier 	C(PAIR('l', 'g'), caselg),
1293e12c5d1SDavid du Colombier 	C(PAIR('h', 'c'), casehc),
1303e12c5d1SDavid du Colombier 	C(PAIR('h', 'y'), casehy),
1313e12c5d1SDavid du Colombier 	C(PAIR('n', 'h'), casenh),
1323e12c5d1SDavid du Colombier 	C(PAIR('n', 'm'), casenm),
1333e12c5d1SDavid du Colombier 	C(PAIR('n', 'n'), casenn),
1343e12c5d1SDavid du Colombier 	C(PAIR('s', 'v'), casesv),
1353e12c5d1SDavid du Colombier 	C(PAIR('o', 's'), caseos),
1363e12c5d1SDavid du Colombier 	C(PAIR('l', 's'), casels),
1373e12c5d1SDavid du Colombier 	C(PAIR('c', 'c'), casecc),
1383e12c5d1SDavid du Colombier 	C(PAIR('c', '2'), casec2),
1393e12c5d1SDavid du Colombier 	C(PAIR('e', 'm'), caseem),
1403e12c5d1SDavid du Colombier 	C(PAIR('a', 'f'), caseaf),
1413e12c5d1SDavid du Colombier 	C(PAIR('h', 'a'), caseha),
1423e12c5d1SDavid du Colombier 	C(PAIR('h', 'w'), casehw),
1433e12c5d1SDavid du Colombier 	C(PAIR('m', 'c'), casemc),
1443e12c5d1SDavid du Colombier 	C(PAIR('p', 'm'), casepm),
1453e12c5d1SDavid du Colombier 	C(PAIR('p', 'i'), casepi),
1463e12c5d1SDavid du Colombier 	C(PAIR('u', 'f'), caseuf),
1473e12c5d1SDavid du Colombier 	C(PAIR('p', 'c'), casepc),
1483e12c5d1SDavid du Colombier 	C(PAIR('h', 't'), caseht),
1493e12c5d1SDavid du Colombier 	C(PAIR('c', 'f'), casecf),
1503e12c5d1SDavid du Colombier 	C(PAIR('s', 'y'), casesy),
1513e12c5d1SDavid du Colombier 	C(PAIR('l', 'f'), caself),
152*219b2ee8SDavid du Colombier 	C(PAIR('p', 't'), casept),
153*219b2ee8SDavid du Colombier 	C(PAIR('g', 'd'), casegd),
1543e12c5d1SDavid du Colombier };
1553e12c5d1SDavid du Colombier 
1563e12c5d1SDavid du Colombier 
157*219b2ee8SDavid du Colombier Tbuf _oline;
1583e12c5d1SDavid du Colombier 
1593e12c5d1SDavid du Colombier /*
1603e12c5d1SDavid du Colombier  * troff environment block
1613e12c5d1SDavid du Colombier  */
1623e12c5d1SDavid du Colombier 
1633e12c5d1SDavid du Colombier Env env[NEV] = { {	/* this sets up env[0] */
1643e12c5d1SDavid du Colombier /* int	ics	 */	0,	/* insertion character space, set by .mc */
1653e12c5d1SDavid du Colombier /* int	sps	 */	0,
1663e12c5d1SDavid du Colombier /* int	spacesz	 */	0,
1673e12c5d1SDavid du Colombier /* int	lss	 */	0,
1683e12c5d1SDavid du Colombier /* int	lss1	 */	0,
1693e12c5d1SDavid du Colombier /* int	ll	 */	0,
1703e12c5d1SDavid du Colombier /* int	ll1	 */	0,
1713e12c5d1SDavid du Colombier /* int	lt	 */	0,
1723e12c5d1SDavid du Colombier /* int	lt1	 */	0,
1733e12c5d1SDavid du Colombier /* Tchar ic	 */	0,	/* insertion character (= margin character) */
1743e12c5d1SDavid du Colombier /* int	icf	 */	0,	/* insertion character flag */
1753e12c5d1SDavid du Colombier /* Tchar chbits	 */	0,	/* size+font bits for current character */
1763e12c5d1SDavid du Colombier /* Tchar spbits	 */	0,
1773e12c5d1SDavid du Colombier /* Tchar nmbits	 */	0,	/* size+font bits for number from .nm */
1783e12c5d1SDavid du Colombier /* int	apts	 */	PS,	/* actual point size -- as requested by user */
1793e12c5d1SDavid du Colombier /* int	apts1	 */	PS,	/* need not match an existent size */
1803e12c5d1SDavid du Colombier /* int	pts	 */	PS,	/* hence, this is the size that really exists */
1813e12c5d1SDavid du Colombier /* int	pts1	 */	PS,
1823e12c5d1SDavid du Colombier /* int	font	 */	FT,
1833e12c5d1SDavid du Colombier /* int	font1	 */	FT,
1843e12c5d1SDavid du Colombier /* int	ls	 */	1,
1853e12c5d1SDavid du Colombier /* int	ls1	 */	1,
1863e12c5d1SDavid du Colombier /* int	ad	 */	1,
1873e12c5d1SDavid du Colombier /* int	nms	 */	1,	/* .nm multiplier */
1883e12c5d1SDavid du Colombier /* int	ndf	 */	1,	/* .nm separator */
189*219b2ee8SDavid du Colombier /* int	nmwid	 */	3,	/* max width of .nm numbers */
1903e12c5d1SDavid du Colombier /* int	fi	 */	1,
1913e12c5d1SDavid du Colombier /* int	cc	 */	'.',
1923e12c5d1SDavid du Colombier /* int	c2	 */	'\'',
1933e12c5d1SDavid du Colombier /* int	ohc	 */	OHC,
1943e12c5d1SDavid du Colombier /* int	tdelim	 */	IMP,
1953e12c5d1SDavid du Colombier /* int	hyf	 */	1,
1963e12c5d1SDavid du Colombier /* int	hyoff	 */	0,
1973e12c5d1SDavid du Colombier /* int	hyphalg  */	HYPHALG,
1983e12c5d1SDavid du Colombier /* int	un1	 */	-1,
1993e12c5d1SDavid du Colombier /* int	tabc	 */	0,
2003e12c5d1SDavid du Colombier /* int	dotc	 */	'.',
2013e12c5d1SDavid du Colombier /* int	adsp	 */	0,	/* add this much space to each padding point */
2023e12c5d1SDavid du Colombier /* int	adrem	 */	0,	/* excess space to add until it runs out */
2033e12c5d1SDavid du Colombier /* int	lastl	 */	0,	/* last text on current output line */
2043e12c5d1SDavid du Colombier /* int	nel	 */	0,	/* how much space left on current output line */
2053e12c5d1SDavid du Colombier /* int	admod	 */	0,	/* adjust mode */
2063e12c5d1SDavid du Colombier /* Tchar *wordp	 */	0,
2073e12c5d1SDavid du Colombier /* int	spflg	 */	0,	/* probably to indicate space after punctuation needed */
2083e12c5d1SDavid du Colombier /* Tchar *linep	 */	0,
2093e12c5d1SDavid du Colombier /* Tchar *wdend	 */	0,
2103e12c5d1SDavid du Colombier /* Tchar *wdstart */	0,
2113e12c5d1SDavid du Colombier /* int	wne	 */	0,
2123e12c5d1SDavid du Colombier /* int	ne	 */	0,	/* how much space taken on current output line */
2133e12c5d1SDavid du Colombier /* int	nc	 */	0,	/* #characters (incl blank) on output line */
2143e12c5d1SDavid du Colombier /* int	nb	 */	0,
2153e12c5d1SDavid du Colombier /* int	lnmod	 */	0,	/* line number mode, set by .nm */
2163e12c5d1SDavid du Colombier /* int	nwd	 */	0,	/* number of words on current output line */
2173e12c5d1SDavid du Colombier /* int	nn	 */	0,	/* from .nn command */
2183e12c5d1SDavid du Colombier /* int	ni	 */	0,	/* indent of .nm numbers, probably */
2193e12c5d1SDavid du Colombier /* int	ul	 */	0,
2203e12c5d1SDavid du Colombier /* int	cu	 */	0,
2213e12c5d1SDavid du Colombier /* int	ce	 */	0,
2223e12c5d1SDavid du Colombier /* int	in	 */	0,	/* indent and previous value */
2233e12c5d1SDavid du Colombier /* int	in1	 */	0,
2243e12c5d1SDavid du Colombier /* int	un	 */	0,	/* unindent of left margin in some way */
2253e12c5d1SDavid du Colombier /* int	wch	 */	0,
2263e12c5d1SDavid du Colombier /* int	pendt	 */	0,
2273e12c5d1SDavid du Colombier /* Tchar *pendw	 */	(Tchar *)0,
2283e12c5d1SDavid du Colombier /* int	pendnf	 */	0,
2293e12c5d1SDavid du Colombier /* int	spread	 */	0,
2303e12c5d1SDavid du Colombier /* int	it	 */	0,	/* input trap count */
2313e12c5d1SDavid du Colombier /* int	itmac	 */	0,
2323e12c5d1SDavid du Colombier } };
2333e12c5d1SDavid du Colombier 
2343e12c5d1SDavid du Colombier Env	*envp	= env;	/* start off in env 0 */
2353e12c5d1SDavid du Colombier 
236*219b2ee8SDavid du Colombier Numerr	numerr;
2373e12c5d1SDavid du Colombier 
2383e12c5d1SDavid du Colombier Stack	*frame, *stk, *ejl;
2393e12c5d1SDavid du Colombier Stack	*nxf;
2403e12c5d1SDavid du Colombier 
2413e12c5d1SDavid du Colombier int	pipeflg;
2423e12c5d1SDavid du Colombier int	hflg;	/* used in nroff only */
2433e12c5d1SDavid du Colombier int	eqflg;	/* used in nroff only */
2443e12c5d1SDavid du Colombier 
2453e12c5d1SDavid du Colombier int	xpts;
2463e12c5d1SDavid du Colombier int	ppts;
2473e12c5d1SDavid du Colombier int	pfont;
2483e12c5d1SDavid du Colombier int	mpts;
2493e12c5d1SDavid du Colombier int	mfont;
2503e12c5d1SDavid du Colombier int	cs;
2513e12c5d1SDavid du Colombier int	ccs;
2523e12c5d1SDavid du Colombier int	bd;
2533e12c5d1SDavid du Colombier 
2543e12c5d1SDavid du Colombier int	stdi;
2553e12c5d1SDavid du Colombier int	quiet;
2563e12c5d1SDavid du Colombier int	stop;
2573e12c5d1SDavid du Colombier char	ibuf[IBUFSZ];
2583e12c5d1SDavid du Colombier char	xbuf[IBUFSZ];
2593e12c5d1SDavid du Colombier char	*ibufp;
2603e12c5d1SDavid du Colombier char	*xbufp;
2613e12c5d1SDavid du Colombier char	*eibuf;
2623e12c5d1SDavid du Colombier char	*xeibuf;
2633e12c5d1SDavid du Colombier Tchar	pbbuf[NC];		/* pushback buffer for arguments, \n, etc. */
2643e12c5d1SDavid du Colombier Tchar	*pbp = pbbuf;		/* next free slot in pbbuf */
2653e12c5d1SDavid du Colombier Tchar	*lastpbp = pbbuf;	/* pbp in previous stack frame */
2663e12c5d1SDavid du Colombier int	nx;
2673e12c5d1SDavid du Colombier int	mflg;
2683e12c5d1SDavid du Colombier Tchar	ch = 0;
2693e12c5d1SDavid du Colombier int	ibf;
2703e12c5d1SDavid du Colombier int	ifi;
2713e12c5d1SDavid du Colombier int	iflg;
2723e12c5d1SDavid du Colombier int	rargc;
2733e12c5d1SDavid du Colombier char	**argp;
274*219b2ee8SDavid du Colombier Ushort	trtab[NTRTAB];
2753e12c5d1SDavid du Colombier int	lgf;
2763e12c5d1SDavid du Colombier int	copyf;
2773e12c5d1SDavid du Colombier Offset	ip;
2783e12c5d1SDavid du Colombier int	nlflg;
2793e12c5d1SDavid du Colombier int	donef;
2803e12c5d1SDavid du Colombier int	nflush;
2813e12c5d1SDavid du Colombier int	nfo;
2823e12c5d1SDavid du Colombier int	padc;
2833e12c5d1SDavid du Colombier int	raw;
2843e12c5d1SDavid du Colombier int	flss;
2853e12c5d1SDavid du Colombier int	nonumb;
2863e12c5d1SDavid du Colombier int	trap;
2873e12c5d1SDavid du Colombier int	tflg;
2883e12c5d1SDavid du Colombier int	ejf;
2893e12c5d1SDavid du Colombier int	dilev;
2903e12c5d1SDavid du Colombier Offset	offset;
2913e12c5d1SDavid du Colombier int	em;
2923e12c5d1SDavid du Colombier int	ds;
2933e12c5d1SDavid du Colombier Offset	woff;
2943e12c5d1SDavid du Colombier int	app;
2953e12c5d1SDavid du Colombier int	ndone;
2963e12c5d1SDavid du Colombier int	lead;
2973e12c5d1SDavid du Colombier int	ralss;
2983e12c5d1SDavid du Colombier Offset	nextb;
2993e12c5d1SDavid du Colombier Tchar	nrbits;
3003e12c5d1SDavid du Colombier int	nform;
3013e12c5d1SDavid du Colombier int	oldmn;
3023e12c5d1SDavid du Colombier int	newmn;
3033e12c5d1SDavid du Colombier int	macerr;
3043e12c5d1SDavid du Colombier Offset	apptr;
3053e12c5d1SDavid du Colombier int	diflg;
3063e12c5d1SDavid du Colombier int	evi;
3073e12c5d1SDavid du Colombier int	vflag;
3083e12c5d1SDavid du Colombier int	noscale;
3093e12c5d1SDavid du Colombier int	po1;
3103e12c5d1SDavid du Colombier int	nlist[NTRAP];
3113e12c5d1SDavid du Colombier int	mlist[NTRAP];
3123e12c5d1SDavid du Colombier int	evlist[EVLSZ];
3133e12c5d1SDavid du Colombier int	ev;
3143e12c5d1SDavid du Colombier int	tty;
3153e12c5d1SDavid du Colombier int	sfont	= FT;	/* appears to be "standard" font; used by .ul */
3163e12c5d1SDavid du Colombier int	sv;
3173e12c5d1SDavid du Colombier int	esc;
3183e12c5d1SDavid du Colombier int	widthp;
3193e12c5d1SDavid du Colombier int	xfont;
3203e12c5d1SDavid du Colombier int	setwdf;
3213e12c5d1SDavid du Colombier int	over;
3223e12c5d1SDavid du Colombier int	nhyp;
3233e12c5d1SDavid du Colombier Tchar	**hyp;
3243e12c5d1SDavid du Colombier Tchar	*olinep;
3253e12c5d1SDavid du Colombier int	dotT;
3263e12c5d1SDavid du Colombier char	*unlkp;
3273e12c5d1SDavid du Colombier Wcache	widcache[NWIDCACHE];
3283e12c5d1SDavid du Colombier Diver	d[NDI];
3293e12c5d1SDavid du Colombier Diver	*dip;
3303e12c5d1SDavid du Colombier 
3313e12c5d1SDavid du Colombier int	c_hyphen;
3323e12c5d1SDavid du Colombier int	c_emdash;
3333e12c5d1SDavid du Colombier int	c_rule;
3343e12c5d1SDavid du Colombier int	c_minus;
3353e12c5d1SDavid du Colombier int	c_fi;
3363e12c5d1SDavid du Colombier int	c_fl;
3373e12c5d1SDavid du Colombier int	c_ff;
3383e12c5d1SDavid du Colombier int	c_ffi;
3393e12c5d1SDavid du Colombier int	c_ffl;
3403e12c5d1SDavid du Colombier int	c_acute;
3413e12c5d1SDavid du Colombier int	c_grave;
3423e12c5d1SDavid du Colombier int	c_under;
3433e12c5d1SDavid du Colombier int	c_rooten;
3443e12c5d1SDavid du Colombier int	c_boxrule;
3453e12c5d1SDavid du Colombier int	c_lefthand;
3463e12c5d1SDavid du Colombier int	c_dagger;
3473e12c5d1SDavid du Colombier int	c_isalnum;
3483e12c5d1SDavid du Colombier 
3493e12c5d1SDavid du Colombier Spnames	spnames[] =
3503e12c5d1SDavid du Colombier {
3513e12c5d1SDavid du Colombier 	&c_hyphen,	"hy",
3523e12c5d1SDavid du Colombier 	&c_emdash,	"em",
3533e12c5d1SDavid du Colombier 	&c_rule,	"ru",
3543e12c5d1SDavid du Colombier 	&c_minus,	"\\-",
3553e12c5d1SDavid du Colombier 	&c_fi,		"fi",
3563e12c5d1SDavid du Colombier 	&c_fl,		"fl",
3573e12c5d1SDavid du Colombier 	&c_ff,		"ff",
3583e12c5d1SDavid du Colombier 	&c_ffi,		"Fi",
3593e12c5d1SDavid du Colombier 	&c_ffl,		"Fl",
3603e12c5d1SDavid du Colombier 	&c_acute,	"aa",
3613e12c5d1SDavid du Colombier 	&c_grave,	"ga",
3623e12c5d1SDavid du Colombier 	&c_under,	"ul",
3633e12c5d1SDavid du Colombier 	&c_rooten,	"rn",
3643e12c5d1SDavid du Colombier 	&c_boxrule,	"br",
3653e12c5d1SDavid du Colombier 	&c_lefthand,	"lh",
3663e12c5d1SDavid du Colombier 	&c_dagger,	"dg",	/* not in nroff?? */
3673e12c5d1SDavid du Colombier 	&c_isalnum,	"__",
3683e12c5d1SDavid du Colombier 	0, 0
3693e12c5d1SDavid du Colombier };
370*219b2ee8SDavid du Colombier 
371*219b2ee8SDavid du Colombier 
372*219b2ee8SDavid du Colombier Tchar	(*hmot)(void);
373*219b2ee8SDavid du Colombier Tchar	(*makem)(int i);
374*219b2ee8SDavid du Colombier Tchar	(*setabs)(void);
375*219b2ee8SDavid du Colombier Tchar	(*setch)(int c);
376*219b2ee8SDavid du Colombier Tchar	(*sethl)(int k);
377*219b2ee8SDavid du Colombier Tchar	(*setht)(void);
378*219b2ee8SDavid du Colombier Tchar	(*setslant)(void);
379*219b2ee8SDavid du Colombier Tchar	(*vmot)(void);
380*219b2ee8SDavid du Colombier Tchar	(*xlss)(void);
381*219b2ee8SDavid du Colombier int	(*findft)(int i);
382*219b2ee8SDavid du Colombier int	(*width)(Tchar j);
383*219b2ee8SDavid du Colombier void	(*mchbits)(void);
384*219b2ee8SDavid du Colombier void	(*ptlead)(void);
385*219b2ee8SDavid du Colombier void	(*ptout)(Tchar i);
386*219b2ee8SDavid du Colombier void	(*ptpause)(void);
387*219b2ee8SDavid du Colombier void	(*setfont)(int a);
388*219b2ee8SDavid du Colombier void	(*setps)(void);
389*219b2ee8SDavid du Colombier void	(*setwd)(void);
390*219b2ee8SDavid du Colombier 
391