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