mdef.h revision 331722
1/*	$OpenBSD: mdef.h,v 1.33 2015/11/03 16:21:47 deraadt 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: stable/11/usr.bin/m4/mdef.h 331722 2018-03-29 02:50:57Z eadler $
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/*
111 * other important constants
112 */
113
114#define EOS             '\0'
115#define MAXINP          10              /* maximum include files	    */
116#define MAXOUT          10              /* maximum # of diversions	    */
117#define BUFSIZE         4096            /* starting size of pushback buffer */
118#define INITSTACKMAX    4096		/* starting size of call stack      */
119#define STRSPMAX        4096            /* starting size of string space    */
120#define MAXTOK          512		/* maximum chars in a tokn	    */
121#define MAXCCHARS	5		/* max size of comment/quote delim  */
122
123#define ALL             1
124#define TOP             0
125
126#define TRUE            1
127#define FALSE           0
128#define cycle           for(;;)
129
130/*
131 * m4 data structures
132 */
133
134typedef struct ndblock *ndptr;
135
136struct macro_definition {
137	struct macro_definition *next;
138	char		*defn;	/* definition..               */
139	unsigned int	type;	/* type of the entry..        */
140};
141
142
143struct ndblock {			/* hashtable structure         */
144	unsigned int		builtin_type;
145	unsigned int		trace_flags;
146	struct macro_definition *d;
147	char		name[1];	/* entry name..               */
148};
149
150typedef union {			/* stack structure */
151	int	sfra;		/* frame entry  */
152	char	*sstr;		/* string entry */
153} stae;
154
155struct input_file {
156	FILE		*file;
157	char		*name;
158	unsigned long	lineno;
159	unsigned long   synch_lineno;	/* used for -s */
160	int		c;
161};
162
163#define STORAGE_STRSPACE 0
164#define STORAGE_MACRO 1
165#define STORAGE_OTHER 2
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] = STORAGE_OTHER; \
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] = STORAGE_STRSPACE; \
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] = STORAGE_OTHER; \
199	} while (0)
200
201#define pushdef(p)			\
202	do {				\
203		if (++sp == (int)STACKMAX)	\
204			enlarge_stack();\
205		mstack[sp].sstr = macro_getdef(p)->defn;\
206		sstack[sp] = STORAGE_MACRO; \
207	} while (0)
208
209
210/*
211 *	    .				   .
212 *	|   .	|  <-- sp		|  .  |
213 *	+-------+			+-----+
214 *	| arg 3 ----------------------->| str |
215 *	+-------+			|  .  |
216 *	| arg 2 ---PREVEP-----+		   .
217 *	+-------+	      |
218 *	    .		      |		|     |
219 *	+-------+	      |		+-----+
220 *	| plev	|  PARLEV     +-------->| str |
221 *	+-------+			|  .  |
222 *	| type	|  CALTYP		   .
223 *	+-------+
224 *	| prcf	---PREVFP--+
225 *	+-------+	   |
226 *	|   .	|  PREVSP  |
227 *	    .		   |
228 *	+-------+	   |
229 *	|	<----------+
230 *	+-------+
231 *
232 */
233#define PARLEV  (mstack[fp].sfra)
234#define CALTYP  (mstack[fp-2].sfra)
235#define TRACESTATUS (mstack[fp-1].sfra)
236#define PREVEP	(mstack[fp+3].sstr)
237#define PREVSP	(fp-4)
238#define PREVFP	(mstack[fp-3].sfra)
239