| 1 | /**************************************************************** |
| 2 | Copyright (C) Lucent Technologies 1997 |
| 3 | All Rights Reserved |
| 4 | |
| 5 | Permission to use, copy, modify, and distribute this software and |
| 6 | its documentation for any purpose and without fee is hereby |
| 7 | granted, provided that the above copyright notice appear in all |
| 8 | copies and that both that the copyright notice and this |
| 9 | permission notice and warranty disclaimer appear in supporting |
| 10 | documentation, and that the name Lucent Technologies or any of |
| 11 | its entities not be used in advertising or publicity pertaining |
| 12 | to distribution of the software without specific, written prior |
| 13 | permission. |
| 14 | |
| 15 | LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
| 16 | INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. |
| 17 | IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY |
| 18 | SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| 19 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER |
| 20 | IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, |
| 21 | ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF |
| 22 | THIS SOFTWARE. |
| 23 | ****************************************************************/ |
| 24 | |
| 25 | #include <assert.h> |
| 26 | |
| 27 | typedef double Awkfloat; |
| 28 | |
| 29 | /* unsigned char is more trouble than it's worth */ |
| 30 | |
| 31 | typedef unsigned char uschar; |
| 32 | |
| 33 | #define xfree(a) { if ((a) != NULL) { free((void *) (a)); (a) = NULL; } } |
| 34 | |
| 35 | #define NN(p) ((p) ? (p) : "(null)") /* guaranteed non-null for dprintf |
| 36 | */ |
| 37 | #define DEBUG |
| 38 | #ifdef DEBUG |
| 39 | /* uses have to be doubly parenthesized */ |
| 40 | # define dprintf(x) if (dbg) printf x |
| 41 | #else |
| 42 | # define dprintf(x) |
| 43 | #endif |
| 44 | |
| 45 | extern int compile_time; /* 1 if compiling, 0 if running */ |
| 46 | extern int safe; /* 0 => unsafe, 1 => safe */ |
| 47 | |
| 48 | #define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */ |
| 49 | extern int recsize; /* size of current record, orig RECSIZE */ |
| 50 | |
| 51 | extern char **FS; |
| 52 | extern char **RS; |
| 53 | extern char **ORS; |
| 54 | extern char **OFS; |
| 55 | extern char **OFMT; |
| 56 | extern Awkfloat *NR; |
| 57 | extern Awkfloat *FNR; |
| 58 | extern Awkfloat *NF; |
| 59 | extern char **FILENAME; |
| 60 | extern char **SUBSEP; |
| 61 | extern Awkfloat *RSTART; |
| 62 | extern Awkfloat *RLENGTH; |
| 63 | |
| 64 | extern char *record; /* points to $0 */ |
| 65 | extern int lineno; /* line number in awk program */ |
| 66 | extern int errorflag; /* 1 if error has occurred */ |
| 67 | extern int donefld; /* 1 if record broken into fields */ |
| 68 | extern int donerec; /* 1 if record is valid (no fld has changed */ |
| 69 | extern char inputFS[]; /* FS at time of input, for field splitting */ |
| 70 | |
| 71 | extern int dbg; |
| 72 | |
| 73 | extern char *patbeg; /* beginning of pattern matched */ |
| 74 | extern int patlen; /* length of pattern matched. set in b.c */ |
| 75 | |
| 76 | /* Cell: all information about a variable or constant */ |
| 77 | |
| 78 | typedef struct Cell { |
| 79 | uschar ctype; /* OCELL, OBOOL, OJUMP, etc. */ |
| 80 | uschar csub; /* CCON, CTEMP, CFLD, etc. */ |
| 81 | char *nval; /* name, for variables only */ |
| 82 | char *sval; /* string value */ |
| 83 | Awkfloat fval; /* value as number */ |
| 84 | int tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */ |
| 85 | struct Cell *cnext; /* ptr to next if chained */ |
| 86 | } Cell; |
| 87 | |
| 88 | typedef struct Array { /* symbol table array */ |
| 89 | int nelem; /* elements in table right now */ |
| 90 | int size; /* size of tab */ |
| 91 | Cell **tab; /* hash table pointers */ |
| 92 | } Array; |
| 93 | |
| 94 | #define NSYMTAB 50 /* initial size of a symbol table */ |
| 95 | extern Array *symtab; |
| 96 | |
| 97 | extern Cell *nrloc; /* NR */ |
| 98 | extern Cell *fnrloc; /* FNR */ |
| 99 | extern Cell *nfloc; /* NF */ |
| 100 | extern Cell *rstartloc; /* RSTART */ |
| 101 | extern Cell *rlengthloc; /* RLENGTH */ |
| 102 | |
| 103 | /* Cell.tval values: */ |
| 104 | #define NUM 01 /* number value is valid */ |
| 105 | #define STR 02 /* string value is valid */ |
| 106 | #define DONTFREE 04 /* string space is not freeable */ |
| 107 | #define CON 010 /* this is a constant */ |
| 108 | #define ARR 020 /* this is an array */ |
| 109 | #define FCN 040 /* this is a function name */ |
| 110 | #define FLD 0100 /* this is a field $1, $2, ... */ |
| 111 | #define REC 0200 /* this is $0 */ |
| 112 | |
| 113 | |
| 114 | /* function types */ |
| 115 | #define FLENGTH 1 |
| 116 | #define FSQRT 2 |
| 117 | #define FEXP 3 |
| 118 | #define FLOG 4 |
| 119 | #define FINT 5 |
| 120 | #define FSYSTEM 6 |
| 121 | #define FRAND 7 |
| 122 | #define FSRAND 8 |
| 123 | #define FSIN 9 |
| 124 | #define FCOS 10 |
| 125 | #define FATAN 11 |
| 126 | #define FTOUPPER 12 |
| 127 | #define FTOLOWER 13 |
| 128 | #define FFLUSH 14 |
| 129 | |
| 130 | /* Node: parse tree is made of nodes, with Cell's at bottom */ |
| 131 | |
| 132 | typedef struct Node { |
| 133 | int ntype; |
| 134 | struct Node *nnext; |
| 135 | int lineno; |
| 136 | int nobj; |
| 137 | struct Node *narg[1]; /* variable: actual size set by calling malloc */ |
| 138 | } Node; |
| 139 | |
| 140 | #define NIL ((Node *) 0) |
| 141 | |
| 142 | extern Node *winner; |
| 143 | extern Node *nullstat; |
| 144 | extern Node *nullnode; |
| 145 | |
| 146 | /* ctypes */ |
| 147 | #define OCELL 1 |
| 148 | #define OBOOL 2 |
| 149 | #define OJUMP 3 |
| 150 | |
| 151 | /* Cell subtypes: csub */ |
| 152 | #define CFREE 7 |
| 153 | #define CCOPY 6 |
| 154 | #define CCON 5 |
| 155 | #define CTEMP 4 |
| 156 | #define CNAME 3 |
| 157 | #define CVAR 2 |
| 158 | #define CFLD 1 |
| 159 | #define CUNK 0 |
| 160 | |
| 161 | /* bool subtypes */ |
| 162 | #define BTRUE 11 |
| 163 | #define BFALSE 12 |
| 164 | |
| 165 | /* jump subtypes */ |
| 166 | #define JEXIT 21 |
| 167 | #define JNEXT 22 |
| 168 | #define JBREAK 23 |
| 169 | #define JCONT 24 |
| 170 | #define JRET 25 |
| 171 | #define JNEXTFILE 26 |
| 172 | |
| 173 | /* node types */ |
| 174 | #define NVALUE 1 |
| 175 | #define NSTAT 2 |
| 176 | #define NEXPR 3 |
| 177 | |
| 178 | |
| 179 | extern int pairstack[], paircnt; |
| 180 | |
| 181 | #define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc) |
| 182 | #define isvalue(n) ((n)->ntype == NVALUE) |
| 183 | #define isexpr(n) ((n)->ntype == NEXPR) |
| 184 | #define isjump(n) ((n)->ctype == OJUMP) |
| 185 | #define isexit(n) ((n)->csub == JEXIT) |
| 186 | #define isbreak(n) ((n)->csub == JBREAK) |
| 187 | #define iscont(n) ((n)->csub == JCONT) |
| 188 | #define isnext(n) ((n)->csub == JNEXT || (n)->csub == JNEXTFILE) |
| 189 | #define isret(n) ((n)->csub == JRET) |
| 190 | #define isrec(n) ((n)->tval & REC) |
| 191 | #define isfld(n) ((n)->tval & FLD) |
| 192 | #define isstr(n) ((n)->tval & STR) |
| 193 | #define isnum(n) ((n)->tval & NUM) |
| 194 | #define isarr(n) ((n)->tval & ARR) |
| 195 | #define isfcn(n) ((n)->tval & FCN) |
| 196 | #define istrue(n) ((n)->csub == BTRUE) |
| 197 | #define istemp(n) ((n)->csub == CTEMP) |
| 198 | #define isargument(n) ((n)->nobj == ARG) |
| 199 | /* #define freeable(p) (!((p)->tval & DONTFREE)) */ |
| 200 | #define freeable(p) ( ((p)->tval & (STR|DONTFREE)) == STR ) |
| 201 | |
| 202 | /* structures used by regular expression matching machinery, mostly b.c: */ |
| 203 | |
| 204 | #define NCHARS (256+3) /* 256 handles 8-bit chars; 128 does 7-bit */ |
| 205 | /* watch out in match(), etc. */ |
| 206 | #define NSTATES 32 |
| 207 | |
| 208 | typedef struct rrow { |
| 209 | long ltype; /* long avoids pointer warnings on 64-bit */ |
| 210 | union { |
| 211 | int i; |
| 212 | Node *np; |
| 213 | uschar *up; |
| 214 | } lval; /* because Al stores a pointer in it! */ |
| 215 | int *lfollow; |
| 216 | } rrow; |
| 217 | |
| 218 | typedef struct fa { |
| 219 | uschar gototab[NSTATES][NCHARS]; |
| 220 | uschar out[NSTATES]; |
| 221 | uschar *restr; |
| 222 | int *posns[NSTATES]; |
| 223 | int anchor; |
| 224 | int use; |
| 225 | int initstat; |
| 226 | int curstat; |
| 227 | int accept; |
| 228 | int reset; |
| 229 | struct rrow re[1]; /* variable: actual size set by calling malloc */ |
| 230 | } fa; |
| 231 | |
| 232 | |
| 233 | #include "proto.h" |