xref: /plan9/sys/src/cmd/troff/tdef.h (revision 14f51593fd82e19ba95969a8c07ff71131015979)
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