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