| /**************************************************************** |
| 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" |