13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier Copyright (c) 1989 AT&T 33e12c5d1SDavid du Colombier All Rights Reserved 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T. 63e12c5d1SDavid du Colombier 73e12c5d1SDavid du Colombier The copyright notice above does not evidence any 83e12c5d1SDavid du Colombier actual or intended publication of such source code. 93e12c5d1SDavid du Colombier */ 103e12c5d1SDavid du Colombier 113e12c5d1SDavid du Colombier typedef double Awkfloat; 123e12c5d1SDavid du Colombier typedef /*unsigned*/ char uchar; 133e12c5d1SDavid du Colombier 143e12c5d1SDavid du Colombier #define xfree(a) { if ((a) != NULL) { free((char *) a); a = NULL; } } 153e12c5d1SDavid du Colombier 163e12c5d1SDavid du Colombier #define DEBUG 173e12c5d1SDavid du Colombier #ifdef DEBUG 183e12c5d1SDavid du Colombier /* uses have to be doubly parenthesized */ 193e12c5d1SDavid du Colombier # define dprintf(x) if (dbg) printf x 203e12c5d1SDavid du Colombier #else 213e12c5d1SDavid du Colombier # define dprintf(x) 223e12c5d1SDavid du Colombier #endif 233e12c5d1SDavid du Colombier 243e12c5d1SDavid du Colombier extern char errbuf[200]; 253e12c5d1SDavid du Colombier #define ERROR sprintf(errbuf, 263e12c5d1SDavid du Colombier #define FATAL ), error(1, errbuf) 273e12c5d1SDavid du Colombier #define WARNING ), error(0, errbuf) 283e12c5d1SDavid du Colombier #define SYNTAX ), yyerror(errbuf) 293e12c5d1SDavid du Colombier 303e12c5d1SDavid du Colombier extern int compile_time; /* 1 if compiling, 0 if running */ 313e12c5d1SDavid du Colombier 323e12c5d1SDavid du Colombier #define RECSIZE (3 * 1024) /* sets limit on records, fields, etc., etc. */ 33*219b2ee8SDavid du Colombier extern int recsize; /* variable version */ 343e12c5d1SDavid du Colombier 353e12c5d1SDavid du Colombier extern uchar **FS; 363e12c5d1SDavid du Colombier extern uchar **RS; 373e12c5d1SDavid du Colombier extern uchar **ORS; 383e12c5d1SDavid du Colombier extern uchar **OFS; 393e12c5d1SDavid du Colombier extern uchar **OFMT; 403e12c5d1SDavid du Colombier extern Awkfloat *NR; 413e12c5d1SDavid du Colombier extern Awkfloat *FNR; 423e12c5d1SDavid du Colombier extern Awkfloat *NF; 433e12c5d1SDavid du Colombier extern uchar **FILENAME; 443e12c5d1SDavid du Colombier extern uchar **SUBSEP; 453e12c5d1SDavid du Colombier extern Awkfloat *RSTART; 463e12c5d1SDavid du Colombier extern Awkfloat *RLENGTH; 473e12c5d1SDavid du Colombier 48*219b2ee8SDavid du Colombier extern uchar *record; /* points to $0 */ 49*219b2ee8SDavid du Colombier extern int lineno; /* line number in awk program */ 50*219b2ee8SDavid du Colombier extern int errorflag; /* 1 if error has occurred */ 513e12c5d1SDavid du Colombier extern int donefld; /* 1 if record broken into fields */ 523e12c5d1SDavid du Colombier extern int donerec; /* 1 if record is valid (no fld has changed */ 533e12c5d1SDavid du Colombier 54*219b2ee8SDavid du Colombier extern int dbg; 55*219b2ee8SDavid du Colombier 563e12c5d1SDavid du Colombier #define CBUFLEN 400 573e12c5d1SDavid du Colombier extern uchar cbuf[CBUFLEN]; /* miscellaneous character collection */ 583e12c5d1SDavid du Colombier 593e12c5d1SDavid du Colombier extern uchar *patbeg; /* beginning of pattern matched */ 60*219b2ee8SDavid du Colombier extern int patlen; /* length of pattern matched. set in b.c */ 613e12c5d1SDavid du Colombier 623e12c5d1SDavid du Colombier /* Cell: all information about a variable or constant */ 633e12c5d1SDavid du Colombier 643e12c5d1SDavid du Colombier typedef struct Cell { 653e12c5d1SDavid du Colombier uchar ctype; /* OCELL, OBOOL, OJUMP, etc. */ 663e12c5d1SDavid du Colombier uchar csub; /* CCON, CTEMP, CFLD, etc. */ 673e12c5d1SDavid du Colombier uchar *nval; /* name, for variables only */ 683e12c5d1SDavid du Colombier uchar *sval; /* string value */ 693e12c5d1SDavid du Colombier Awkfloat fval; /* value as number */ 703e12c5d1SDavid du Colombier unsigned tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */ 713e12c5d1SDavid du Colombier struct Cell *cnext; /* ptr to next if chained */ 723e12c5d1SDavid du Colombier } Cell; 733e12c5d1SDavid du Colombier 743e12c5d1SDavid du Colombier typedef struct { /* symbol table array */ 753e12c5d1SDavid du Colombier int nelem; /* elements in table right now */ 763e12c5d1SDavid du Colombier int size; /* size of tab */ 773e12c5d1SDavid du Colombier Cell **tab; /* hash table pointers */ 783e12c5d1SDavid du Colombier } Array; 793e12c5d1SDavid du Colombier 803e12c5d1SDavid du Colombier #define NSYMTAB 50 /* initial size of a symbol table */ 813e12c5d1SDavid du Colombier extern Array *symtab; 823e12c5d1SDavid du Colombier 833e12c5d1SDavid du Colombier extern Cell *recloc; /* location of input record */ 843e12c5d1SDavid du Colombier extern Cell *nrloc; /* NR */ 853e12c5d1SDavid du Colombier extern Cell *fnrloc; /* FNR */ 863e12c5d1SDavid du Colombier extern Cell *nfloc; /* NF */ 873e12c5d1SDavid du Colombier extern Cell *rstartloc; /* RSTART */ 883e12c5d1SDavid du Colombier extern Cell *rlengthloc; /* RLENGTH */ 893e12c5d1SDavid du Colombier 903e12c5d1SDavid du Colombier /* Cell.tval values: */ 913e12c5d1SDavid du Colombier #define NUM 01 /* number value is valid */ 923e12c5d1SDavid du Colombier #define STR 02 /* string value is valid */ 933e12c5d1SDavid du Colombier #define DONTFREE 04 /* string space is not freeable */ 943e12c5d1SDavid du Colombier #define CON 010 /* this is a constant */ 953e12c5d1SDavid du Colombier #define ARR 020 /* this is an array */ 963e12c5d1SDavid du Colombier #define FCN 040 /* this is a function name */ 973e12c5d1SDavid du Colombier #define FLD 0100 /* this is a field $1, $2, ... */ 983e12c5d1SDavid du Colombier #define REC 0200 /* this is $0 */ 993e12c5d1SDavid du Colombier 1003e12c5d1SDavid du Colombier 1013e12c5d1SDavid du Colombier /* function types */ 1023e12c5d1SDavid du Colombier #define FLENGTH 1 1033e12c5d1SDavid du Colombier #define FSQRT 2 1043e12c5d1SDavid du Colombier #define FEXP 3 1053e12c5d1SDavid du Colombier #define FLOG 4 1063e12c5d1SDavid du Colombier #define FINT 5 1073e12c5d1SDavid du Colombier #define FSYSTEM 6 1083e12c5d1SDavid du Colombier #define FRAND 7 1093e12c5d1SDavid du Colombier #define FSRAND 8 1103e12c5d1SDavid du Colombier #define FSIN 9 1113e12c5d1SDavid du Colombier #define FCOS 10 1123e12c5d1SDavid du Colombier #define FATAN 11 1133e12c5d1SDavid du Colombier #define FTOUPPER 12 1143e12c5d1SDavid du Colombier #define FTOLOWER 13 1153e12c5d1SDavid du Colombier #define FFLUSH 14 116*219b2ee8SDavid du Colombier #define FUTF 15 1173e12c5d1SDavid du Colombier 1183e12c5d1SDavid du Colombier /* Node: parse tree is made of nodes, with Cell's at bottom */ 1193e12c5d1SDavid du Colombier 1203e12c5d1SDavid du Colombier typedef struct Node { 1213e12c5d1SDavid du Colombier int ntype; 1223e12c5d1SDavid du Colombier struct Node *nnext; 1233e12c5d1SDavid du Colombier int lineno; 1243e12c5d1SDavid du Colombier int nobj; 1253e12c5d1SDavid du Colombier struct Node *narg[1]; /* variable: actual size set by calling malloc */ 1263e12c5d1SDavid du Colombier } Node; 1273e12c5d1SDavid du Colombier 1283e12c5d1SDavid du Colombier #define NIL ((Node *) 0) 1293e12c5d1SDavid du Colombier 1303e12c5d1SDavid du Colombier extern Node *winner; 1313e12c5d1SDavid du Colombier extern Node *nullstat; 1323e12c5d1SDavid du Colombier extern Node *nullnode; 1333e12c5d1SDavid du Colombier 1343e12c5d1SDavid du Colombier /* ctypes */ 1353e12c5d1SDavid du Colombier #define OCELL 1 1363e12c5d1SDavid du Colombier #define OBOOL 2 1373e12c5d1SDavid du Colombier #define OJUMP 3 1383e12c5d1SDavid du Colombier 1393e12c5d1SDavid du Colombier /* Cell subtypes: csub */ 1403e12c5d1SDavid du Colombier #define CFREE 7 1413e12c5d1SDavid du Colombier #define CCOPY 6 1423e12c5d1SDavid du Colombier #define CCON 5 1433e12c5d1SDavid du Colombier #define CTEMP 4 1443e12c5d1SDavid du Colombier #define CNAME 3 1453e12c5d1SDavid du Colombier #define CVAR 2 1463e12c5d1SDavid du Colombier #define CFLD 1 1473e12c5d1SDavid du Colombier 1483e12c5d1SDavid du Colombier /* bool subtypes */ 1493e12c5d1SDavid du Colombier #define BTRUE 11 1503e12c5d1SDavid du Colombier #define BFALSE 12 1513e12c5d1SDavid du Colombier 1523e12c5d1SDavid du Colombier /* jump subtypes */ 1533e12c5d1SDavid du Colombier #define JEXIT 21 1543e12c5d1SDavid du Colombier #define JNEXT 22 1553e12c5d1SDavid du Colombier #define JBREAK 23 1563e12c5d1SDavid du Colombier #define JCONT 24 1573e12c5d1SDavid du Colombier #define JRET 25 1583e12c5d1SDavid du Colombier 1593e12c5d1SDavid du Colombier /* node types */ 1603e12c5d1SDavid du Colombier #define NVALUE 1 1613e12c5d1SDavid du Colombier #define NSTAT 2 1623e12c5d1SDavid du Colombier #define NEXPR 3 1633e12c5d1SDavid du Colombier #define NFIELD 4 1643e12c5d1SDavid du Colombier 1653e12c5d1SDavid du Colombier 1663e12c5d1SDavid du Colombier extern int pairstack[], paircnt; 1673e12c5d1SDavid du Colombier 1683e12c5d1SDavid du Colombier #define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc) 1693e12c5d1SDavid du Colombier #define isvalue(n) ((n)->ntype == NVALUE) 1703e12c5d1SDavid du Colombier #define isexpr(n) ((n)->ntype == NEXPR) 1713e12c5d1SDavid du Colombier #define isjump(n) ((n)->ctype == OJUMP) 1723e12c5d1SDavid du Colombier #define isexit(n) ((n)->csub == JEXIT) 1733e12c5d1SDavid du Colombier #define isbreak(n) ((n)->csub == JBREAK) 1743e12c5d1SDavid du Colombier #define iscont(n) ((n)->csub == JCONT) 1753e12c5d1SDavid du Colombier #define isnext(n) ((n)->csub == JNEXT) 1763e12c5d1SDavid du Colombier #define isret(n) ((n)->csub == JRET) 1773e12c5d1SDavid du Colombier #define isstr(n) ((n)->tval & STR) 1783e12c5d1SDavid du Colombier #define isnum(n) ((n)->tval & NUM) 1793e12c5d1SDavid du Colombier #define isarr(n) ((n)->tval & ARR) 1803e12c5d1SDavid du Colombier #define isfunc(n) ((n)->tval & FCN) 1813e12c5d1SDavid du Colombier #define istrue(n) ((n)->csub == BTRUE) 1823e12c5d1SDavid du Colombier #define istemp(n) ((n)->csub == CTEMP) 1833e12c5d1SDavid du Colombier #define isargument(n) ((n)->nobj == ARG) 184*219b2ee8SDavid du Colombier #define freeable(p) (!((p)->tval & DONTFREE)) 1853e12c5d1SDavid du Colombier 1863e12c5d1SDavid du Colombier #include "proto.h" 187