1/*	$OpenBSD: mdef.h,v 1.29 2006/03/20 20:27:45 espie Exp $	*/
2/*	$NetBSD: mdef.h,v 1.17 2016/01/16 18:31:29 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	0xff	/* Keep bits really corresponding to a type. */
92#define RECDEF		0x100	/* Pure recursive def, don't expand it */
93#define NOARGS		0x200	/* builtin needs no args */
94#define NEEDARGS	0x400	/* 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#ifndef TRUE
131#define TRUE	1
132#endif
133#ifndef FALSE
134#define FALSE	0
135#endif
136#define cycle           for(;;)
137
138/*
139 * m4 data structures
140 */
141
142typedef struct ndblock *ndptr;
143
144struct macro_definition {
145	struct macro_definition *next;
146	char		*defn;	/* definition..               */
147	unsigned int	type;	/* type of the entry..        */
148};
149
150
151struct ndblock {			/* hashtable structure         */
152	unsigned int 		builtin_type;
153	unsigned int		trace_flags;
154	struct macro_definition *d;
155	char		name[1];	/* entry name..               */
156};
157
158typedef union {			/* stack structure */
159	int	sfra;		/* frame entry  */
160	char 	*sstr;		/* string entry */
161} stae;
162
163struct input_file {
164	FILE 		*file;
165	char 		*name;
166	unsigned long 	lineno;
167	unsigned long   synch_lineno;	/* used for -s */
168	int 		c;
169};
170
171#define CURRENT_NAME	(infile[ilevel].name)
172#define CURRENT_LINE	(infile[ilevel].lineno)
173#define	TOKEN_LINE(f)	(f->lineno - (f->c == '\n' ? 1 : 0))
174
175/*
176 * macros for readibility and/or speed
177 *
178 *      gpbc()  - get a possibly pushed-back character
179 *      pushf() - push a call frame entry onto stack
180 *      pushs() - push a string pointer onto stack
181 */
182#define gpbc() 	 (bp > bufbase) ? *--bp : obtain_char(infile+ilevel)
183#define pushf(x) 			\
184	do {				\
185		if ((size_t)++sp == STACKMAX) 	\
186			enlarge_stack();\
187		mstack[sp].sfra = (x);	\
188		sstack[sp] = 0; \
189	} while (0)
190
191#define pushs(x) 			\
192	do {				\
193		if ((size_t)++sp == STACKMAX) 	\
194			enlarge_stack();\
195		mstack[sp].sstr = (x);	\
196		sstack[sp] = 1; \
197	} while (0)
198
199#define pushs1(x) 			\
200	do {				\
201		if ((size_t)++sp == STACKMAX) 	\
202			enlarge_stack();\
203		mstack[sp].sstr = (x);	\
204		sstack[sp] = 0; \
205	} while (0)
206
207/*
208 *	    .				   .
209 *	|   .	|  <-- sp		|  .  |
210 *	+-------+			+-----+
211 *	| arg 3 ----------------------->| str |
212 *	+-------+			|  .  |
213 *	| arg 2 ---PREVEP-----+ 	   .
214 *	+-------+	      |
215 *	    .		      |		|     |
216 *	+-------+	      | 	+-----+
217 *	| plev	|  PARLEV     +-------->| str |
218 *	+-------+			|  .  |
219 *	| type	|  CALTYP		   .
220 *	+-------+
221 *	| prcf	---PREVFP--+
222 *	+-------+  	   |
223 *	|   .	|  PREVSP  |
224 *	    .	   	   |
225 *	+-------+	   |
226 *	|	<----------+
227 *	+-------+
228 *
229 */
230#define PARLEV  (mstack[fp].sfra)
231#define CALTYP  (mstack[fp-2].sfra)
232#define TRACESTATUS (mstack[fp-1].sfra)
233#define PREVEP	(mstack[fp+3].sstr)
234#define PREVSP	(fp-4)
235#define PREVFP	(mstack[fp-3].sfra)
236
237#define VERSION	20150116
238