1/*	$OpenBSD: mdef.h,v 1.29 2006/03/20 20:27:45 espie Exp $	*/
2/*	$NetBSD: mdef.h,v 1.13 2009/10/26 21:11:28 christos 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 */
37
38#ifdef __GNUC__
39# define UNUSED	__attribute__((__unused__))
40#else
41# define UNUSED
42#endif
43
44#define MACRTYPE        1
45#define DEFITYPE        2
46#define EXPRTYPE        3
47#define SUBSTYPE        4
48#define IFELTYPE        5
49#define LENGTYPE        6
50#define CHNQTYPE        7
51#define SYSCTYPE        8
52#define UNDFTYPE        9
53#define INCLTYPE        10
54#define SINCTYPE        11
55#define PASTTYPE        12
56#define SPASTYPE        13
57#define INCRTYPE        14
58#define IFDFTYPE        15
59#define PUSDTYPE        16
60#define POPDTYPE        17
61#define SHIFTYPE        18
62#define DECRTYPE        19
63#define DIVRTYPE        20
64#define UNDVTYPE        21
65#define DIVNTYPE        22
66#define MKTMTYPE        23
67#define ERRPTYPE        24
68#define M4WRTYPE        25
69#define TRNLTYPE        26
70#define DNLNTYPE        27
71#define DUMPTYPE        28
72#define CHNCTYPE        29
73#define INDXTYPE        30
74#define SYSVTYPE        31
75#define EXITTYPE        32
76#define DEFNTYPE        33
77#define SELFTYPE	34
78#define INDIRTYPE	35
79#define BUILTINTYPE	36
80#define PATSTYPE	37
81#define FILENAMETYPE	38
82#define LINETYPE	39
83#define REGEXPTYPE	40
84#define ESYSCMDTYPE	41
85#define TRACEONTYPE	42
86#define TRACEOFFTYPE	43
87#define FORMATTYPE	44
88
89#define BUILTIN_MARKER	"__builtin_"
90
91#define TYPEMASK	63	/* Keep bits really corresponding to a type. */
92#define RECDEF		256	/* Pure recursive def, don't expand it */
93#define NOARGS		512	/* builtin needs no args */
94#define NEEDARGS	1024	/* mark builtin that need args with this */
95
96/*
97 * m4 special characters
98 */
99
100#define ARGFLAG         '$'
101#define LPAREN          '('
102#define RPAREN          ')'
103#define LQUOTE          '`'
104#define RQUOTE          '\''
105#define COMMA           ','
106#define SCOMMT          '#'
107#define ECOMMT          '\n'
108
109#ifdef msdos
110#define system(str)	(-1)
111#endif
112
113/*
114 * other important constants
115 */
116
117#define EOS             '\0'
118#define MAXINP          10              /* maximum include files   	    */
119#define MAXOUT          10              /* maximum # of diversions 	    */
120#define BUFSIZE         4096            /* starting size of pushback buffer */
121#define INITSTACKMAX    4096           	/* starting size of call stack      */
122#define STRSPMAX        4096            /* starting size of string space    */
123#define MAXTOK          512          	/* maximum chars in a tokn 	    */
124#define HASHSIZE        199             /* maximum size of hashtab 	    */
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#define	TOKEN_LINE(f)	(f->lineno - (f->c == '\n' ? 1 : 0))
170
171/*
172 * macros for readibility and/or speed
173 *
174 *      gpbc()  - get a possibly pushed-back character
175 *      pushf() - push a call frame entry onto stack
176 *      pushs() - push a string pointer onto stack
177 */
178#define gpbc() 	 (bp > bufbase) ? *--bp : obtain_char(infile+ilevel)
179#define pushf(x) 			\
180	do {				\
181		if ((size_t)++sp == STACKMAX) 	\
182			enlarge_stack();\
183		mstack[sp].sfra = (x);	\
184		sstack[sp] = 0; \
185	} while (0)
186
187#define pushs(x) 			\
188	do {				\
189		if ((size_t)++sp == STACKMAX) 	\
190			enlarge_stack();\
191		mstack[sp].sstr = (x);	\
192		sstack[sp] = 1; \
193	} while (0)
194
195#define pushs1(x) 			\
196	do {				\
197		if ((size_t)++sp == STACKMAX) 	\
198			enlarge_stack();\
199		mstack[sp].sstr = (x);	\
200		sstack[sp] = 0; \
201	} while (0)
202
203/*
204 *	    .				   .
205 *	|   .	|  <-- sp		|  .  |
206 *	+-------+			+-----+
207 *	| arg 3 ----------------------->| str |
208 *	+-------+			|  .  |
209 *	| arg 2 ---PREVEP-----+ 	   .
210 *	+-------+	      |
211 *	    .		      |		|     |
212 *	+-------+	      | 	+-----+
213 *	| plev	|  PARLEV     +-------->| str |
214 *	+-------+			|  .  |
215 *	| type	|  CALTYP		   .
216 *	+-------+
217 *	| prcf	---PREVFP--+
218 *	+-------+  	   |
219 *	|   .	|  PREVSP  |
220 *	    .	   	   |
221 *	+-------+	   |
222 *	|	<----------+
223 *	+-------+
224 *
225 */
226#define PARLEV  (mstack[fp].sfra)
227#define CALTYP  (mstack[fp-2].sfra)
228#define TRACESTATUS (mstack[fp-1].sfra)
229#define PREVEP	(mstack[fp+3].sstr)
230#define PREVSP	(fp-4)
231#define PREVFP	(mstack[fp-3].sfra)
232