| /**************************************************************** | |
| 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> | |
| #include <stdint.h> | |
| #include <stdbool.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 *)(intptr_t)(a)); (a) = NULL; } } | |
| /* | |
| * We sometimes cheat writing read-only pointers to NUL-terminate them | |
| * and then put back the original value | |
| */ | |
| #define setptr(ptr, a) (*(char *)(intptr_t)(ptr)) = (a) | |
| #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 enum compile_states { | |
| RUNNING, | |
| COMPILING, | |
| ERROR_PRINTING | |
| } compile_time; | |
| extern bool safe; /* false => unsafe, true => safe */ | |
| #define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */ | |
| extern int recsize; /* size of current record, orig RECSIZE */ | |
| extern char EMPTY[]; /* this avoid -Wwritable-strings issues */ | |
| 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 bool donefld; /* true if record broken into fields */ | |
| extern bool donerec; /* true if record is valid (no fld has changed */ | |
| extern int dbg; | |
| extern const 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|CONVC|CONVO */ | |
| char *fmt; /* CONVFMT/OFMT value used to convert from number */ | |
| 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 *fsloc; /* FS */ | |
| extern Cell *nfloc; /* NF */ | |
| extern Cell *ofsloc; /* OFS */ | |
| extern Cell *orsloc; /* ORS */ | |
| extern Cell *rsloc; /* RS */ | |
| extern Cell *rstartloc; /* RSTART */ | |
| extern Cell *rlengthloc; /* RLENGTH */ | |
| extern Cell *subseploc; /* SUBSEP */ | |
| extern Cell *symtabloc; /* SYMTAB */ | |
| /* 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 */ | |
| #define CONVC 0400 /* string was converted from number via CONVFMT */ | |
| #define CONVO 01000 /* string was converted from number via OFMT */ | |
| /* 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 HAT (NCHARS+2) /* matches ^ in regular expr */ | |
| #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 { | |
| unsigned int **gototab; | |
| uschar *out; | |
| uschar *restr; | |
| int **posns; | |
| int state_count; | |
| bool anchor; | |
| int use; | |
| int initstat; | |
| int curstat; | |
| int accept; | |
| struct rrow re[1]; /* variable: actual size set by calling malloc */ | |
| } fa; | |
| #include "proto.h" |