12e8d1edaSArun Thomas /* $OpenBSD: mdef.h,v 1.29 2006/03/20 20:27:45 espie Exp $ */ 2*84d9c625SLionel Sambuc /* $NetBSD: mdef.h,v 1.15 2013/10/18 20:19:36 christos Exp $ */ 32e8d1edaSArun Thomas 42e8d1edaSArun Thomas /* 52e8d1edaSArun Thomas * Copyright (c) 1989, 1993 62e8d1edaSArun Thomas * The Regents of the University of California. All rights reserved. 72e8d1edaSArun Thomas * 82e8d1edaSArun Thomas * This code is derived from software contributed to Berkeley by 92e8d1edaSArun Thomas * Ozan Yigit at York University. 102e8d1edaSArun Thomas * 112e8d1edaSArun Thomas * Redistribution and use in source and binary forms, with or without 122e8d1edaSArun Thomas * modification, are permitted provided that the following conditions 132e8d1edaSArun Thomas * are met: 142e8d1edaSArun Thomas * 1. Redistributions of source code must retain the above copyright 152e8d1edaSArun Thomas * notice, this list of conditions and the following disclaimer. 162e8d1edaSArun Thomas * 2. Redistributions in binary form must reproduce the above copyright 172e8d1edaSArun Thomas * notice, this list of conditions and the following disclaimer in the 182e8d1edaSArun Thomas * documentation and/or other materials provided with the distribution. 192e8d1edaSArun Thomas * 3. Neither the name of the University nor the names of its contributors 202e8d1edaSArun Thomas * may be used to endorse or promote products derived from this software 212e8d1edaSArun Thomas * without specific prior written permission. 222e8d1edaSArun Thomas * 232e8d1edaSArun Thomas * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 242e8d1edaSArun Thomas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 252e8d1edaSArun Thomas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 262e8d1edaSArun Thomas * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 272e8d1edaSArun Thomas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 282e8d1edaSArun Thomas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 292e8d1edaSArun Thomas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 302e8d1edaSArun Thomas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 312e8d1edaSArun Thomas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 322e8d1edaSArun Thomas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 332e8d1edaSArun Thomas * SUCH DAMAGE. 342e8d1edaSArun Thomas * 352e8d1edaSArun Thomas * @(#)mdef.h 8.1 (Berkeley) 6/6/93 362e8d1edaSArun Thomas */ 372e8d1edaSArun Thomas 382e8d1edaSArun Thomas #ifdef __GNUC__ 392e8d1edaSArun Thomas # define UNUSED __attribute__((__unused__)) 402e8d1edaSArun Thomas #else 412e8d1edaSArun Thomas # define UNUSED 422e8d1edaSArun Thomas #endif 432e8d1edaSArun Thomas 442e8d1edaSArun Thomas #define MACRTYPE 1 452e8d1edaSArun Thomas #define DEFITYPE 2 462e8d1edaSArun Thomas #define EXPRTYPE 3 472e8d1edaSArun Thomas #define SUBSTYPE 4 482e8d1edaSArun Thomas #define IFELTYPE 5 492e8d1edaSArun Thomas #define LENGTYPE 6 502e8d1edaSArun Thomas #define CHNQTYPE 7 512e8d1edaSArun Thomas #define SYSCTYPE 8 522e8d1edaSArun Thomas #define UNDFTYPE 9 532e8d1edaSArun Thomas #define INCLTYPE 10 542e8d1edaSArun Thomas #define SINCTYPE 11 552e8d1edaSArun Thomas #define PASTTYPE 12 562e8d1edaSArun Thomas #define SPASTYPE 13 572e8d1edaSArun Thomas #define INCRTYPE 14 582e8d1edaSArun Thomas #define IFDFTYPE 15 592e8d1edaSArun Thomas #define PUSDTYPE 16 602e8d1edaSArun Thomas #define POPDTYPE 17 612e8d1edaSArun Thomas #define SHIFTYPE 18 622e8d1edaSArun Thomas #define DECRTYPE 19 632e8d1edaSArun Thomas #define DIVRTYPE 20 642e8d1edaSArun Thomas #define UNDVTYPE 21 652e8d1edaSArun Thomas #define DIVNTYPE 22 662e8d1edaSArun Thomas #define MKTMTYPE 23 672e8d1edaSArun Thomas #define ERRPTYPE 24 682e8d1edaSArun Thomas #define M4WRTYPE 25 692e8d1edaSArun Thomas #define TRNLTYPE 26 702e8d1edaSArun Thomas #define DNLNTYPE 27 712e8d1edaSArun Thomas #define DUMPTYPE 28 722e8d1edaSArun Thomas #define CHNCTYPE 29 732e8d1edaSArun Thomas #define INDXTYPE 30 742e8d1edaSArun Thomas #define SYSVTYPE 31 752e8d1edaSArun Thomas #define EXITTYPE 32 762e8d1edaSArun Thomas #define DEFNTYPE 33 772e8d1edaSArun Thomas #define SELFTYPE 34 782e8d1edaSArun Thomas #define INDIRTYPE 35 792e8d1edaSArun Thomas #define BUILTINTYPE 36 802e8d1edaSArun Thomas #define PATSTYPE 37 812e8d1edaSArun Thomas #define FILENAMETYPE 38 822e8d1edaSArun Thomas #define LINETYPE 39 832e8d1edaSArun Thomas #define REGEXPTYPE 40 842e8d1edaSArun Thomas #define ESYSCMDTYPE 41 852e8d1edaSArun Thomas #define TRACEONTYPE 42 862e8d1edaSArun Thomas #define TRACEOFFTYPE 43 872e8d1edaSArun Thomas #define FORMATTYPE 44 882e8d1edaSArun Thomas 892e8d1edaSArun Thomas #define BUILTIN_MARKER "__builtin_" 902e8d1edaSArun Thomas 912e8d1edaSArun Thomas #define TYPEMASK 63 /* Keep bits really corresponding to a type. */ 922e8d1edaSArun Thomas #define RECDEF 256 /* Pure recursive def, don't expand it */ 932e8d1edaSArun Thomas #define NOARGS 512 /* builtin needs no args */ 942e8d1edaSArun Thomas #define NEEDARGS 1024 /* mark builtin that need args with this */ 952e8d1edaSArun Thomas 962e8d1edaSArun Thomas /* 972e8d1edaSArun Thomas * m4 special characters 982e8d1edaSArun Thomas */ 992e8d1edaSArun Thomas 1002e8d1edaSArun Thomas #define ARGFLAG '$' 1012e8d1edaSArun Thomas #define LPAREN '(' 1022e8d1edaSArun Thomas #define RPAREN ')' 1032e8d1edaSArun Thomas #define LQUOTE '`' 1042e8d1edaSArun Thomas #define RQUOTE '\'' 1052e8d1edaSArun Thomas #define COMMA ',' 1062e8d1edaSArun Thomas #define SCOMMT '#' 1072e8d1edaSArun Thomas #define ECOMMT '\n' 1082e8d1edaSArun Thomas 1092e8d1edaSArun Thomas #ifdef msdos 1102e8d1edaSArun Thomas #define system(str) (-1) 1112e8d1edaSArun Thomas #endif 1122e8d1edaSArun Thomas 1132e8d1edaSArun Thomas /* 1142e8d1edaSArun Thomas * other important constants 1152e8d1edaSArun Thomas */ 1162e8d1edaSArun Thomas 1172e8d1edaSArun Thomas #define EOS '\0' 1182e8d1edaSArun Thomas #define MAXINP 10 /* maximum include files */ 1192e8d1edaSArun Thomas #define MAXOUT 10 /* maximum # of diversions */ 1202e8d1edaSArun Thomas #define BUFSIZE 4096 /* starting size of pushback buffer */ 1212e8d1edaSArun Thomas #define INITSTACKMAX 4096 /* starting size of call stack */ 1222e8d1edaSArun Thomas #define STRSPMAX 4096 /* starting size of string space */ 1232e8d1edaSArun Thomas #define MAXTOK 512 /* maximum chars in a tokn */ 1242e8d1edaSArun Thomas #define HASHSIZE 199 /* maximum size of hashtab */ 1252e8d1edaSArun Thomas #define MAXCCHARS 5 /* max size of comment/quote delim */ 1262e8d1edaSArun Thomas 1272e8d1edaSArun Thomas #define ALL 1 1282e8d1edaSArun Thomas #define TOP 0 1292e8d1edaSArun Thomas 130*84d9c625SLionel Sambuc #ifndef TRUE 1312e8d1edaSArun Thomas #define TRUE 1 132*84d9c625SLionel Sambuc #endif 133*84d9c625SLionel Sambuc #ifndef FALSE 1342e8d1edaSArun Thomas #define FALSE 0 135*84d9c625SLionel Sambuc #endif 1362e8d1edaSArun Thomas #define cycle for(;;) 1372e8d1edaSArun Thomas 1382e8d1edaSArun Thomas /* 1392e8d1edaSArun Thomas * m4 data structures 1402e8d1edaSArun Thomas */ 1412e8d1edaSArun Thomas 1422e8d1edaSArun Thomas typedef struct ndblock *ndptr; 1432e8d1edaSArun Thomas 1442e8d1edaSArun Thomas struct macro_definition { 1452e8d1edaSArun Thomas struct macro_definition *next; 1462e8d1edaSArun Thomas char *defn; /* definition.. */ 1472e8d1edaSArun Thomas unsigned int type; /* type of the entry.. */ 1482e8d1edaSArun Thomas }; 1492e8d1edaSArun Thomas 1502e8d1edaSArun Thomas 1512e8d1edaSArun Thomas struct ndblock { /* hashtable structure */ 1522e8d1edaSArun Thomas unsigned int builtin_type; 1532e8d1edaSArun Thomas unsigned int trace_flags; 1542e8d1edaSArun Thomas struct macro_definition *d; 1552e8d1edaSArun Thomas char name[1]; /* entry name.. */ 1562e8d1edaSArun Thomas }; 1572e8d1edaSArun Thomas 1582e8d1edaSArun Thomas typedef union { /* stack structure */ 1592e8d1edaSArun Thomas int sfra; /* frame entry */ 1602e8d1edaSArun Thomas char *sstr; /* string entry */ 1612e8d1edaSArun Thomas } stae; 1622e8d1edaSArun Thomas 1632e8d1edaSArun Thomas struct input_file { 1642e8d1edaSArun Thomas FILE *file; 1652e8d1edaSArun Thomas char *name; 1662e8d1edaSArun Thomas unsigned long lineno; 1672e8d1edaSArun Thomas unsigned long synch_lineno; /* used for -s */ 1682e8d1edaSArun Thomas int c; 1692e8d1edaSArun Thomas }; 1702e8d1edaSArun Thomas 1712e8d1edaSArun Thomas #define CURRENT_NAME (infile[ilevel].name) 1722e8d1edaSArun Thomas #define CURRENT_LINE (infile[ilevel].lineno) 17371c7dcb9SLionel Sambuc #define TOKEN_LINE(f) (f->lineno - (f->c == '\n' ? 1 : 0)) 17471c7dcb9SLionel Sambuc 1752e8d1edaSArun Thomas /* 1762e8d1edaSArun Thomas * macros for readibility and/or speed 1772e8d1edaSArun Thomas * 1782e8d1edaSArun Thomas * gpbc() - get a possibly pushed-back character 1792e8d1edaSArun Thomas * pushf() - push a call frame entry onto stack 1802e8d1edaSArun Thomas * pushs() - push a string pointer onto stack 1812e8d1edaSArun Thomas */ 1822e8d1edaSArun Thomas #define gpbc() (bp > bufbase) ? *--bp : obtain_char(infile+ilevel) 1832e8d1edaSArun Thomas #define pushf(x) \ 1842e8d1edaSArun Thomas do { \ 1852e8d1edaSArun Thomas if ((size_t)++sp == STACKMAX) \ 1862e8d1edaSArun Thomas enlarge_stack();\ 1872e8d1edaSArun Thomas mstack[sp].sfra = (x); \ 1882e8d1edaSArun Thomas sstack[sp] = 0; \ 1892e8d1edaSArun Thomas } while (0) 1902e8d1edaSArun Thomas 1912e8d1edaSArun Thomas #define pushs(x) \ 1922e8d1edaSArun Thomas do { \ 1932e8d1edaSArun Thomas if ((size_t)++sp == STACKMAX) \ 1942e8d1edaSArun Thomas enlarge_stack();\ 1952e8d1edaSArun Thomas mstack[sp].sstr = (x); \ 1962e8d1edaSArun Thomas sstack[sp] = 1; \ 1972e8d1edaSArun Thomas } while (0) 1982e8d1edaSArun Thomas 1992e8d1edaSArun Thomas #define pushs1(x) \ 2002e8d1edaSArun Thomas do { \ 2012e8d1edaSArun Thomas if ((size_t)++sp == STACKMAX) \ 2022e8d1edaSArun Thomas enlarge_stack();\ 2032e8d1edaSArun Thomas mstack[sp].sstr = (x); \ 2042e8d1edaSArun Thomas sstack[sp] = 0; \ 2052e8d1edaSArun Thomas } while (0) 2062e8d1edaSArun Thomas 2072e8d1edaSArun Thomas /* 2082e8d1edaSArun Thomas * . . 2092e8d1edaSArun Thomas * | . | <-- sp | . | 2102e8d1edaSArun Thomas * +-------+ +-----+ 2112e8d1edaSArun Thomas * | arg 3 ----------------------->| str | 2122e8d1edaSArun Thomas * +-------+ | . | 2132e8d1edaSArun Thomas * | arg 2 ---PREVEP-----+ . 2142e8d1edaSArun Thomas * +-------+ | 2152e8d1edaSArun Thomas * . | | | 2162e8d1edaSArun Thomas * +-------+ | +-----+ 2172e8d1edaSArun Thomas * | plev | PARLEV +-------->| str | 2182e8d1edaSArun Thomas * +-------+ | . | 2192e8d1edaSArun Thomas * | type | CALTYP . 2202e8d1edaSArun Thomas * +-------+ 2212e8d1edaSArun Thomas * | prcf ---PREVFP--+ 2222e8d1edaSArun Thomas * +-------+ | 2232e8d1edaSArun Thomas * | . | PREVSP | 2242e8d1edaSArun Thomas * . | 2252e8d1edaSArun Thomas * +-------+ | 2262e8d1edaSArun Thomas * | <----------+ 2272e8d1edaSArun Thomas * +-------+ 2282e8d1edaSArun Thomas * 2292e8d1edaSArun Thomas */ 2302e8d1edaSArun Thomas #define PARLEV (mstack[fp].sfra) 2312e8d1edaSArun Thomas #define CALTYP (mstack[fp-2].sfra) 2322e8d1edaSArun Thomas #define TRACESTATUS (mstack[fp-1].sfra) 2332e8d1edaSArun Thomas #define PREVEP (mstack[fp+3].sstr) 2342e8d1edaSArun Thomas #define PREVSP (fp-4) 2352e8d1edaSArun Thomas #define PREVFP (mstack[fp-3].sfra) 236