13e12c5d1SDavid du Colombier /* 2*7dd7cddfSDavid du Colombier Copyright (c) Lucent Technologies 1997 33e12c5d1SDavid du Colombier All Rights Reserved 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier */ 63e12c5d1SDavid du Colombier 73e12c5d1SDavid du Colombier typedef double Awkfloat; 8*7dd7cddfSDavid du Colombier 9*7dd7cddfSDavid du Colombier /* unsigned char is more trouble than it's worth */ 10*7dd7cddfSDavid du Colombier 11*7dd7cddfSDavid du Colombier typedef unsigned char uschar; 123e12c5d1SDavid du Colombier 133e12c5d1SDavid du Colombier #define xfree(a) { if ((a) != NULL) { free((char *) a); a = NULL; } } 143e12c5d1SDavid du Colombier 153e12c5d1SDavid du Colombier #define DEBUG 163e12c5d1SDavid du Colombier #ifdef DEBUG 173e12c5d1SDavid du Colombier /* uses have to be doubly parenthesized */ 183e12c5d1SDavid du Colombier # define dprintf(x) if (dbg) printf x 193e12c5d1SDavid du Colombier #else 203e12c5d1SDavid du Colombier # define dprintf(x) 213e12c5d1SDavid du Colombier #endif 223e12c5d1SDavid du Colombier 23*7dd7cddfSDavid du Colombier extern char errbuf[]; 243e12c5d1SDavid du Colombier 253e12c5d1SDavid du Colombier extern int compile_time; /* 1 if compiling, 0 if running */ 26*7dd7cddfSDavid du Colombier extern int safe; /* 0 => unsafe, 1 => safe */ 273e12c5d1SDavid du Colombier 28*7dd7cddfSDavid du Colombier #define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */ 29*7dd7cddfSDavid du Colombier extern int recsize; /* size of current record, orig RECSIZE */ 303e12c5d1SDavid du Colombier 31*7dd7cddfSDavid du Colombier extern char **FS; 32*7dd7cddfSDavid du Colombier extern char **RS; 33*7dd7cddfSDavid du Colombier extern char **ORS; 34*7dd7cddfSDavid du Colombier extern char **OFS; 35*7dd7cddfSDavid du Colombier extern char **OFMT; 363e12c5d1SDavid du Colombier extern Awkfloat *NR; 373e12c5d1SDavid du Colombier extern Awkfloat *FNR; 383e12c5d1SDavid du Colombier extern Awkfloat *NF; 39*7dd7cddfSDavid du Colombier extern char **FILENAME; 40*7dd7cddfSDavid du Colombier extern char **SUBSEP; 413e12c5d1SDavid du Colombier extern Awkfloat *RSTART; 423e12c5d1SDavid du Colombier extern Awkfloat *RLENGTH; 433e12c5d1SDavid du Colombier 44*7dd7cddfSDavid du Colombier extern char *record; /* points to $0 */ 45219b2ee8SDavid du Colombier extern int lineno; /* line number in awk program */ 46219b2ee8SDavid du Colombier extern int errorflag; /* 1 if error has occurred */ 473e12c5d1SDavid du Colombier extern int donefld; /* 1 if record broken into fields */ 483e12c5d1SDavid du Colombier extern int donerec; /* 1 if record is valid (no fld has changed */ 49*7dd7cddfSDavid du Colombier extern char inputFS[]; /* FS at time of input, for field splitting */ 503e12c5d1SDavid du Colombier 51219b2ee8SDavid du Colombier extern int dbg; 52219b2ee8SDavid du Colombier 53*7dd7cddfSDavid du Colombier extern char *patbeg; /* beginning of pattern matched */ 54219b2ee8SDavid du Colombier extern int patlen; /* length of pattern matched. set in b.c */ 553e12c5d1SDavid du Colombier 563e12c5d1SDavid du Colombier /* Cell: all information about a variable or constant */ 573e12c5d1SDavid du Colombier 583e12c5d1SDavid du Colombier typedef struct Cell { 59*7dd7cddfSDavid du Colombier uschar ctype; /* OCELL, OBOOL, OJUMP, etc. */ 60*7dd7cddfSDavid du Colombier uschar csub; /* CCON, CTEMP, CFLD, etc. */ 61*7dd7cddfSDavid du Colombier char *nval; /* name, for variables only */ 62*7dd7cddfSDavid du Colombier char *sval; /* string value */ 633e12c5d1SDavid du Colombier Awkfloat fval; /* value as number */ 64*7dd7cddfSDavid du Colombier int tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */ 653e12c5d1SDavid du Colombier struct Cell *cnext; /* ptr to next if chained */ 663e12c5d1SDavid du Colombier } Cell; 673e12c5d1SDavid du Colombier 68*7dd7cddfSDavid du Colombier typedef struct Array { /* symbol table array */ 693e12c5d1SDavid du Colombier int nelem; /* elements in table right now */ 703e12c5d1SDavid du Colombier int size; /* size of tab */ 713e12c5d1SDavid du Colombier Cell **tab; /* hash table pointers */ 723e12c5d1SDavid du Colombier } Array; 733e12c5d1SDavid du Colombier 743e12c5d1SDavid du Colombier #define NSYMTAB 50 /* initial size of a symbol table */ 753e12c5d1SDavid du Colombier extern Array *symtab; 763e12c5d1SDavid du Colombier 773e12c5d1SDavid du Colombier extern Cell *nrloc; /* NR */ 783e12c5d1SDavid du Colombier extern Cell *fnrloc; /* FNR */ 793e12c5d1SDavid du Colombier extern Cell *nfloc; /* NF */ 803e12c5d1SDavid du Colombier extern Cell *rstartloc; /* RSTART */ 813e12c5d1SDavid du Colombier extern Cell *rlengthloc; /* RLENGTH */ 823e12c5d1SDavid du Colombier 833e12c5d1SDavid du Colombier /* Cell.tval values: */ 843e12c5d1SDavid du Colombier #define NUM 01 /* number value is valid */ 853e12c5d1SDavid du Colombier #define STR 02 /* string value is valid */ 863e12c5d1SDavid du Colombier #define DONTFREE 04 /* string space is not freeable */ 873e12c5d1SDavid du Colombier #define CON 010 /* this is a constant */ 883e12c5d1SDavid du Colombier #define ARR 020 /* this is an array */ 893e12c5d1SDavid du Colombier #define FCN 040 /* this is a function name */ 903e12c5d1SDavid du Colombier #define FLD 0100 /* this is a field $1, $2, ... */ 913e12c5d1SDavid du Colombier #define REC 0200 /* this is $0 */ 923e12c5d1SDavid du Colombier 933e12c5d1SDavid du Colombier 943e12c5d1SDavid du Colombier /* function types */ 953e12c5d1SDavid du Colombier #define FLENGTH 1 963e12c5d1SDavid du Colombier #define FSQRT 2 973e12c5d1SDavid du Colombier #define FEXP 3 983e12c5d1SDavid du Colombier #define FLOG 4 993e12c5d1SDavid du Colombier #define FINT 5 1003e12c5d1SDavid du Colombier #define FSYSTEM 6 1013e12c5d1SDavid du Colombier #define FRAND 7 1023e12c5d1SDavid du Colombier #define FSRAND 8 1033e12c5d1SDavid du Colombier #define FSIN 9 1043e12c5d1SDavid du Colombier #define FCOS 10 1053e12c5d1SDavid du Colombier #define FATAN 11 1063e12c5d1SDavid du Colombier #define FTOUPPER 12 1073e12c5d1SDavid du Colombier #define FTOLOWER 13 1083e12c5d1SDavid du Colombier #define FFLUSH 14 109219b2ee8SDavid du Colombier #define FUTF 15 1103e12c5d1SDavid du Colombier 1113e12c5d1SDavid du Colombier /* Node: parse tree is made of nodes, with Cell's at bottom */ 1123e12c5d1SDavid du Colombier 1133e12c5d1SDavid du Colombier typedef struct Node { 1143e12c5d1SDavid du Colombier int ntype; 1153e12c5d1SDavid du Colombier struct Node *nnext; 1163e12c5d1SDavid du Colombier int lineno; 1173e12c5d1SDavid du Colombier int nobj; 1183e12c5d1SDavid du Colombier struct Node *narg[1]; /* variable: actual size set by calling malloc */ 1193e12c5d1SDavid du Colombier } Node; 1203e12c5d1SDavid du Colombier 1213e12c5d1SDavid du Colombier #define NIL ((Node *) 0) 1223e12c5d1SDavid du Colombier 1233e12c5d1SDavid du Colombier extern Node *winner; 1243e12c5d1SDavid du Colombier extern Node *nullstat; 1253e12c5d1SDavid du Colombier extern Node *nullnode; 1263e12c5d1SDavid du Colombier 1273e12c5d1SDavid du Colombier /* ctypes */ 1283e12c5d1SDavid du Colombier #define OCELL 1 1293e12c5d1SDavid du Colombier #define OBOOL 2 1303e12c5d1SDavid du Colombier #define OJUMP 3 1313e12c5d1SDavid du Colombier 1323e12c5d1SDavid du Colombier /* Cell subtypes: csub */ 1333e12c5d1SDavid du Colombier #define CFREE 7 1343e12c5d1SDavid du Colombier #define CCOPY 6 1353e12c5d1SDavid du Colombier #define CCON 5 1363e12c5d1SDavid du Colombier #define CTEMP 4 1373e12c5d1SDavid du Colombier #define CNAME 3 1383e12c5d1SDavid du Colombier #define CVAR 2 1393e12c5d1SDavid du Colombier #define CFLD 1 140*7dd7cddfSDavid du Colombier #define CUNK 0 1413e12c5d1SDavid du Colombier 1423e12c5d1SDavid du Colombier /* bool subtypes */ 1433e12c5d1SDavid du Colombier #define BTRUE 11 1443e12c5d1SDavid du Colombier #define BFALSE 12 1453e12c5d1SDavid du Colombier 1463e12c5d1SDavid du Colombier /* jump subtypes */ 1473e12c5d1SDavid du Colombier #define JEXIT 21 1483e12c5d1SDavid du Colombier #define JNEXT 22 1493e12c5d1SDavid du Colombier #define JBREAK 23 1503e12c5d1SDavid du Colombier #define JCONT 24 1513e12c5d1SDavid du Colombier #define JRET 25 152*7dd7cddfSDavid du Colombier #define JNEXTFILE 26 1533e12c5d1SDavid du Colombier 1543e12c5d1SDavid du Colombier /* node types */ 1553e12c5d1SDavid du Colombier #define NVALUE 1 1563e12c5d1SDavid du Colombier #define NSTAT 2 1573e12c5d1SDavid du Colombier #define NEXPR 3 1583e12c5d1SDavid du Colombier 1593e12c5d1SDavid du Colombier 1603e12c5d1SDavid du Colombier extern int pairstack[], paircnt; 1613e12c5d1SDavid du Colombier 1623e12c5d1SDavid du Colombier #define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc) 1633e12c5d1SDavid du Colombier #define isvalue(n) ((n)->ntype == NVALUE) 1643e12c5d1SDavid du Colombier #define isexpr(n) ((n)->ntype == NEXPR) 1653e12c5d1SDavid du Colombier #define isjump(n) ((n)->ctype == OJUMP) 1663e12c5d1SDavid du Colombier #define isexit(n) ((n)->csub == JEXIT) 1673e12c5d1SDavid du Colombier #define isbreak(n) ((n)->csub == JBREAK) 1683e12c5d1SDavid du Colombier #define iscont(n) ((n)->csub == JCONT) 1693e12c5d1SDavid du Colombier #define isnext(n) ((n)->csub == JNEXT) 170*7dd7cddfSDavid du Colombier #define isnextfile(n) ((n)->csub == JNEXTFILE) 1713e12c5d1SDavid du Colombier #define isret(n) ((n)->csub == JRET) 172*7dd7cddfSDavid du Colombier #define isrec(n) ((n)->tval & REC) 173*7dd7cddfSDavid du Colombier #define isfld(n) ((n)->tval & FLD) 1743e12c5d1SDavid du Colombier #define isstr(n) ((n)->tval & STR) 1753e12c5d1SDavid du Colombier #define isnum(n) ((n)->tval & NUM) 1763e12c5d1SDavid du Colombier #define isarr(n) ((n)->tval & ARR) 177*7dd7cddfSDavid du Colombier #define isfcn(n) ((n)->tval & FCN) 1783e12c5d1SDavid du Colombier #define istrue(n) ((n)->csub == BTRUE) 1793e12c5d1SDavid du Colombier #define istemp(n) ((n)->csub == CTEMP) 1803e12c5d1SDavid du Colombier #define isargument(n) ((n)->nobj == ARG) 181*7dd7cddfSDavid du Colombier /* #define freeable(p) (!((p)->tval & DONTFREE)) */ 182*7dd7cddfSDavid du Colombier #define freeable(p) ( ((p)->tval & (STR|DONTFREE)) == STR ) 1833e12c5d1SDavid du Colombier 1843e12c5d1SDavid du Colombier #include "proto.h" 185