Annotation of src/usr.bin/m4/mdef.h, Revision 1.33
1.33 ! deraadt 1: /* $OpenBSD: mdef.h,v 1.32 2014/12/21 09:33:12 espie Exp $ */
1.2 deraadt 2: /* $NetBSD: mdef.h,v 1.7 1996/01/13 23:25:27 pk Exp $ */
1.1 deraadt 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.
1.23 millert 19: * 3. Neither the name of the University nor the names of its contributors
1.1 deraadt 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: */
1.24 espie 37:
38: #ifdef __GNUC__
39: # define UNUSED __attribute__((__unused__))
40: #else
41: # define UNUSED
42: #endif
1.1 deraadt 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
1.10 espie 77: #define SELFTYPE 34
1.14 espie 78: #define INDIRTYPE 35
79: #define BUILTINTYPE 36
80: #define PATSTYPE 37
81: #define FILENAMETYPE 38
82: #define LINETYPE 39
83: #define REGEXPTYPE 40
1.17 espie 84: #define ESYSCMDTYPE 41
1.21 espie 85: #define TRACEONTYPE 42
86: #define TRACEOFFTYPE 43
1.29 espie 87: #define FORMATTYPE 44
1.21 espie 88:
1.25 espie 89: #define BUILTIN_MARKER "__builtin_"
1.30 marco 90:
1.9 espie 91: #define TYPEMASK 63 /* Keep bits really corresponding to a type. */
92: #define RECDEF 256 /* Pure recursive def, don't expand it */
1.11 espie 93: #define NOARGS 512 /* builtin needs no args */
94: #define NEEDARGS 1024 /* mark builtin that need args with this */
1.1 deraadt 95:
96: /*
97: * m4 special characters
98: */
1.30 marco 99:
1.1 deraadt 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: /*
110: * other important constants
111: */
112:
1.5 espie 113: #define EOS '\0'
1.30 marco 114: #define MAXINP 10 /* maximum include files */
115: #define MAXOUT 10 /* maximum # of diversions */
1.6 espie 116: #define BUFSIZE 4096 /* starting size of pushback buffer */
1.30 marco 117: #define INITSTACKMAX 4096 /* starting size of call stack */
1.16 espie 118: #define STRSPMAX 4096 /* starting size of string space */
1.30 marco 119: #define MAXTOK 512 /* maximum chars in a tokn */
1.6 espie 120: #define MAXCCHARS 5 /* max size of comment/quote delim */
1.30 marco 121:
1.1 deraadt 122: #define ALL 1
123: #define TOP 0
1.30 marco 124:
1.1 deraadt 125: #define TRUE 1
126: #define FALSE 0
127: #define cycle for(;;)
128:
129: /*
130: * m4 data structures
131: */
1.30 marco 132:
1.1 deraadt 133: typedef struct ndblock *ndptr;
1.30 marco 134:
1.25 espie 135: struct macro_definition {
1.27 espie 136: struct macro_definition *next;
1.9 espie 137: char *defn; /* definition.. */
138: unsigned int type; /* type of the entry.. */
1.1 deraadt 139: };
1.25 espie 140:
1.28 espie 141:
142: struct ndblock { /* hashtable structure */
1.30 marco 143: unsigned int builtin_type;
1.28 espie 144: unsigned int trace_flags;
145: struct macro_definition *d;
146: char name[1]; /* entry name.. */
1.1 deraadt 147: };
1.30 marco 148:
1.1 deraadt 149: typedef union { /* stack structure */
150: int sfra; /* frame entry */
1.30 marco 151: char *sstr; /* string entry */
1.1 deraadt 152: } stae;
153:
1.12 espie 154: struct input_file {
1.30 marco 155: FILE *file;
156: char *name;
157: unsigned long lineno;
1.22 espie 158: unsigned long synch_lineno; /* used for -s */
1.30 marco 159: int c;
1.12 espie 160: };
161:
1.32 espie 162: #define STORAGE_STRSPACE 0
163: #define STORAGE_MACRO 1
164: #define STORAGE_OTHER 2
165:
1.12 espie 166: #define CURRENT_NAME (infile[ilevel].name)
167: #define CURRENT_LINE (infile[ilevel].lineno)
1.1 deraadt 168: /*
169: * macros for readibility and/or speed
170: *
171: * gpbc() - get a possibly pushed-back character
172: * pushf() - push a call frame entry onto stack
173: * pushs() - push a string pointer onto stack
174: */
1.30 marco 175: #define gpbc() (bp > bufbase) ? *--bp : obtain_char(infile+ilevel)
176: #define pushf(x) \
1.15 espie 177: do { \
1.30 marco 178: if (++sp == STACKMAX) \
1.15 espie 179: enlarge_stack();\
180: mstack[sp].sfra = (x); \
1.32 espie 181: sstack[sp] = STORAGE_OTHER; \
1.20 espie 182: } while (0)
1.15 espie 183:
1.30 marco 184: #define pushs(x) \
1.15 espie 185: do { \
1.30 marco 186: if (++sp == STACKMAX) \
1.15 espie 187: enlarge_stack();\
188: mstack[sp].sstr = (x); \
1.32 espie 189: sstack[sp] = STORAGE_STRSPACE; \
1.20 espie 190: } while (0)
1.15 espie 191:
1.30 marco 192: #define pushs1(x) \
1.15 espie 193: do { \
1.30 marco 194: if (++sp == STACKMAX) \
1.15 espie 195: enlarge_stack();\
196: mstack[sp].sstr = (x); \
1.32 espie 197: sstack[sp] = STORAGE_OTHER; \
198: } while (0)
199:
200: #define pushdef(p) \
201: do { \
202: if (++sp == STACKMAX) \
203: enlarge_stack();\
204: mstack[sp].sstr = macro_getdef(p)->defn;\
205: sstack[sp] = STORAGE_MACRO; \
1.20 espie 206: } while (0)
1.32 espie 207:
1.1 deraadt 208:
209: /*
210: * . .
211: * | . | <-- sp | . |
212: * +-------+ +-----+
213: * | arg 3 ----------------------->| str |
214: * +-------+ | . |
1.30 marco 215: * | arg 2 ---PREVEP-----+ .
1.1 deraadt 216: * +-------+ |
217: * . | | |
1.30 marco 218: * +-------+ | +-----+
1.1 deraadt 219: * | plev | PARLEV +-------->| str |
220: * +-------+ | . |
221: * | type | CALTYP .
222: * +-------+
223: * | prcf ---PREVFP--+
1.30 marco 224: * +-------+ |
1.1 deraadt 225: * | . | PREVSP |
1.30 marco 226: * . |
1.1 deraadt 227: * +-------+ |
228: * | <----------+
229: * +-------+
230: *
231: */
232: #define PARLEV (mstack[fp].sfra)
1.26 espie 233: #define CALTYP (mstack[fp-2].sfra)
234: #define TRACESTATUS (mstack[fp-1].sfra)
1.15 espie 235: #define PREVEP (mstack[fp+3].sstr)
1.26 espie 236: #define PREVSP (fp-4)
237: #define PREVFP (mstack[fp-3].sfra)