V10/cmd/troff/ancient.nroff/tdef.hd

/*	tdef.hd  --  Definitions for the C pre-processor.
 *
 *
 *
 *
 *	The first defines here (copied from the first page of n1.c)
 *	control the generation of various permutations of the nroff/
 *	troff programs.  This single set of source files generates
 *	both nroff and troff, on the PDP-11, VAX, UNIVAC UNIX, TSO
 *	(as in IBM), and soon () the 3B-20 Processors without
 *	any special compilation procedures, except for the need to define
 *	the symbol 'NROFF' when compiling nroff.  By default, compilation
 *	will produce troff.
 *
 *	Some other compilation options are available for building
 *	a customized version of nroff or troff.  A list of definable
 *	symbols and their effect is given here:
 *
 *
 *  SMALL	Produce a version of nroff or troff that uses a
 *		minimum amount of instruction space.  This symbol
 *		automatically defines NDIAGS and NOCOMPACT (see below).
 *		It also causes the following features to be missing:
 *		requests ! and pi, troff paper accounting.
 *
 *  INCORE	Causes nroff/troff to keep both the suffix table (for
 *		hyphenation) and the /tmp file in main memory.
 *		This version of nroff/troff has a minimum of inter-
 *		action with the operating system, but a maximum of
 *		main memory size.  Not recommended on minis, and probably
 *		won't work at all on the 11.  It also uses standard
 *		I/O, and hence is portable to non-UNIX C environments.
 *		Automatically sets NOCOMPACT.
 *
 *  NDIAGS	Causes the pm request to not be included.
 *
 *  NOCOMPACT	Produces an nroff/troff without compacted macros.  The
 *		-c command line option is synonymous with -m, and
 *		the -k option is missing.
 *
 *  tso		Use TSO-style standard I/O
 *
 *
 *	All these symbols will cause a suitably modified 'what' command
 *	response when applied to the object nroff or troff.
 *
 *	Finally, the symbols expected to be set by the C compiler are:
 *
 *  unix	If this is the UNIX operating system.  If this symbol
 *		is not defined, it causes the automatic definition of
 *		INCORE, SMALL, and tso.  The latter is used to control
 *		generation of standard I/O calls.
 *
 *  ebcdic	Produces code to run on a machine with ebcdic as its native
 *		character set.  nroff/troff still runs in ASCII internally
 *		and expects ASCII input, but does produce ebcdic on the
 *		standard output channel.
 *
 */



#ifndef unix
#define INCORE
#define SMALL
#define tso
#endif
#ifdef SMALL
#define NDIAGS
#define NOCOMPACT
#endif
#ifdef INCORE
#define NOCOMPACT
#endif
/* the following define is the version number of nroff/troff */
#define NTVER "@(#)roff.src	1.123"
#ifdef NROFF	/*NROFF*/
#define EM t.Em
#define HOR t.Adj
#define VERT t.Vert
#define INCH 240	/*increments per inch*/
#define SPS INCH/10	/*space size*/
#define SS INCH/10	/* " */
#define TRAILER 0
#define UNPAD 0227
#define PO 0 /*page offset*/
#define ASCII 1
#define PTID 1
#define LG 0
#define DTAB 0	/*set at 8 Ems at init time*/
#define ICS 2*SPS
#endif
#ifndef NROFF	/*TROFF*/
#define INCH 432	/*troff resolution*/
#define SPS 20	/*space size at 10pt; 1/3 Em*/
#define SS 12	/*space size in 36ths of an em*/
#define TRAILER 4968	/*144*11.5*3 = 11.5 inches*/
#define UNPAD 027
#define PO 416 /*page offset 26/27ths inch*/
#define HOR 1
#define VERT 3
#define EM (6*(pts&077))
#define ASCII 0
#define PTID 0
#define LG 1
#define DTAB (INCH/2)
#define ICS 3*SPS
#endif

#ifdef INCORE
#define NMACS 100	/* max number of nested macro calls */
#define MARGL 512	/* max total length of macro args */
#define TSTBUF 1000	/* terminal strings buffer */
#endif
#ifdef unix
#include <signal.h>
#endif
#ifdef tso
#include "stdio.h"
#endif
#define BSIZE 512	/* size of any IO buffers */
#define ARGLEN 50	/* exec request (!) argument length (approx) */
#define NARSP 0177	/*narrow space*/
#define HNSP 0226	/*half narrow space*/
#define PS 10	/*default point size*/
#define FT 0	/*default font position*/
#define LL 65*INCH/10	/*line length; 39picas=6.5in*/
#define VS INCH/6	/*vert space; 12points*/
#define NN 300	/*number registers*/
#define NNAMES 14 /*predefined reg names*/
#define NIF 15	/*if-else nesting*/
#define NS 64	/*name buffer*/
#define NSN 4	/* number of macro packages per command line */
		/* NOTE: must change with definition of nextf in ni.c */
#define NTM 256	/*tm buffer*/
#define NEV 3	/*environments*/
#define EVLSZ 10	/*size of ev stack*/
#define NM 350	/*requests + macros*/
#define DELTA (256*sizeof(int))	/*delta core bytes*/
#define NHYP 10	/*max hyphens per word*/
#define NHEX 128	/*byte size of exception word list*/
#define NTAB 35	/*tab stops*/
#define NSO 5	/*"so" depth*/
#define WDSIZE 500	/*word buffer size*/
#define LNSIZE 680	/*line buffer size*/
#define NDI 5	/*number of diversions*/
#define DBL 0100000	/*double size indicator*/
#define MOT 0100000	/*motion character indicator*/
#define MOTV 0160000	/*clear for motion part*/
#define VMOT 0040000	/*vert motion bit*/
#define NMOT 0020000	/* negative motion indicator*/
#define MMASK 0100000	/*macro mask indicator*/
#define CMASK 0100377
#define ZBIT 0400	/*zero width char*/
#define BMASK 0377
#define BYTE 8
#define IMP 004	/*impossible char*/
#define FILLER 037
#define PRESC 026
#define HX 0376	/*High-order part of xlss*/
#define LX 0375	/*low-order part of xlss*/
#define COLON 013		/* lem's character */
#define CONT 025
#define XPAR 030
#define ESC 032
#define FLSS 031
#define JREG 0374
#define NTRAP 20	/*number of traps*/
#define NPN 20	/*numbers in "-o"*/
#define T_PAD 0101	/*cat padding*/
#define T_INIT 0100
#define T_IESC 16 /*initial offset*/
#define T_STOP 0111
#define NPP 10	/*pads per field*/
#define FBUFSZ 256	/*field buf size words*/
#define OBUFSZ 512	/*bytes*/
#define IBUFSZ 512	/*bytes*/
#define NC 256	/*cbuf size words*/
#define NOV 10	/*number of overstrike chars*/
#define ZONE 5	/*5hrs for EST*/
#define LEFT 035
#define RIGHT 036
#define LEADER 001
#define TAB 011
#define TMASK  037777
#define RTAB 0100000
#define CTAB 0040000
#define OHC 024

#define PAIR(A,B) (A|(B<<BYTE))

#define BLK  128	/*alloc block words*/
typedef unsigned filep;
#define NBLIST 512	/* /tmp file allocation list */

/*		Compiler Dependent Defines		*/

#ifdef tso
#define filedes FILE *
#define cptmpfaddr(new,old)  new.o = old.o;  new.b = old.b
#endif
#ifdef unix
typedef int filedes;
#define cptmpfaddr(new,old)  new = old
#endif


/*	The following block of defines are used for the name table hashing
 *	algorithms (see fname and dname).  These definitions are used by the
 *	bldtable program for building the initial names table (which contains
 *	request and number register names
 */

#define TAGSMASK (MMASK)	/* tags on name */
#define NAMEMASK (~TAGSMASK)	/* name part */
/*	MMASK	0100000		macro (not request)	*/
#define HBMASK	0177400		/* high order byte mask */

#define HASH(NMPR,SIZE)	(((((unsigned)(NMPR&HBMASK))>>3)- \
				(NMPR&BMASK))%SIZE)
			/* NOTE: this may return a negative, which must
				be made positive	*/


/*	The following defines used to be regular procedures, but are
 *	defined here to produce inline code.
 */

#define incoff(fp)	{  if (!(fp.o = (fp.o + 1) & (BLK - 1)))\
				if ((fp.b = blist[fp.b]) == (filep)-1) errbsa();  }
#define atoi(i)		((int) atoi0(i))
#define boff(i)		((i-1)*BLK + NEV*sizeof(struct envblock))
#define horiz(i)	{	register int jj; \
				vflag = 0; \
				if (jj=i) pchar(makem(jj));	}
#define maplow(i)	(((i&CMASK) < 'a') ? ((i&CMASK)+'a'-'A') : (i&CMASK))

#ifndef ebcdic
#define aprstr(s)	prstr(s)
#define aprstrfl(s)	prstrfl(s)
#endif


/*  The following defines are used for the getch0 character pointer
 *      stack.  The set.. defines are used to enter a new pointer into
 *      the stack.  The defines following are pointer names and their
 *      traditional entry in the stack.  'stack' meaning that is the
 *      way characters are removed from the structure - in practice,
 *      pointers are entered into fixed positions in the structure, and
 *      in any order of insertion.
 */

#define setap(i)	{ cstk[AP] = i; if (AP > cstkl) cstkl = AP; }
#define setcp(i)	{ cstk[CP] = i; if (CP > cstkl) cstkl = CP; }
#define setrp(i)	{ cstk[RP] = i; if (RP > cstkl) cstkl = RP; }
#define setch0(i)	{ tch[0] = i; cstk[cstkl = CH0] = tch; }

#define CH0	4	/* single character top priority buffer */
#define RP	3	/* repeat characters buffer pointer */
#define CP	2	/* arbitrary string pointer */
#define AP	1	/* pointer to macro call argument */

#define RPTLEN	135	/* max length of repeat string  */

#define NB 5		/* number of macro cache buffers */



/*    The names in the next set of defines are the names of all the
 *	items in the environment block.  The environment block is a
 *	structure, defined in ni.c.  The names below used to be names
 *	for the variables themselves, but now are mapped into
 *	structure accesses.
 */

#ifndef INCORE
#define ics eblock.Eics
#define ic eblock.Eic
#define icf eblock.Eicf
#define chbits eblock.Echbits
#define nmbits eblock.Enmbits
#define apts eblock.Eapts
#define apts1 eblock.Eapts1
#define pts eblock.Epts
#define pts1 eblock.Epts1
#define font eblock.Efont
#define font1 eblock.Efont1
#define sps eblock.Esps
#ifndef NROFF
#define spacesz eblock.Espacesz
#define spbits eblock.Espbits
#endif
#define lss eblock.Elss
#define lss1 eblock.Elss1
#define ls eblock.Els
#define ls1 eblock.Els1
#define ll eblock.Ell
#define ll1 eblock.Ell1
#define lt eblock.Elt
#define lt1 eblock.Elt1
#define ad eblock.Ead
#define nms eblock.Enms
#define ndf eblock.Endf
#define fi eblock.Efi
#define cc eblock.Ecc
#define c2 eblock.Ec2
#define ohc eblock.Eohc
#define hyf eblock.Ehyf
#define hyoff eblock.Ehyoff
#define un1 eblock.Eun1
#define tabc eblock.Etabc
#define dotc eblock.Edotc
#define adsp eblock.Eadsp
#define adrem eblock.Eadrem
#define lastl eblock.Elastl
#define nel eblock.Enel
#define admod eblock.Eadmod
#define wordp eblock.Ewordp
#define spflg eblock.Espflg
#define linep eblock.Elinep
#define wdend eblock.Ewdend
#define wdstart eblock.Ewdstart
#define wne eblock.Ewne
#define ne eblock.Ene
#define nc eblock.Enc
#define nb eblock.Enb
#define lnmod eblock.Elnmod
#define nwd eblock.Enwd
#define nn eblock.Enn
#define ni eblock.Eni
#define ul eblock.Eul
#define cu eblock.Ecu
#define ce eblock.Ece
#define in eblock.Ein
#define in1 eblock.Ein1
#define un eblock.Eun
#define wch eblock.Ewch
#define pendt eblock.Ependt
#define pendw eblock.Ependw
#define pendnf eblock.Ependnf
#define spread eblock.Espread
#define it eblock.Eit
#define itmac eblock.Eitmac
#define lnsize eblock.Elnsize
#define hyptr eblock.Ehyptr
#define tabtab eblock.Etabtab
#define line eblock.Eline
#define word eblock.Eword

#else

#define ics eblock[ev].Eics
#define ic eblock[ev].Eic
#define icf eblock[ev].Eicf
#define chbits eblock[ev].Echbits
#define nmbits eblock[ev].Enmbits
#define apts eblock[ev].Eapts
#define apts1 eblock[ev].Eapts1
#define pts eblock[ev].Epts
#define pts1 eblock[ev].Epts1
#define font eblock[ev].Efont
#define font1 eblock[ev].Efont1
#define sps eblock[ev].Esps
#ifndef NROFF
#define spacesz eblock[ev].Espacesz
#define spbits eblock[ev].Espbits
#endif
#define lss eblock[ev].Elss
#define lss1 eblock[ev].Elss1
#define ls eblock[ev].Els
#define ls1 eblock[ev].Els1
#define ll eblock[ev].Ell
#define ll1 eblock[ev].Ell1
#define lt eblock[ev].Elt
#define lt1 eblock[ev].Elt1
#define ad eblock[ev].Ead
#define nms eblock[ev].Enms
#define ndf eblock[ev].Endf
#define fi eblock[ev].Efi
#define cc eblock[ev].Ecc
#define c2 eblock[ev].Ec2
#define ohc eblock[ev].Eohc
#define hyf eblock[ev].Ehyf
#define hyoff eblock[ev].Ehyoff
#define un1 eblock[ev].Eun1
#define tabc eblock[ev].Etabc
#define dotc eblock[ev].Edotc
#define adsp eblock[ev].Eadsp
#define adrem eblock[ev].Eadrem
#define lastl eblock[ev].Elastl
#define nel eblock[ev].Enel
#define admod eblock[ev].Eadmod
#define wordp eblock[ev].Ewordp
#define spflg eblock[ev].Espflg
#define linep eblock[ev].Elinep
#define wdend eblock[ev].Ewdend
#define wdstart eblock[ev].Ewdstart
#define wne eblock[ev].Ewne
#define ne eblock[ev].Ene
#define nc eblock[ev].Enc
#define nb eblock[ev].Enb
#define lnmod eblock[ev].Elnmod
#define nwd eblock[ev].Enwd
#define nn eblock[ev].Enn
#define ni eblock[ev].Eni
#define ul eblock[ev].Eul
#define cu eblock[ev].Ecu
#define ce eblock[ev].Ece
#define in eblock[ev].Ein
#define in1 eblock[ev].Ein1
#define un eblock[ev].Eun
#define wch eblock[ev].Ewch
#define pendt eblock[ev].Ependt
#define pendw eblock[ev].Ependw
#define pendnf eblock[ev].Ependnf
#define spread eblock[ev].Espread
#define it eblock[ev].Eit
#define itmac eblock[ev].Eitmac
#define lnsize eblock[ev].Elnsize
#define hyptr eblock[ev].Ehyptr
#define tabtab eblock[ev].Etabtab
#define line eblock[ev].Eline
#define word eblock[ev].Eword
#endif

/*	defines for nroff/troff data area (struct datablock dblock)	*/

#define r	dblock.Dr
#define nametab dblock.Dnametab
#define nlist	dblock.Dnlist
#define mlist	dblock.Dmlist
#define vlist	dblock.Dvlist
#define inc	dblock.Dinc
#define fmt	dblock.Dfmt
#define trtab	dblock.Dtrtab
#define blist	dblock.Dblist