234 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /****************************************************************
 | |
| Copyright (C) Lucent Technologies 1997
 | |
| All Rights Reserved
 | |
| 
 | |
| Permission to use, copy, modify, and distribute this software and
 | |
| its documentation for any purpose and without fee is hereby
 | |
| granted, provided that the above copyright notice appear in all
 | |
| copies and that both that the copyright notice and this
 | |
| permission notice and warranty disclaimer appear in supporting
 | |
| documentation, and that the name Lucent Technologies or any of
 | |
| its entities not be used in advertising or publicity pertaining
 | |
| to distribution of the software without specific, written prior
 | |
| permission.
 | |
| 
 | |
| LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | |
| INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
 | |
| IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
 | |
| SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | |
| WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
 | |
| IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 | |
| ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 | |
| THIS SOFTWARE.
 | |
| ****************************************************************/
 | |
| 
 | |
| #include <assert.h>
 | |
| 
 | |
| typedef double	Awkfloat;
 | |
| 
 | |
| /* unsigned char is more trouble than it's worth */
 | |
| 
 | |
| typedef	unsigned char uschar;
 | |
| 
 | |
| #define	xfree(a)	{ if ((a) != NULL) { free((void *) (a)); (a) = NULL; } }
 | |
| 
 | |
| #define	NN(p)	((p) ? (p) : "(null)")	/* guaranteed non-null for dprintf 
 | |
| */
 | |
| #define	DEBUG
 | |
| #ifdef	DEBUG
 | |
| 			/* uses have to be doubly parenthesized */
 | |
| #	define	dprintf(x)	if (dbg) printf x
 | |
| #else
 | |
| #	define	dprintf(x)
 | |
| #endif
 | |
| 
 | |
| extern int	compile_time;	/* 1 if compiling, 0 if running */
 | |
| extern int	safe;		/* 0 => unsafe, 1 => safe */
 | |
| 
 | |
| #define	RECSIZE	(8 * 1024)	/* sets limit on records, fields, etc., etc. */
 | |
| extern int	recsize;	/* size of current record, orig RECSIZE */
 | |
| 
 | |
| extern char	**FS;
 | |
| extern char	**RS;
 | |
| extern char	**ORS;
 | |
| extern char	**OFS;
 | |
| extern char	**OFMT;
 | |
| extern Awkfloat *NR;
 | |
| extern Awkfloat *FNR;
 | |
| extern Awkfloat *NF;
 | |
| extern char	**FILENAME;
 | |
| extern char	**SUBSEP;
 | |
| extern Awkfloat *RSTART;
 | |
| extern Awkfloat *RLENGTH;
 | |
| 
 | |
| extern char	*record;	/* points to $0 */
 | |
| extern int	lineno;		/* line number in awk program */
 | |
| extern int	errorflag;	/* 1 if error has occurred */
 | |
| extern int	donefld;	/* 1 if record broken into fields */
 | |
| extern int	donerec;	/* 1 if record is valid (no fld has changed */
 | |
| extern char	inputFS[];	/* FS at time of input, for field splitting */
 | |
| 
 | |
| extern int	dbg;
 | |
| 
 | |
| extern	char	*patbeg;	/* beginning of pattern matched */
 | |
| extern	int	patlen;		/* length of pattern matched.  set in b.c */
 | |
| 
 | |
| /* Cell:  all information about a variable or constant */
 | |
| 
 | |
| typedef struct Cell {
 | |
| 	uschar	ctype;		/* OCELL, OBOOL, OJUMP, etc. */
 | |
| 	uschar	csub;		/* CCON, CTEMP, CFLD, etc. */
 | |
| 	char	*nval;		/* name, for variables only */
 | |
| 	char	*sval;		/* string value */
 | |
| 	Awkfloat fval;		/* value as number */
 | |
| 	int	 tval;		/* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
 | |
| 	struct Cell *cnext;	/* ptr to next if chained */
 | |
| } Cell;
 | |
| 
 | |
| typedef struct Array {		/* symbol table array */
 | |
| 	int	nelem;		/* elements in table right now */
 | |
| 	int	size;		/* size of tab */
 | |
| 	Cell	**tab;		/* hash table pointers */
 | |
| } Array;
 | |
| 
 | |
| #define	NSYMTAB	50	/* initial size of a symbol table */
 | |
| extern Array	*symtab;
 | |
| 
 | |
| extern Cell	*nrloc;		/* NR */
 | |
| extern Cell	*fnrloc;	/* FNR */
 | |
| extern Cell	*nfloc;		/* NF */
 | |
| extern Cell	*rstartloc;	/* RSTART */
 | |
| extern Cell	*rlengthloc;	/* RLENGTH */
 | |
| 
 | |
| /* Cell.tval values: */
 | |
| #define	NUM	01	/* number value is valid */
 | |
| #define	STR	02	/* string value is valid */
 | |
| #define DONTFREE 04	/* string space is not freeable */
 | |
| #define	CON	010	/* this is a constant */
 | |
| #define	ARR	020	/* this is an array */
 | |
| #define	FCN	040	/* this is a function name */
 | |
| #define FLD	0100	/* this is a field $1, $2, ... */
 | |
| #define	REC	0200	/* this is $0 */
 | |
| 
 | |
| 
 | |
| /* function types */
 | |
| #define	FLENGTH	1
 | |
| #define	FSQRT	2
 | |
| #define	FEXP	3
 | |
| #define	FLOG	4
 | |
| #define	FINT	5
 | |
| #define	FSYSTEM	6
 | |
| #define	FRAND	7
 | |
| #define	FSRAND	8
 | |
| #define	FSIN	9
 | |
| #define	FCOS	10
 | |
| #define	FATAN	11
 | |
| #define	FTOUPPER 12
 | |
| #define	FTOLOWER 13
 | |
| #define	FFLUSH	14
 | |
| 
 | |
| /* Node:  parse tree is made of nodes, with Cell's at bottom */
 | |
| 
 | |
| typedef struct Node {
 | |
| 	int	ntype;
 | |
| 	struct	Node *nnext;
 | |
| 	int	lineno;
 | |
| 	int	nobj;
 | |
| 	struct	Node *narg[1];	/* variable: actual size set by calling malloc */
 | |
| } Node;
 | |
| 
 | |
| #define	NIL	((Node *) 0)
 | |
| 
 | |
| extern Node	*winner;
 | |
| extern Node	*nullstat;
 | |
| extern Node	*nullnode;
 | |
| 
 | |
| /* ctypes */
 | |
| #define OCELL	1
 | |
| #define OBOOL	2
 | |
| #define OJUMP	3
 | |
| 
 | |
| /* Cell subtypes: csub */
 | |
| #define	CFREE	7
 | |
| #define CCOPY	6
 | |
| #define CCON	5
 | |
| #define CTEMP	4
 | |
| #define CNAME	3 
 | |
| #define CVAR	2
 | |
| #define CFLD	1
 | |
| #define	CUNK	0
 | |
| 
 | |
| /* bool subtypes */
 | |
| #define BTRUE	11
 | |
| #define BFALSE	12
 | |
| 
 | |
| /* jump subtypes */
 | |
| #define JEXIT	21
 | |
| #define JNEXT	22
 | |
| #define	JBREAK	23
 | |
| #define	JCONT	24
 | |
| #define	JRET	25
 | |
| #define	JNEXTFILE	26
 | |
| 
 | |
| /* node types */
 | |
| #define NVALUE	1
 | |
| #define NSTAT	2
 | |
| #define NEXPR	3
 | |
| 
 | |
| 
 | |
| extern	int	pairstack[], paircnt;
 | |
| 
 | |
| #define notlegal(n)	(n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
 | |
| #define isvalue(n)	((n)->ntype == NVALUE)
 | |
| #define isexpr(n)	((n)->ntype == NEXPR)
 | |
| #define isjump(n)	((n)->ctype == OJUMP)
 | |
| #define isexit(n)	((n)->csub == JEXIT)
 | |
| #define	isbreak(n)	((n)->csub == JBREAK)
 | |
| #define	iscont(n)	((n)->csub == JCONT)
 | |
| #define	isnext(n)	((n)->csub == JNEXT || (n)->csub == JNEXTFILE)
 | |
| #define	isret(n)	((n)->csub == JRET)
 | |
| #define isrec(n)	((n)->tval & REC)
 | |
| #define isfld(n)	((n)->tval & FLD)
 | |
| #define isstr(n)	((n)->tval & STR)
 | |
| #define isnum(n)	((n)->tval & NUM)
 | |
| #define isarr(n)	((n)->tval & ARR)
 | |
| #define isfcn(n)	((n)->tval & FCN)
 | |
| #define istrue(n)	((n)->csub == BTRUE)
 | |
| #define istemp(n)	((n)->csub == CTEMP)
 | |
| #define	isargument(n)	((n)->nobj == ARG)
 | |
| /* #define freeable(p)	(!((p)->tval & DONTFREE)) */
 | |
| #define freeable(p)	( ((p)->tval & (STR|DONTFREE)) == STR )
 | |
| 
 | |
| /* structures used by regular expression matching machinery, mostly b.c: */
 | |
| 
 | |
| #define NCHARS	(256+3)		/* 256 handles 8-bit chars; 128 does 7-bit */
 | |
| 				/* watch out in match(), etc. */
 | |
| #define NSTATES	32
 | |
| 
 | |
| typedef struct rrow {
 | |
| 	long	ltype;	/* long avoids pointer warnings on 64-bit */
 | |
| 	union {
 | |
| 		int i;
 | |
| 		Node *np;
 | |
| 		uschar *up;
 | |
| 	} lval;		/* because Al stores a pointer in it! */
 | |
| 	int	*lfollow;
 | |
| } rrow;
 | |
| 
 | |
| typedef struct fa {
 | |
| 	uschar	gototab[NSTATES][NCHARS];
 | |
| 	uschar	out[NSTATES];
 | |
| 	uschar	*restr;
 | |
| 	int	*posns[NSTATES];
 | |
| 	int	anchor;
 | |
| 	int	use;
 | |
| 	int	initstat;
 | |
| 	int	curstat;
 | |
| 	int	accept;
 | |
| 	int	reset;
 | |
| 	struct	rrow re[1];	/* variable: actual size set by calling malloc */
 | |
| } fa;
 | |
| 
 | |
| 
 | |
| #include "proto.h"
 | 
