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