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