1 /*
2  * @(#)tdef.h	2.5 (Berkeley) 02/25/93
3  */
4 
5 /* starting values for typesetting parameters: */
6 
7 #define	PS	10	/* default point size */
8 #define	FT	1	/* default font position */
9 #define ULFONT	2	/* default underline font */
10 #define	BDFONT	3	/* default emboldening font */
11 #define	BIFONT	4	/* default bold italic font */
12 #define STIP	1	/* default stipple */
13 #define	LL	(unsigned) 65*INCH/10	/* line length; 39picas=6.5in */
14 #define	VS	((12*INCH)/72)	/* initial vert space */
15 
16 #ifdef	NROFF
17 #	define	EM	t.Em
18 #	define	HOR	t.Adj
19 #	define	VERT	t.Vert
20 #	define	INCH	240	/* increments per inch */
21 #	define	SPS	INCH/10	/* space size */
22 #	define	SS	INCH/10	/* " */
23 #	define	TRAILER	0
24 #	define	PO	0 /* page offset */
25 #	define	ASCII	1
26 #	define	LG	0
27 #	define	DTAB	0	/* set at 8 Ems at init time */
28 #	define	ICS	2*SPS
29 #endif
30 #ifndef NROFF	/* TROFF */
31 	/* Inch is set by ptinit() when troff started.
32 	/* all derived values set then too
33 	*/
34 #	define	INCH	Inch	/* troff resolution -- number of goobies/inch  */
35 #	define	POINT	(INCH/72)	/* goobies per point (1/72 inch) */
36 #	define	HOR	Hor	/* horizontal resolution in goobies */
37 #	define	VERT	Vert	/* vertical resolution in goobies */
38 #	define	SPS	(EM/3)	/* space size  */
39 #	define	SS	12	/* space size in 36ths of an em */
40 #	define	PO	(INCH)	/* page offset 1 inch */
41 /* #	define	EM	(POINT * pts) */
42 #define	EM	(((long) INCH * pts + 36) / 72)	/* don't lose significance */
43 #define	EMPTS(pts)	(((long) INCH * (pts) + 36) / 72)
44 #	define	ASCII	0
45 #	define	LG	1
46 #	define	DTAB	(INCH/2)
47 #	define	ICS	3*SPS
48 #endif
49 
50 /* These "characters" are used to encode various internal functions
51 /* Some make use of the fact that most ascii characters between
52 /* 0 and 040 don't have any graphic or other function.
53 /* The few that do have a purpose (e.g., \n, \b, \t, ...
54 /* are avoided by the ad hoc choices here.
55 /* See ifilt[] in n1.c for others -- 1, 2, 3, 5, 6, 7, 010, 011, 012
56 */
57 
58 #define	LEADER	001
59 #define	IMP	004	/* impossible char; glues things together */
60 #define	TAB	011
61 #define	RPT	014	/* next character is to be repeated many times */
62 #define	CHARHT	015	/* size field sets character height */
63 #define	SLANT	016	/* size field sets amount of slant */
64 #define	DRAWFCN	017	/* next several chars describe arb drawing fcn */
65 			/* style: 's' m */
66 			/* thickness: 't' w */
67 			/* line: 'l' dx dy char */
68 			/* circle: 'c' r */
69 			/* ellipse: 'e' rx ry */
70 			/* arc: 'a' dx dy r */
71 			/* wiggly line '~' x y x y ... */
72 			/*	or     'g' x y x y ... */
73 #define DRAWTHICK	't'
74 #define DRAWSTYLE	's'
75 #define	DRAWLINE	'l'
76 #define	DRAWCIRCLE	'c'	/* circle */
77 #define	DRAWELLIPSE	'e'
78 #define	DRAWARC		'a'	/* arbitrary arc */
79 #define DRAWCURVE	'g'	/* gremlin spline */
80 #define	DRAWWIG		'~'	/* wiggly line with spline */
81 #define	DRAWSPLINE	'~'	/* quadratic B spline */
82 #define	DRAWPOLY	'p'	/* polygon with stipples */
83 #define	DRAWUBPOLY	'P'	/* polygon, stipples, no border */
84 
85 #define	LEFT	020	/* \{ */
86 #define	RIGHT	021	/* \} */
87 #define	FILLER	022	/* \& and similar purposes */
88 #define	XON	023	/* \X'...' starts here */
89 #define	OHC	024	/* optional hyphenation character \% */
90 #define	CONT	025	/* \c character */
91 #define	PRESC	026	/* printable escape */
92 #define	UNPAD	027	/* unpaddable blank */
93 #define	XPAR	030	/* transparent mode indicator */
94 #define	FLSS	031
95 #define	WORDSP	032	/* paddable word space */
96 #define	ESC	033
97 #define	XOFF	034	/* \X'...' ends here */
98 
99 #define	iscontrol(n)	(n==035 || n==036)	/* used to test the next two */
100 #define	HX	035	/* next character is value of \x'...' */
101 #define MAXFONTS	99	/* Max number of mounted fonts (in fontab) */
102 
103 #define	HYPHEN	c_hyphen
104 #define	EMDASH	c_emdash	/* \(em */
105 #define	RULE	c_rule		/* \(ru */
106 #define	MINUS	c_minus		/* minus sign on current font */
107 #define	LIG_FI	c_fi		/* \(ff */
108 #define	LIG_FL	c_fl		/* \(fl */
109 #define	LIG_FF	c_ff		/* \(ff */
110 #define	LIG_FFI	c_ffi		/* \(Fi */
111 #define	LIG_FFL	c_ffl		/* \(Fl */
112 #define	ACUTE	c_acute		/* acute accent \(aa */
113 #define	GRAVE	c_grave		/* grave accent \(ga */
114 #define	UNDERLINE c_under	/* \(ul */
115 #define	ROOTEN	c_rooten	/* root en \(rn */
116 #define	BOXRULE	c_boxrule	/* box rule \(br */
117 #define	LEFTHAND c_lefthand	/* left hand for word overflow */
118 #define	DAGGER	c_dagger	/* dagger for footnotes */
119 
120 /* array sizes, and similar limits: */
121 
122 #define	NFONT	128	/* maximum number of fonts (including specials) */
123 #define	NN	400	/* number registers */
124 #define	NNAMES	15	 /* predefined reg names */
125 #define	NIF	15	/* if-else nesting */
126 #define	NS	128	/* name buffer */
127 #define	NTM	256	/* tm buffer */
128 #define	NEV	3	/* environments */
129 #define	EVLSZ	10	/* size of ev stack */
130 #define	DSIZE	2048	/* disk sector size in chars */
131 
132 #define	NM	500	/* requests + macros */
133 #define	DELTA	8192	/* delta core bytes */
134 #define	NHYP	10	/* max hyphens per word */
135 #define	NHEX	128	/* byte size of exception word list */
136 #define	NTAB	40	/* tab stops */
137 #define	NSO	5	/* "so" depth */
138 #define	WDSIZE	270	/* word buffer size */
139 #define	LNSIZE	1024	/* line buffer size */
140 #define	NDI	5	/* number of diversions */
141 #define	NTRTAB	512	/* number of items in trtab[] */
142 #define NWIDCACHE 512	/* number of items in widcache[] */
143 #define	NTRAP	20	/* number of traps */
144 #define	NPN	20	/* numbers in "-o" */
145 #define	FBUFSZ	256	/* field buf size words */
146 #define	IBUFSZ	8192	/* bytes */
147 #define	NC	1024	/* cbuf size words */
148 #define	NOV	10	/* number of overstrike chars */
149 #define	NPP	10	/* pads per field */
150 
151 /*
152 	Internal character representation:
153 	Internally, every character is carried around as
154 	a 32 bit cookie, called a "tchar" (typedef long).
155 	Bits are numbered 31..0 from left to right.
156 	If bit 15 is 1, the character is motion, with
157 		if bit 16 it's vertical motion
158 		if bit 17 it's negative motion
159 	If bit 15 is 0, the character is a real character.
160 		if bit 31	zero motion
161 		bits 30..24	size
162 		bits 23..16	font
163 		bit 8		absolute char number in 7..0
164 	This implies at most 256-32 characters in a single font,
165 	which is going to be a problem somewhere
166 */
167 
168 /* in the following, "L" should really be a tchar, but ... */
169 
170 #define	MOT	(01L<<15)	/* motion character indicator */
171 #define	MOTV	(07L<<15)	/* clear for motion part */
172 #define	VMOT	(01L<<16)	/* vert motion bit */
173 #define	NMOT	(01L<<17)	/* negative motion indicator*/
174 #define	MAXMOT	32767	/* bad way to write this!!! */
175 #define	ismot(n)	((n) & MOT)
176 #define	isvmot(n)	((n) & VMOT)	/* must have tested MOT previously */
177 #define	isnmot(n)	((n) & NMOT)	/* ditto */
178 #define	absmot(n)	(unsigned)(0177777 & (n) & ~MOT)	/* (short) is cheap mask */
179 
180 #define	ZBIT	(01L << 31)	/* zero width char */
181 #define	iszbit(n)	((n) & ZBIT)
182 #define	ABSCHAR		0400	/* absolute char number in this font */
183 
184 #define	SMASK		(0177L << 24)
185 #define	FMASK		(0377L << 16)
186 #define	SFMASK		(SMASK|FMASK)	/* size and font in a tchar */
187 #define	sbits(n)	(((n) >> 24) & 0177)
188 #define	fbits(n)	(((n) >> 16) & 0377)
189 #define	sfbits(n)	(unsigned)(0177777 & (((n) & SFMASK) >> 16))
190 #define	cbits(n)	(unsigned)(0177777 & (n))	/* isolate bottom 16 bits  */
191 #define	absbits(n)	(cbits(n) & ~ABSCHAR)
192 
193 #define	setsbits(n,s)	n = (n & ~SMASK) | (tchar)(s) << 24
194 #define	setfbits(n,f)	n = (n & ~FMASK) | (tchar)(f) << 16
195 #define	setsfbits(n,sf)	n = (n & ~SFMASK) | (tchar)(sf) << 16
196 #define	setcbits(n,c)	n = (n & ~077777L | (c))	/* set character bits */
197 
198 #define	BYTEMASK	0377
199 #define	BYTE	8
200 
201 #define	ZONE	5	/* 5 hrs for EST */
202 #define	TABMASK	 037777
203 #define	RTAB	(unsigned) 0100000
204 #define	CTAB	040000
205 
206 #define	TABBIT	02		/* bits in gchtab */
207 #define	LDRBIT	04
208 #define	FCBIT	010
209 
210 #define	PAIR(A,B)	(A|(B<<BYTE))
211 
212 #define	oput(c)	putc(c, ptid)
213 
214 /*
215  * "temp file" parameters.  macros and strings
216  * are stored in an array of linked blocks,
217  * which may be in memory if INCORE is set during
218  * compilation, or otherwise in a file.
219  * The numerology is delicate if filep is 16 bits:
220 	#define BLK 128
221 	#define NBLIST 512
222  * i.e., the product is 16 bits long.
223 
224  * If filep is an unsigned long (and if your
225  * compiler will let you say that) then NBLIST
226  * can be a lot bigger.  Of course that makes
227  * the file or core image a lot bigger too,
228  * and means you don't detect missing diversion
229  * terminations as quickly... .
230  * It also means that you may have trouble running
231  * on non-swapping systems, since the core image
232  * will be over 1Mb.
233 
234  * In any case, both must be powers of 2.
235  */
236 
237 typedef unsigned int filep;	/* this is good for 32 bit machines */
238 
239 #define	BLK	128	/* alloc block in tchars */
240 #ifdef SMALLER
241 
242 #define NBLIST	1024
243 
244 #else
245 
246 #define	NBLIST	2048	/* allocation list.  smallish machines use 1024, bigger use 2048 */
247 
248 #endif
249 
250 typedef	long	tchar;	/* as an experiment */
251 
252 extern	tchar	getch(), getch0();
253 extern	tchar	rbf(), rbf0();
254 extern	tchar	mot(), hmot(), vmot();
255 extern	tchar	makem(), sethl();
256 extern	tchar	popi();
257 extern	tchar	getlg();
258 extern	tchar	xlss();
259 extern	tchar	setfield();
260 extern	tchar	setz();
261 extern	tchar	setch();
262 extern	tchar	setht(), setslant();
263 
264 #define	atoi(i)		((int) atoi0(i))
265 extern	long	atoi0();
266 
267 extern	int	Inch, Hor, Vert, Unitwidth;
268 
269 /* these characters are used as various signals or values
270 /* in miscellaneous places.
271 /* values are set in specnames in t10.c
272 */
273 
274 extern int	c_hyphen;
275 extern int	c_emdash;
276 extern int	c_rule;
277 extern int	c_minus;
278 extern int	c_fi;
279 extern int	c_fl;
280 extern int	c_ff;
281 extern int	c_ffi;
282 extern int	c_ffl;
283 extern int	c_acute;
284 extern int	c_grave;
285 extern int	c_under;
286 extern int	c_rooten;
287 extern int	c_boxrule;
288 extern int	c_lefthand;
289 extern int	c_dagger;
290 
291 struct	d {	/* diversion */
292 	filep	op;
293 	int	dnl;
294 	int	dimac;
295 	int	ditrap;
296 	int	ditf;
297 	int	alss;
298 	int	blss;
299 	int	nls;
300 	int	mkline;
301 	int	maxl;
302 	int	hnl;
303 	int	curd;
304 };
305 
306 struct	s {	/* stack frame */
307 	int	nargs;
308 	struct s *pframe;
309 	filep	pip;
310 	int	pnchar;
311 	tchar	prchar;
312 	int	ppendt;
313 	tchar	pch;
314 	tchar	*lastpbp;
315 	int	mname;
316 };
317 
318 extern struct contab {
319 	unsigned short	rq;
320 	struct	contab *link;
321 	int	(*f)();
322 	unsigned mx;
323 } contab[NM];
324 
325 extern struct numtab {
326 	short	r;		/* name */
327 	short	fmt;
328 	short	inc;
329 	int	val;
330 	struct	numtab *link;
331 } numtab[NN];
332 
333 #define	PN	0
334 #define	NL	1
335 #define	YR	2
336 #define	HP	3
337 #define	CT	4
338 #define	DN	5
339 #define	MO	6
340 #define	DY	7
341 #define	DW	8
342 #define	LN	9
343 #define	DL	10
344 #define	ST	11
345 #define	SB	12
346 #define	CD	13
347 #define	PID	14
348 
349 /* the infamous environment block */
350 
351 #define	ics	(env->_ics)
352 #define	sps	(env->_sps)
353 #define	spacesz	(env->_spacesz)
354 #define	lss	(env->_lss)
355 #define	lss1	(env->_lss1)
356 #define	ll	(env->_ll)
357 #define	ll1	(env->_ll1)
358 #define	lt	(env->_lt)
359 #define	lt1	(env->_lt1)
360 #define	ic	(env->_ic)
361 #define	icf	(env->_icf)
362 #define	chbits	(env->_chbits)
363 #define	spbits	(env->_spbits)
364 #define	nmbits	(env->_nmbits)
365 #define	apts	(env->_apts)
366 #define	apts1	(env->_apts1)
367 #define	pts	(env->_pts)
368 #define	pts1	(env->_pts1)
369 #define	font	(env->_font)
370 #define	font1	(env->_font1)
371 #define	ls	(env->_ls)
372 #define	ls1	(env->_ls1)
373 #define	ad	(env->_ad)
374 #define	nms	(env->_nms)
375 #define	ndf	(env->_ndf)
376 #define	fi	(env->_fi)
377 #define	cc	(env->_cc)
378 #define	c2	(env->_c2)
379 #define	ohc	(env->_ohc)
380 #define	tdelim	(env->_tdelim)
381 #define	hyf	(env->_hyf)
382 #define	hyoff	(env->_hyoff)
383 #define hyalg	(env->_hyalg)
384 #define hyalg1	(env->_hyalg1)
385 #define	thresh	(env->_thresh)
386 #define	un1	(env->_un1)
387 #define	tabc	(env->_tabc)
388 #define	dotc	(env->_dotc)
389 #define	adsp	(env->_adsp)
390 #define	adrem	(env->_adrem)
391 #define	lastl	(env->_lastl)
392 #define	nel	(env->_nel)
393 #define	admod	(env->_admod)
394 #define	wordp	(env->_wordp)
395 #define	spflg	(env->_spflg)
396 #define	linep	(env->_linep)
397 #define	wdend	(env->_wdend)
398 #define	wdstart	(env->_wdstart)
399 #define	wne	(env->_wne)
400 #define	ne	(env->_ne)
401 #define	nc	(env->_nc)
402 #define	nb	(env->_nb)
403 #define	lnmod	(env->_lnmod)
404 #define	nwd	(env->_nwd)
405 #define	nn	(env->_nn)
406 #define	ni	(env->_ni)
407 #define	ul	(env->_ul)
408 #define	cu	(env->_cu)
409 #define	ce	(env->_ce)
410 #define	in	(env->_in)
411 #define	in1	(env->_in1)
412 #define	un	(env->_un)
413 #define	wch	(env->_wch)
414 #define	pendt	(env->_pendt)
415 #define	pendw	(env->_pendw)
416 #define	pendnf	(env->_pendnf)
417 #define	spread	(env->_spread)
418 #define	it	(env->_it)
419 #define	itmac	(env->_itmac)
420 #define	lnsize	(env->_lnsize)
421 #define	hyptr	(env->_hyptr)
422 #define	tabtab	(env->_tabtab)
423 #define	line	(env->_line)
424 #define	word	(env->_word)
425 #define	stip1	(env->_stip1)
426 #define	stip	(env->_stip)
427 
428 /*
429  * Note (jaap)
430  * If this structure changes in ni.c, you should change
431  * this as well
432  */
433 struct env {
434 	int	_ics;
435 	int	_sps;
436 	int	_spacesz;
437 	int	_lss;
438 	int	_lss1;
439 	int	_ll;
440 	int	_ll1;
441 	int	_lt;
442 	int	_lt1;
443 	tchar	_ic;
444 	int	_icf;
445 	tchar	_chbits;
446 	tchar	_spbits;
447 	tchar	_nmbits;
448 	int	_apts;
449 	int	_apts1;
450 	int	_pts;
451 	int	_pts1;
452 	int	_font;
453 	int	_font1;
454 	int	_ls;
455 	int	_ls1;
456 	int	_ad;
457 	int	_nms;
458 	int	_ndf;
459 	int	_fi;
460 	int	_cc;
461 	int	_c2;
462 	int	_ohc;
463 	int	_tdelim;
464 	int	_hyf;
465 	int	_hyoff;
466 	int	_hyalg;
467 	int	_hyalg1;
468 	int	_thresh;
469 	int	_un1;
470 	int	_tabc;
471 	int	_dotc;
472 	int	_adsp;
473 	int	_adrem;
474 	int	_lastl;
475 	int	_nel;
476 	int	_admod;
477 	tchar	*_wordp;
478 	int	_spflg;
479 	tchar	*_linep;
480 	tchar	*_wdend;
481 	tchar	*_wdstart;
482 	int	_wne;
483 	int	_ne;
484 	int	_nc;
485 	int	_nb;
486 	int	_lnmod;
487 	int	_nwd;
488 	int	_nn;
489 	int	_ni;
490 	int	_ul;
491 	int	_cu;
492 	int	_ce;
493 	int	_in;
494 	int	_in1;
495 	int	_un;
496 	int	_wch;
497 	int	_pendt;
498 	tchar	*_pendw;
499 	int	_pendnf;
500 	int	_spread;
501 	int	_it;
502 	int	_itmac;
503 	int	_lnsize;
504 	int	_stip;
505 	int	_stip1;
506 	tchar	*_hyptr[NHYP];
507 	int	_tabtab[NTAB];
508 	tchar	_line[LNSIZE];
509 	tchar	_word[WDSIZE];
510 };
511 
512 extern struct env *env;
513 extern struct env env_array[];
514 
515 /*
516  * All changes will come after this comment (jaap)
517  */
518 
519 /*
520  * hyphenation dependent stuff (jaap)
521  */
522 #define THRESH 160	/*digram goodness threshold (from n8.c, (jaap))*/
523 #define	DUTCH_THRESH	3	/* for recursive bestesplits (jaap) */
524 
525 #define ORIGINAL	0	/* original (American) English) algorithm */
526 #define DUTCH		1	/* second hyphenation routine (bestesplits) */
527 #define	MAXDIALECTS	1	/* number of hyphenation algorithms */
528 
529 /*
530  * define enough space for the fontcache. EXTRAFONT is maximum space
531  * currently to be used by a font. The space for the fonttab is
532  * for the "logical to physical font table mapping addition (jaap).
533  */
534 #define MAXCHARS	255	/* current maximum of characters in a font */
535 
536 #ifdef CWI
537 #define EXTRAFONT (3*MAXCHARS * sizeof(char) + dev.nchtab + (128-32) \
538 	* sizeof(char) + sizeof(struct Font) + 255 * sizeof(short))
539 #else
540 #define EXTRAFONT (3*MAXCHARS * sizeof(char) + dev.nchtab + (128-32) \
541 	* sizeof(char) + sizeof(struct Font))
542 #endif
543 
544 #include <stdio.h>
545 #define fdprintf fprintf
546 #define flusho()
547