Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#define _BSD_EXTENSION
2
#define _POSIX_SOURCE
3
 
4
#include <stdio.h>
5
#include <stdlib.h>
6
#include <unistd.h>
7
#include <limits.h>
8
#include <ctype.h>
9
#include <string.h>
10
 
11
#define	NROFF	(!TROFF)
12
 
13
 
14
/* Site dependent definitions */
15
 
16
#ifndef TMACDIR
17
#define TMACDIR		"lib/tmac/tmac."
18
#endif
19
#ifndef FONTDIR
20
#define FONTDIR		"lib/font"
21
#endif
22
#ifndef NTERMDIR
23
#define NTERMDIR	"lib/term/tab."
24
#endif
25
#ifndef TDEVNAME
26
#define TDEVNAME	"post"
27
#endif
28
#ifndef NDEVNAME
29
#define NDEVNAME	"37"
30
#endif
31
#ifndef TEXHYPHENS
32
#define	TEXHYPHENS	"/usr/lib/tex/macros/hyphen.tex"
33
#endif
34
#ifndef ALTHYPHENS
35
#define	ALTHYPHENS	"lib/tmac/hyphen.tex"	/* another place to look */
36
#endif
37
 
38
typedef	unsigned char	Uchar;
39
typedef unsigned short	Ushort;
40
 
41
typedef	/*unsigned*/ long	Tchar;
42
 
43
typedef	struct	Blockp	Blockp;
44
typedef	struct	Diver	Diver;
45
typedef	struct	Stack	Stack;
46
typedef	struct	Divsiz	Divsiz;
47
typedef	struct	Contab	Contab;
48
typedef	struct	Numtab	Numtab;
49
typedef	struct	Numerr	Numerr;
50
typedef	struct	Env	Env;
51
typedef	struct	Term	Term;
52
typedef struct	Chwid	Chwid;
53
typedef struct	Font	Font;
54
typedef	struct	Spnames	Spnames;
55
typedef	struct	Wcache	Wcache;
56
typedef	struct	Tbuf	Tbuf;
57
 
58
/* this simulates printf into a buffer that gets flushed sporadically */
59
/* the BSD goo is because SunOS sprintf doesn't return anything useful */
60
 
61
#ifdef BSD4_2
62
#define	OUT		(obufp += strlen(sprintf(obufp,
63
#define	PUT		))) > obuf+BUFSIZ ? flusho() : 1
64
#else
65
#define	OUT		(obufp += sprintf(obufp,
66
#define	PUT		)) > obuf+BUFSIZ ? flusho() : 1
67
#endif
68
 
69
#define	oputs(a)	OUT "%s", a PUT
70
#define	oput(c)		( *obufp++ = (c), obufp > obuf+BUFSIZ ? flusho() : 1 )
71
 
72
extern	char	errbuf[];
73
#define	ERROR	sprintf(errbuf,
74
#define	WARN	), errprint()
75
#define	FATAL	), errprint(), exit(1)
76
 
77
/* starting values for typesetting parameters: */
78
 
79
#define	PS	10	/* default point size */
80
#define	FT	1	/* default font position */
81
#define ULFONT	2	/* default underline font */
82
#define	BDFONT	3	/* default emboldening font */
83
#define	BIFONT	4	/* default bold italic font */
84
#define	LL	(unsigned) 65*INCH/10	/* line length; 39picas=6.5in */
85
#define	VS	((12*INCH)/72)	/* initial vert space */
86
 
87
 
88
#define	EMPTS(pts)	(((long)Inch*(pts) + 36) / 72)
89
#define	EM	(TROFF? EMPTS(pts): t.Em)
90
#define	INCH	(TROFF? Inch: 240)
91
#define	HOR	(TROFF? Hor: t.Adj)
92
#define	VERT	(TROFF? Vert: t.Vert)
93
#define	PO	(TROFF? Inch: 0)
94
#define	SPS	(TROFF? EMPTS(pts)/3: INCH/10)
95
#define	SS	(TROFF? 12: INCH/10)
96
#define	ICS	(TROFF? EMPTS(pts): 2*INCH/10)
97
#define	DTAB	(TROFF? (INCH/2): 0)
98
 
99
/* These "characters" are used to encode various internal functions
100
/* Some make use of the fact that most ascii characters between
101
/* 0 and 040 don't have any graphic or other function.
102
/* The few that do have a purpose (e.g., \n, \b, \t, ...
103
/* are avoided by the ad hoc choices here.
104
/* See ifilt[] in n1.c for others -- 1, 2, 3, 5, 6, 7, 010, 011, 012 
105
*/
106
 
107
#define	LEADER	001
108
#define	IMP	004	/* impossible char; glues things together */
109
#define	TAB	011
110
#define	RPT	014	/* next character is to be repeated many times */
111
#define	CHARHT	015	/* size field sets character height */
112
#define	SLANT	016	/* size field sets amount of slant */
113
#define	DRAWFCN	017	/* next several chars describe arb drawing fcns */
114
#	define	DRAWLINE	'l'	/* line: 'l' dx dy char */
115
#	define	DRAWCIRCLE	'c'	/* circle: 'c' r */
116
#	define	DRAWELLIPSE	'e'	/* ellipse: 'e' rx ry */
117
#	define	DRAWARC		'a'	/* arc: 'a' dx dy dx dy */
118
#	define	DRAWSPLINE	'~'	/* quadratic B spline: '~' dx dy dx dy ... */
119
					/* other splines go thru too */
120
/* NOTE:  the use of ~ is a botch since it's often used in .tr commands */
121
/* better to use a letter like s, but change it in the postprocessors too */
122
/* for now, this is taken care of in n9.c and t10.c */
123
#	define	DRAWBUILD	'b'	/* built-up character (e.g., { */
124
 
125
#define	LEFT	020	/* \{ */
126
#define	RIGHT	021	/* \} */
127
#define	FILLER	022	/* \& and similar purposes */
128
#define	XON	023	/* \X'...' starts here */
129
#define	OHC	024	/* optional hyphenation character \% */
130
#define	CONT	025	/* \c character */
131
#define	PRESC	026	/* printable escape */
132
#define	UNPAD	027	/* unpaddable blank */
133
#define	XPAR	030	/* transparent mode indicator */
134
#define	FLSS	031	/* next Tchar contains vertical space */
135
			/* used when recalling diverted text */
136
#define	WORDSP	032	/* paddable word space */
137
#define	ESC	033	/* current escape character */
138
#define	XOFF	034	/* \X'...' ends here */
139
			/* matches XON, but they will probably never nest */
140
			/* so could drop this when another control is needed */
141
#define	HX	035	/* next character is value of \x'...' */
142
#define MOTCH	036	/* this "character" is really motion; used by cbits() */
143
 
144
#define	HYPHEN	c_hyphen
145
#define	EMDASH	c_emdash	/* \(em */
146
#define	RULE	c_rule		/* \(ru */
147
#define	MINUS	c_minus		/* minus sign on current font */
148
#define	LIG_FI	c_fi		/* \(ff */
149
#define	LIG_FL	c_fl		/* \(fl */
150
#define	LIG_FF	c_ff		/* \(ff */
151
#define	LIG_FFI	c_ffi		/* \(Fi */
152
#define	LIG_FFL	c_ffl		/* \(Fl */
153
#define	ACUTE	c_acute		/* acute accent \(aa */
154
#define	GRAVE	c_grave		/* grave accent \(ga */
155
#define	UNDERLINE c_under	/* \(ul */
156
#define	ROOTEN	c_rooten	/* root en \(rn */
157
#define	BOXRULE	c_boxrule	/* box rule \(br */
158
#define	LEFTHAND c_lefthand	/* left hand for word overflow */
159
#define	DAGGER	 c_dagger	/* dagger for end of sentence/footnote */
160
 
161
#define	HYPHALG	1	/* hyphenation algorithm: 0=>good old troff, 1=>tex */
162
 
163
 
164
/* array sizes, and similar limits: */
165
 
166
#define MAXFONTS 99	/* Maximum number of fonts in fontab */
167
#define	NM	90	/* requests + macros */
168
#define	NN	NNAMES	/* number registers */
169
#define	NNAMES	15	/* predefined reg names */
170
#define	NIF	15	/* if-else nesting */
171
#define	NS	128	/* name buffer */
172
#define	NTM	1024	/* tm buffer */
173
#define	NEV	3	/* environments */
174
#define	EVLSZ	10	/* size of ev stack */
175
 
176
#define	STACKSIZE (12*1024)	/* stack for macros and strings in progress */
177
#define	NHYP	10	/* max hyphens per word */
178
#define	NHEX	512	/* byte size of exception word list */
179
#define	NTAB	100	/* tab stops */
180
#define	NSO	5	/* "so" depth */
181
#define	NMF	5	/* number of -m flags */
182
#define	WDSIZE	500	/* word buffer click size */
183
#define	LNSIZE	4000	/* line buffer click size */
184
#define	OLNSIZE	5000	/* output line buffer click; bigger for 'w', etc. */
185
#define	NDI	5	/* number of diversions */
186
 
187
#define	ALPHABET alphabet	/* number of characters in basic alphabet. */
188
			/* 128 for parochial USA 7-bit ascii, */
189
			/* 256 for "European" mode with e.g., Latin-1 */
190
 
191
	/* NCHARS must be greater than 
192
		ALPHABET (ascii stuff) + total number of distinct char names
193
		from all fonts that will be run in this job (including
194
		unnamed ones and \N's)
195
	*/
196
 
197
#define	NCHARS	(8*1024)	/* maximum size of troff character set*/
198
 
199
 
200
	/* However for nroff you want only :
201
	1. number of special codes in charset of DESC, which ends up being the
202
		value of nchtab and which must be less than 512.
203
	2. ALPHABET, which apparently is the size of the portion of the tables reserved
204
		for special control symbols
205
	Apparently the max N of \N is irrelevant; */
206
	/* to allow \N of up to 254 with up to 338 special characters
207
		you need NCHARS of 338 + ALPHABET = 466 */
208
 
209
#define	NROFFCHARS	1024	/* maximum size of nroff character set */
210
 
211
#define	NTRTAB		NCHARS	/* number of items in trtab[] */
212
#define NWIDCACHE	NCHARS	/* number of items in widcache[] */
213
 
214
#define	NTRAP	20	/* number of traps */
215
#define	NPN	20	/* numbers in "-o" */
216
#define	FBUFSZ	512	/* field buf size words */
217
#define	IBUFSZ	4096	/* bytes */
218
#define	NC	1024	/* cbuf size words */
219
#define	NOV	10	/* number of overstrike chars */
220
#define	NPP	10	/* pads per field */
221
 
222
/*
223
	Internal character representation:
224
	Internally, every character is carried around as
225
	a 32 bit cookie, called a "Tchar" (typedef long).
226
	Bits are numbered 31..0 from left to right.
227
	If bit 15 is 1, the character is motion, with
228
		if bit 16 it's vertical motion
229
		if bit 17 it's negative motion
230
	If bit 15 is 0, the character is a real character.
231
		if bit 31	zero motion
232
		bits 30..24	size
233
		bits 23..16	font
234
*/
235
 
236
/* in the following, "L" should really be a Tchar, but ... */
237
/* numerology leaves room for 16 bit chars */
238
 
239
#define	MOT	(01uL << 16)	/* motion character indicator */
240
#define	VMOT	(01uL << 30)	/* vertical motion bit */
241
#define	NMOT	(01uL << 29)	/* negative motion indicator */
242
/* #define	MOTV	(MOT|VMOT|NMOT)	/* motion flags */
243
/* #define	MAXMOT	(~MOTV)		/* maximum motion permitted */
244
#define	MAXMOT	0xFFFF
245
 
246
#define	ismot(n)	((n) & MOT)
247
#define	isvmot(n)	(((n) & (MOT|VMOT)) == (MOT|VMOT))	/* must have tested MOT previously */
248
#define	isnmot(n)	(((n) & (MOT|NMOT)) == (MOT|NMOT))	/* ditto */
249
#define	absmot(n)	((n) & 0xFFFF)
250
 
251
#define	ZBIT	(01uL << 31)	/* zero width char */
252
#define	iszbit(n)	((n) &  ZBIT)
253
 
254
#define	FSHIFT	17
255
#define	SSHIFT	(FSHIFT+7)
256
#define	SMASK		(0177uL << SSHIFT)	/* 128 distinct sizes */
257
#define	FMASK		(0177uL << FSHIFT)	/* 128 distinct fonts */
258
#define	SFMASK		(SMASK|FMASK)	/* size and font in a Tchar */
259
#define	sbits(n)	(((n) >> SSHIFT) & 0177)
260
#define	fbits(n)	(((n) >> FSHIFT) & 0177)
261
#define	sfbits(n)	(((n) & SFMASK) >> FSHIFT)
262
#define	cbits(n)	((n) & 0x1FFFF)		/* isolate character bits,  */
263
						/* but don't include motions */
264
extern	int	realcbits(Tchar);
265
 
266
#define	setsbits(n,s)	n = (n & ~SMASK) | (Tchar)(s) << SSHIFT
267
#define	setfbits(n,f)	n = (n & ~FMASK) | (Tchar)(f) << FSHIFT
268
#define	setsfbits(n,sf)	n = (n & ~SFMASK) | (Tchar)(sf) << FSHIFT
269
#define	setcbits(n,c)	n = (n & ~0xFFFFuL | (c))	/* set character bits */
270
 
271
#define	BYTEMASK 0377
272
#define	BYTE	 8
273
 
274
#define	SHORTMASK 0XFFFF
275
#define	SHORT	 16
276
 
277
#define	TABMASK	 ((unsigned) INT_MAX >> 1)
278
#define	RTAB	((TABMASK << 1) & ~TABMASK)
279
#define	CTAB	(RTAB << 1)
280
 
281
#define	TABBIT	02		/* bits in gchtab */
282
#define	LDRBIT	04
283
#define	FCBIT	010
284
 
285
#define	PAIR(A,B)	(A|(B<<SHORT))
286
 
287
 
288
extern	int	Inch, Hor, Vert, Unitwidth;
289
 
290
struct	Spnames
291
{
292
	int	*n;
293
	char	*v;
294
};
295
 
296
extern	Spnames	spnames[];
297
 
298
/*
299
	String and macro definitions are stored conceptually in a giant array
300
	indexed by type Offset.  In olden times, this array was real, and thus
301
	both huge and limited in size, leading to the "Out of temp file space"
302
	error.  In this version, the array is represented by a list of blocks,
303
	pointed to by blist[].bp.  Each block is of size BLK Tchars, and BLK
304
	MUST be a power of 2 for the macros below to work.
305
 
306
	The blocks associated with a particular string or macro are chained
307
	together in the array blist[].  Each blist[i].nextoff contains the
308
	Offset associated with the next block in the giant array, or -1 if
309
	this is the last block in the chain.  If .nextoff is 0, the block is
310
	free.
311
 
312
	To find the right index in blist for an Offset, divide by BLK.
313
*/
314
 
315
#define	NBLIST	2048	/* starting number of blocks in all definitions */
316
 
317
#define	BLK	128	/* number of Tchars in a block; must be 2^N with defns below */
318
 
319
#define	rbf0(o)		(blist[bindex(o)].bp[boffset(o)])
320
#define	bindex(o)	((o) / BLK)
321
#define	boffset(o)	((o) & (BLK-1))
322
#define	pastend(o)	(((o) & (BLK-1)) == 0)
323
/* #define	incoff(o)	( (++o & (BLK-1)) ? o : blist[bindex(o-1)].nextoff ) */
324
#define	incoff(o)	( (((o)+1) & (BLK-1)) ? o+1 : blist[bindex(o)].nextoff )
325
 
326
#define	skipline(f)	while (getc(f) != '\n')
327
#define is(s)		(strcmp(cmd, s) == 0)
328
#define	eq(s1, s2)	(strcmp(s1, s2) == 0)
329
 
330
 
331
typedef	unsigned long	Offset;		/* an offset in macro/string storage */
332
 
333
struct Blockp {		/* info about a block: */
334
	Tchar	*bp;		/* the data */
335
	Offset	nextoff;	/* offset of next block in a chain */
336
};
337
 
338
extern	Blockp	*blist;
339
 
340
#define	RD_OFFSET	(1 * BLK)	/* .rd command uses block 1 */
341
 
342
struct Diver {		/* diversion */
343
	Offset	op;
344
	int	dnl;
345
	int	dimac;
346
	int	ditrap;
347
	int	ditf;
348
	int	alss;
349
	int	blss;
350
	int	nls;
351
	int	mkline;
352
	int	maxl;
353
	int	hnl;
354
	int	curd;
355
};
356
 
357
struct Stack {		/* stack frame */
358
	int	nargs;
359
	Stack	*pframe;
360
	Offset	pip;
361
	int	pnchar;
362
	Tchar	prchar;
363
	int	ppendt;
364
	Tchar	pch;
365
	Tchar	*lastpbp;
366
	int	mname;
367
};
368
 
369
extern	Stack	s;
370
 
371
struct Divsiz {
372
	int dix;
373
	int diy;
374
};
375
 
376
struct Contab {		/* command or macro */
377
	unsigned int	rq;
378
	Contab	*link;
379
	void	(*f)(void);
380
	Offset	mx;
381
	Offset	emx;
382
	Divsiz	*divsiz;
383
};
384
 
385
#define	C(a,b)	{a, 0, b, 0, 0}		/* how to initialize a contab entry */
386
 
387
extern	Contab	contab[NM];
388
 
389
struct Numtab {	/* number registers */
390
	unsigned int	r;		/* name */
391
	int	val;
392
	short	fmt;
393
	short	inc;
394
	Numtab	*link;
395
};
396
 
397
extern	Numtab	numtab[NN];
398
 
399
#define	PN	0
400
#define	NL	1
401
#define	YR	2
402
#define	HP	3
403
#define	CT	4
404
#define	DN	5
405
#define	MO	6
406
#define	DY	7
407
#define	DW	8
408
#define	LN	9
409
#define	DL	10
410
#define	ST	11
411
#define	SB	12
412
#define	CD	13
413
#define	PID	14
414
 
415
struct	Wcache {	/* width cache, indexed by character */
416
	short	fontpts;
417
	short	width;
418
};
419
 
420
struct	Tbuf {		/* growable Tchar buffer */
421
	Tchar *_bufp;
422
	unsigned int _size;
423
};
424
 
425
/* the infamous environment block */
426
 
427
#define	ics	envp->_ics
428
#define	sps	envp->_sps
429
#define	spacesz	envp->_spacesz
430
#define	lss	envp->_lss
431
#define	lss1	envp->_lss1
432
#define	ll	envp->_ll
433
#define	ll1	envp->_ll1
434
#define	lt	envp->_lt
435
#define	lt1	envp->_lt1
436
#define	ic	envp->_ic
437
#define	icf	envp->_icf
438
#define	chbits	envp->_chbits
439
#define	spbits	envp->_spbits
440
#define	nmbits	envp->_nmbits
441
#define	apts	envp->_apts
442
#define	apts1	envp->_apts1
443
#define	pts	envp->_pts
444
#define	pts1	envp->_pts1
445
#define	font	envp->_font
446
#define	font1	envp->_font1
447
#define	ls	envp->_ls
448
#define	ls1	envp->_ls1
449
#define	ad	envp->_ad
450
#define	nms	envp->_nms
451
#define	ndf	envp->_ndf
452
#define	nmwid	envp->_nmwid
453
#define	fi	envp->_fi
454
#define	cc	envp->_cc
455
#define	c2	envp->_c2
456
#define	ohc	envp->_ohc
457
#define	tdelim	envp->_tdelim
458
#define	hyf	envp->_hyf
459
#define	hyoff	envp->_hyoff
460
#define	hyphalg	envp->_hyphalg
461
#define	un1	envp->_un1
462
#define	tabc	envp->_tabc
463
#define	dotc	envp->_dotc
464
#define	adsp	envp->_adsp
465
#define	adrem	envp->_adrem
466
#define	lastl	envp->_lastl
467
#define	nel	envp->_nel
468
#define	admod	envp->_admod
469
#define	wordp	envp->_wordp
470
#define	spflg	envp->_spflg
471
#define	linep	envp->_linep
472
#define	wdend	envp->_wdend
473
#define	wdstart	envp->_wdstart
474
#define	wne	envp->_wne
475
#define	ne	envp->_ne
476
#define	nc	envp->_nc
477
#define	nb	envp->_nb
478
#define	lnmod	envp->_lnmod
479
#define	nwd	envp->_nwd
480
#define	nn	envp->_nn
481
#define	ni	envp->_ni
482
#define	ul	envp->_ul
483
#define	cu	envp->_cu
484
#define	ce	envp->_ce
485
#define	in	envp->_in
486
#define	in1	envp->_in1
487
#define	un	envp->_un
488
#define	wch	envp->_wch
489
#define	pendt	envp->_pendt
490
#define	pendw	envp->_pendw
491
#define	pendnf	envp->_pendnf
492
#define	spread	envp->_spread
493
#define	it	envp->_it
494
#define	itmac	envp->_itmac
495
#define	hyptr	envp->_hyptr
496
#define	tabtab	envp->_tabtab
497
#define	line	envp->_line._bufp
498
#define	lnsize	envp->_line._size
499
#define	word	envp->_word._bufp
500
#define wdsize	envp->_word._size
501
 
502
#define oline	_oline._bufp
503
#define olnsize	_oline._size
504
 
505
/*
506
 * Note:
507
 * If this structure changes in ni.c, you must change
508
 * this as well, and vice versa.
509
 */
510
 
511
struct Env {
512
	int	_ics;
513
	int	_sps;
514
	int	_spacesz;
515
	int	_lss;
516
	int	_lss1;
517
	int	_ll;
518
	int	_ll1;
519
	int	_lt;
520
	int	_lt1;
521
	Tchar	_ic;
522
	int	_icf;
523
	Tchar	_chbits;
524
	Tchar	_spbits;
525
	Tchar	_nmbits;
526
	int	_apts;
527
	int	_apts1;
528
	int	_pts;
529
	int	_pts1;
530
	int	_font;
531
	int	_font1;
532
	int	_ls;
533
	int	_ls1;
534
	int	_ad;
535
	int	_nms;
536
	int	_ndf;
537
	int	_nmwid;
538
	int	_fi;
539
	int	_cc;
540
	int	_c2;
541
	int	_ohc;
542
	int	_tdelim;
543
	int	_hyf;
544
	int	_hyoff;
545
	int	_hyphalg;
546
	int	_un1;
547
	int	_tabc;
548
	int	_dotc;
549
	int	_adsp;
550
	int	_adrem;
551
	int	_lastl;
552
	int	_nel;
553
	int	_admod;
554
	Tchar	*_wordp;
555
	int	_spflg;
556
	Tchar	*_linep;
557
	Tchar	*_wdend;
558
	Tchar	*_wdstart;
559
	int	_wne;
560
	int	_ne;
561
	int	_nc;
562
	int	_nb;
563
	int	_lnmod;
564
	int	_nwd;
565
	int	_nn;
566
	int	_ni;
567
	int	_ul;
568
	int	_cu;
569
	int	_ce;
570
	int	_in;
571
	int	_in1;
572
	int	_un;
573
	int	_wch;
574
	int	_pendt;
575
	Tchar	*_pendw;
576
	int	_pendnf;
577
	int	_spread;
578
	int	_it;
579
	int	_itmac;
580
	Tchar	*_hyptr[NHYP];
581
	long	_tabtab[NTAB];
582
	Tbuf	_line;
583
	Tbuf	_word;
584
};
585
 
586
extern	Env	env[];
587
extern	Env	*envp;
588
 
589
enum {	MBchar = 'U', Troffchar = 'C', Number = 'N', Install = 'i', Lookup = 'l' };
590
	/* U => utf, for instance;  C => \(xx, N => \N'...' */
591
 
592
 
593
 
594
struct Chwid {	/* data on one character */
595
	Ushort	num;		/* character number:
596
 
597
					>= ALPHABET -> its number among all Cxy's */
598
	Ushort	code;		/* char code for actual device.  used for \N */
599
	char	*str;		/* code string for nroff */
600
	Uchar	wid;		/* width */
601
	Uchar	kern;		/* ascender/descender */
602
};
603
 
604
struct Font {	/* characteristics of a font */
605
	int	name;		/* int name, e.g., BI (2 chars) */
606
	char	longname[64];	/* long name of this font (e.g., "Bembo" */
607
	char	*truename;	/* path name of table if not in standard place */
608
	int	nchars;		/* number of width entries for this font */
609
	char	specfont;	/* 1 == special font */
610
	int	spacewidth;	/* width of space on this font */
611
	int	defaultwidth;	/* default width of characters on this font */
612
	Chwid	*wp;		/* widths, etc., of the real characters */
613
	char	ligfont;	/* 1 == ligatures exist on this font */
614
};
615
 
616
/* ligatures, ORed into ligfont */
617
 
618
#define	LFF	01
619
#define	LFI	02
620
#define	LFL	04
621
#define	LFFI	010
622
#define	LFFL	020
623
 
624
/* tracing modes */
625
#define TRNARGS	01		/* trace legality of numeric arguments */
626
#define TRREQ	02		/* trace requests */
627
#define TRMAC	04		/* trace macros */
628
#define RQERR	01		/* processing request/macro */
629
 
630
/* typewriter driving table structure */
631
 
632
 
633
extern	Term	t;
634
struct Term {
635
	int	bset;		/* these bits have to be on */
636
	int	breset;		/* these bits have to be off */
637
	int	Hor;		/* #units in minimum horiz motion */
638
	int	Vert;		/* #units in minimum vert motion */
639
	int	Newline;	/* #units in single line space */
640
	int	Char;		/* #units in character width */
641
	int	Em;		/* ditto */
642
	int	Halfline;	/* half line units */
643
	int	Adj;		/* minimum units for horizontal adjustment */
644
	char	*twinit;	/* initialize terminal */
645
	char	*twrest;	/* reinitialize terminal */
646
	char	*twnl;		/* terminal sequence for newline */
647
	char	*hlr;		/* half-line reverse */
648
	char	*hlf;		/* half-line forward */
649
	char	*flr;		/* full-line reverse */
650
	char	*bdon;		/* turn bold mode on */
651
	char	*bdoff;		/* turn bold mode off */
652
	char	*iton;		/* turn italic mode on */
653
	char	*itoff;		/* turn italic mode off */
654
	char	*ploton;	/* turn plot mode on */
655
	char	*plotoff;	/* turn plot mode off */
656
	char	*up;		/* sequence to move up in plot mode */
657
	char	*down;		/* ditto */
658
	char	*right;		/* ditto */
659
	char	*left;		/* ditto */
660
 
661
	Font	tfont;		/* widths and other info, as in a troff font */
662
};
663
 
664
extern	Term	t;
665
 
666
/*
667
 * for error reporting; keep track of escapes/requests with numeric arguments
668
 */
669
struct Numerr {
670
	char	type;	/* request or escape? */
671
	char	esc;	/* was escape sequence named esc */
672
	char	escarg;	/* argument of esc's like \D'l' */
673
	unsigned int	req;	/* was request or macro named req */
674
};