xref: /minix3/usr.bin/m4/mdef.h (revision 84d9c625bfea59e274550651111ae9edfdc40fbd)
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