1228063Sbapt/*	$OpenBSD: mdef.h,v 1.31 2011/09/27 07:24:02 espie Exp $	*/
295060Sjmallett/*	$NetBSD: mdef.h,v 1.7 1996/01/13 23:25:27 pk Exp $	*/
395060Sjmallett
41590Srgrimes/*
51590Srgrimes * Copyright (c) 1989, 1993
61590Srgrimes *	The Regents of the University of California.  All rights reserved.
71590Srgrimes *
81590Srgrimes * This code is derived from software contributed to Berkeley by
91590Srgrimes * Ozan Yigit at York University.
101590Srgrimes *
111590Srgrimes * Redistribution and use in source and binary forms, with or without
121590Srgrimes * modification, are permitted provided that the following conditions
131590Srgrimes * are met:
141590Srgrimes * 1. Redistributions of source code must retain the above copyright
151590Srgrimes *    notice, this list of conditions and the following disclaimer.
161590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
171590Srgrimes *    notice, this list of conditions and the following disclaimer in the
181590Srgrimes *    documentation and/or other materials provided with the distribution.
19228063Sbapt * 3. Neither the name of the University nor the names of its contributors
201590Srgrimes *    may be used to endorse or promote products derived from this software
211590Srgrimes *    without specific prior written permission.
221590Srgrimes *
231590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
241590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
251590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
261590Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
271590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
281590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
291590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
301590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
311590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
321590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
331590Srgrimes * SUCH DAMAGE.
341590Srgrimes *
351590Srgrimes *	@(#)mdef.h	8.1 (Berkeley) 6/6/93
3694957Sjmallett * $FreeBSD$
371590Srgrimes */
381590Srgrimes
39228063Sbapt#ifdef __GNUC__
40228063Sbapt# define UNUSED	__attribute__((__unused__))
41228063Sbapt#else
42228063Sbapt# define UNUSED
43228063Sbapt#endif
44228063Sbapt
451590Srgrimes#define MACRTYPE        1
461590Srgrimes#define DEFITYPE        2
471590Srgrimes#define EXPRTYPE        3
481590Srgrimes#define SUBSTYPE        4
491590Srgrimes#define IFELTYPE        5
501590Srgrimes#define LENGTYPE        6
511590Srgrimes#define CHNQTYPE        7
521590Srgrimes#define SYSCTYPE        8
531590Srgrimes#define UNDFTYPE        9
541590Srgrimes#define INCLTYPE        10
551590Srgrimes#define SINCTYPE        11
561590Srgrimes#define PASTTYPE        12
571590Srgrimes#define SPASTYPE        13
581590Srgrimes#define INCRTYPE        14
591590Srgrimes#define IFDFTYPE        15
601590Srgrimes#define PUSDTYPE        16
611590Srgrimes#define POPDTYPE        17
621590Srgrimes#define SHIFTYPE        18
631590Srgrimes#define DECRTYPE        19
641590Srgrimes#define DIVRTYPE        20
651590Srgrimes#define UNDVTYPE        21
661590Srgrimes#define DIVNTYPE        22
671590Srgrimes#define MKTMTYPE        23
681590Srgrimes#define ERRPTYPE        24
691590Srgrimes#define M4WRTYPE        25
701590Srgrimes#define TRNLTYPE        26
711590Srgrimes#define DNLNTYPE        27
721590Srgrimes#define DUMPTYPE        28
731590Srgrimes#define CHNCTYPE        29
741590Srgrimes#define INDXTYPE        30
751590Srgrimes#define SYSVTYPE        31
761590Srgrimes#define EXITTYPE        32
771590Srgrimes#define DEFNTYPE        33
7895060Sjmallett#define SELFTYPE	34
7995060Sjmallett#define INDIRTYPE	35
8095060Sjmallett#define BUILTINTYPE	36
8195060Sjmallett#define PATSTYPE	37
8295060Sjmallett#define FILENAMETYPE	38
8395060Sjmallett#define LINETYPE	39
8495060Sjmallett#define REGEXPTYPE	40
8595060Sjmallett#define ESYSCMDTYPE	41
8695060Sjmallett#define TRACEONTYPE	42
8795060Sjmallett#define TRACEOFFTYPE	43
88228063Sbapt#define FORMATTYPE	44
898874Srgrimes
90228063Sbapt#define BUILTIN_MARKER	"__builtin_"
91100014Sjmallett
9295060Sjmallett#define TYPEMASK	63	/* Keep bits really corresponding to a type. */
9395060Sjmallett#define RECDEF		256	/* Pure recursive def, don't expand it */
9495060Sjmallett#define NOARGS		512	/* builtin needs no args */
9595060Sjmallett#define NEEDARGS	1024	/* mark builtin that need args with this */
961590Srgrimes
971590Srgrimes/*
981590Srgrimes * m4 special characters
991590Srgrimes */
100100014Sjmallett
1011590Srgrimes#define ARGFLAG         '$'
1021590Srgrimes#define LPAREN          '('
1031590Srgrimes#define RPAREN          ')'
1041590Srgrimes#define LQUOTE          '`'
1051590Srgrimes#define RQUOTE          '\''
1061590Srgrimes#define COMMA           ','
1071590Srgrimes#define SCOMMT          '#'
1081590Srgrimes#define ECOMMT          '\n'
1091590Srgrimes
1101590Srgrimes#ifdef msdos
1111590Srgrimes#define system(str)	(-1)
1121590Srgrimes#endif
1131590Srgrimes
1141590Srgrimes/*
1151590Srgrimes * other important constants
1161590Srgrimes */
1171590Srgrimes
11895060Sjmallett#define EOS             '\0'
119228063Sbapt#define MAXINP          10              /* maximum include files	    */
120228063Sbapt#define MAXOUT          10              /* maximum # of diversions	    */
12195060Sjmallett#define BUFSIZE         4096            /* starting size of pushback buffer */
122228063Sbapt#define INITSTACKMAX    4096		/* starting size of call stack      */
12395060Sjmallett#define STRSPMAX        4096            /* starting size of string space    */
124228063Sbapt#define MAXTOK          512		/* maximum chars in a tokn	    */
12595060Sjmallett#define MAXCCHARS	5		/* max size of comment/quote delim  */
126100014Sjmallett
1271590Srgrimes#define ALL             1
1281590Srgrimes#define TOP             0
129100014Sjmallett
1301590Srgrimes#define TRUE            1
1311590Srgrimes#define FALSE           0
1321590Srgrimes#define cycle           for(;;)
1331590Srgrimes
1341590Srgrimes/*
1351590Srgrimes * m4 data structures
1361590Srgrimes */
137100014Sjmallett
1381590Srgrimestypedef struct ndblock *ndptr;
139100014Sjmallett
140228063Sbaptstruct macro_definition {
141228063Sbapt	struct macro_definition *next;
14295060Sjmallett	char		*defn;	/* definition..               */
14395060Sjmallett	unsigned int	type;	/* type of the entry..        */
1441590Srgrimes};
145100014Sjmallett
146100014Sjmallett
147228063Sbaptstruct ndblock {			/* hashtable structure         */
148228063Sbapt	unsigned int		builtin_type;
149228063Sbapt	unsigned int		trace_flags;
150228063Sbapt	struct macro_definition *d;
151228063Sbapt	char		name[1];	/* entry name..               */
1521590Srgrimes};
1531590Srgrimes
1541590Srgrimestypedef union {			/* stack structure */
1551590Srgrimes	int	sfra;		/* frame entry  */
156228063Sbapt	char	*sstr;		/* string entry */
1571590Srgrimes} stae;
1581590Srgrimes
15995060Sjmallettstruct input_file {
160228063Sbapt	FILE		*file;
161228063Sbapt	char		*name;
162228063Sbapt	unsigned long	lineno;
163228063Sbapt	unsigned long   synch_lineno;	/* used for -s */
164228063Sbapt	int		c;
16595060Sjmallett};
16695060Sjmallett
16795060Sjmallett#define CURRENT_NAME	(infile[ilevel].name)
16895060Sjmallett#define CURRENT_LINE	(infile[ilevel].lineno)
1691590Srgrimes/*
1701590Srgrimes * macros for readibility and/or speed
1711590Srgrimes *
172228063Sbapt *      gpbc()  - get a possibly pushed-back character
1731590Srgrimes *      pushf() - push a call frame entry onto stack
1741590Srgrimes *      pushs() - push a string pointer onto stack
1751590Srgrimes */
176228063Sbapt#define gpbc()	 (bp > bufbase) ? *--bp : obtain_char(infile+ilevel)
177228063Sbapt#define pushf(x)			\
178228063Sbapt	do {				\
179228063Sbapt		if (++sp == (int)STACKMAX)	\
180228063Sbapt			enlarge_stack();\
181228063Sbapt		mstack[sp].sfra = (x);	\
182228063Sbapt		sstack[sp] = 0; \
18395060Sjmallett	} while (0)
1841590Srgrimes
185228063Sbapt#define pushs(x)			\
186228063Sbapt	do {				\
187228063Sbapt		if (++sp == (int)STACKMAX)	\
188228063Sbapt			enlarge_stack();\
189228063Sbapt		mstack[sp].sstr = (x);	\
190228063Sbapt		sstack[sp] = 1; \
19195060Sjmallett	} while (0)
19295060Sjmallett
193228063Sbapt#define pushs1(x)			\
194228063Sbapt	do {				\
195228063Sbapt		if (++sp == (int)STACKMAX)	\
196228063Sbapt			enlarge_stack();\
197228063Sbapt		mstack[sp].sstr = (x);	\
198228063Sbapt		sstack[sp] = 0; \
19995060Sjmallett	} while (0)
20095060Sjmallett
2011590Srgrimes/*
2021590Srgrimes *	    .				   .
2031590Srgrimes *	|   .	|  <-- sp		|  .  |
2041590Srgrimes *	+-------+			+-----+
2051590Srgrimes *	| arg 3 ----------------------->| str |
2061590Srgrimes *	+-------+			|  .  |
207228063Sbapt *	| arg 2 ---PREVEP-----+		   .
2081590Srgrimes *	+-------+	      |
2091590Srgrimes *	    .		      |		|     |
210228063Sbapt *	+-------+	      |		+-----+
2111590Srgrimes *	| plev	|  PARLEV     +-------->| str |
2121590Srgrimes *	+-------+			|  .  |
2131590Srgrimes *	| type	|  CALTYP		   .
2141590Srgrimes *	+-------+
2151590Srgrimes *	| prcf	---PREVFP--+
216228063Sbapt *	+-------+	   |
2171590Srgrimes *	|   .	|  PREVSP  |
218228063Sbapt *	    .		   |
2191590Srgrimes *	+-------+	   |
2201590Srgrimes *	|	<----------+
2211590Srgrimes *	+-------+
2221590Srgrimes *
2231590Srgrimes */
2241590Srgrimes#define PARLEV  (mstack[fp].sfra)
225228063Sbapt#define CALTYP  (mstack[fp-2].sfra)
226228063Sbapt#define TRACESTATUS (mstack[fp-1].sfra)
2271590Srgrimes#define PREVEP	(mstack[fp+3].sstr)
228228063Sbapt#define PREVSP	(fp-4)
229228063Sbapt#define PREVFP	(mstack[fp-3].sfra)
230