1/*	$OpenBSD: mdef.h,v 1.31 2011/09/27 07:24:02 espie Exp $	*/
2/*	$NetBSD: mdef.h,v 1.7 1996/01/13 23:25:27 pk Exp $	*/
3
4/*
5 * Copyright (c) 1989, 1993
6 *	The Regents of the University of California.  All rights reserved.
7 *
8 * This code is derived from software contributed to Berkeley by
9 * Ozan Yigit at York University.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 *    may be used to endorse or promote products derived from this software
21 *    without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 *	@(#)mdef.h	8.1 (Berkeley) 6/6/93
36 * $FreeBSD$
37 */
38
39#ifdef __GNUC__
40# define UNUSED	__attribute__((__unused__))
41#else
42# define UNUSED
43#endif
44
45#define MACRTYPE        1
46#define DEFITYPE        2
47#define EXPRTYPE        3
48#define SUBSTYPE        4
49#define IFELTYPE        5
50#define LENGTYPE        6
51#define CHNQTYPE        7
52#define SYSCTYPE        8
53#define UNDFTYPE        9
54#define INCLTYPE        10
55#define SINCTYPE        11
56#define PASTTYPE        12
57#define SPASTYPE        13
58#define INCRTYPE        14
59#define IFDFTYPE        15
60#define PUSDTYPE        16
61#define POPDTYPE        17
62#define SHIFTYPE        18
63#define DECRTYPE        19
64#define DIVRTYPE        20
65#define UNDVTYPE        21
66#define DIVNTYPE        22
67#define MKTMTYPE        23
68#define ERRPTYPE        24
69#define M4WRTYPE        25
70#define TRNLTYPE        26
71#define DNLNTYPE        27
72#define DUMPTYPE        28
73#define CHNCTYPE        29
74#define INDXTYPE        30
75#define SYSVTYPE        31
76#define EXITTYPE        32
77#define DEFNTYPE        33
78#define SELFTYPE	34
79#define INDIRTYPE	35
80#define BUILTINTYPE	36
81#define PATSTYPE	37
82#define FILENAMETYPE	38
83#define LINETYPE	39
84#define REGEXPTYPE	40
85#define ESYSCMDTYPE	41
86#define TRACEONTYPE	42
87#define TRACEOFFTYPE	43
88#define FORMATTYPE	44
89
90#define BUILTIN_MARKER	"__builtin_"
91
92#define TYPEMASK	63	/* Keep bits really corresponding to a type. */
93#define RECDEF		256	/* Pure recursive def, don't expand it */
94#define NOARGS		512	/* builtin needs no args */
95#define NEEDARGS	1024	/* mark builtin that need args with this */
96
97/*
98 * m4 special characters
99 */
100
101#define ARGFLAG         '$'
102#define LPAREN          '('
103#define RPAREN          ')'
104#define LQUOTE          '`'
105#define RQUOTE          '\''
106#define COMMA           ','
107#define SCOMMT          '#'
108#define ECOMMT          '\n'
109
110#ifdef msdos
111#define system(str)	(-1)
112#endif
113
114/*
115 * other important constants
116 */
117
118#define EOS             '\0'
119#define MAXINP          10              /* maximum include files	    */
120#define MAXOUT          10              /* maximum # of diversions	    */
121#define BUFSIZE         4096            /* starting size of pushback buffer */
122#define INITSTACKMAX    4096		/* starting size of call stack      */
123#define STRSPMAX        4096            /* starting size of string space    */
124#define MAXTOK          512		/* maximum chars in a tokn	    */
125#define MAXCCHARS	5		/* max size of comment/quote delim  */
126
127#define ALL             1
128#define TOP             0
129
130#define TRUE            1
131#define FALSE           0
132#define cycle           for(;;)
133
134/*
135 * m4 data structures
136 */
137
138typedef struct ndblock *ndptr;
139
140struct macro_definition {
141	struct macro_definition *next;
142	char		*defn;	/* definition..               */
143	unsigned int	type;	/* type of the entry..        */
144};
145
146
147struct ndblock {			/* hashtable structure         */
148	unsigned int		builtin_type;
149	unsigned int		trace_flags;
150	struct macro_definition *d;
151	char		name[1];	/* entry name..               */
152};
153
154typedef union {			/* stack structure */
155	int	sfra;		/* frame entry  */
156	char	*sstr;		/* string entry */
157} stae;
158
159struct input_file {
160	FILE		*file;
161	char		*name;
162	unsigned long	lineno;
163	unsigned long   synch_lineno;	/* used for -s */
164	int		c;
165};
166
167#define CURRENT_NAME	(infile[ilevel].name)
168#define CURRENT_LINE	(infile[ilevel].lineno)
169/*
170 * macros for readibility and/or speed
171 *
172 *      gpbc()  - get a possibly pushed-back character
173 *      pushf() - push a call frame entry onto stack
174 *      pushs() - push a string pointer onto stack
175 */
176#define gpbc()	 (bp > bufbase) ? *--bp : obtain_char(infile+ilevel)
177#define pushf(x)			\
178	do {				\
179		if (++sp == (int)STACKMAX)	\
180			enlarge_stack();\
181		mstack[sp].sfra = (x);	\
182		sstack[sp] = 0; \
183	} while (0)
184
185#define pushs(x)			\
186	do {				\
187		if (++sp == (int)STACKMAX)	\
188			enlarge_stack();\
189		mstack[sp].sstr = (x);	\
190		sstack[sp] = 1; \
191	} while (0)
192
193#define pushs1(x)			\
194	do {				\
195		if (++sp == (int)STACKMAX)	\
196			enlarge_stack();\
197		mstack[sp].sstr = (x);	\
198		sstack[sp] = 0; \
199	} while (0)
200
201/*
202 *	    .				   .
203 *	|   .	|  <-- sp		|  .  |
204 *	+-------+			+-----+
205 *	| arg 3 ----------------------->| str |
206 *	+-------+			|  .  |
207 *	| arg 2 ---PREVEP-----+		   .
208 *	+-------+	      |
209 *	    .		      |		|     |
210 *	+-------+	      |		+-----+
211 *	| plev	|  PARLEV     +-------->| str |
212 *	+-------+			|  .  |
213 *	| type	|  CALTYP		   .
214 *	+-------+
215 *	| prcf	---PREVFP--+
216 *	+-------+	   |
217 *	|   .	|  PREVSP  |
218 *	    .		   |
219 *	+-------+	   |
220 *	|	<----------+
221 *	+-------+
222 *
223 */
224#define PARLEV  (mstack[fp].sfra)
225#define CALTYP  (mstack[fp-2].sfra)
226#define TRACESTATUS (mstack[fp-1].sfra)
227#define PREVEP	(mstack[fp+3].sstr)
228#define PREVSP	(fp-4)
229#define PREVFP	(mstack[fp-3].sfra)
230