123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- /*
- Copyright (c) Lucent Technologies 1997
- All Rights Reserved
- */
- typedef double Awkfloat;
- /* unsigned char is more trouble than it's worth */
- typedef unsigned char uschar;
- #define xfree(a) { if ((a) != NULL) { free((char *) a); a = NULL; } }
- #define DEBUG
- #ifdef DEBUG
- /* uses have to be doubly parenthesized */
- # define dprintf(x) if (dbg) printf x
- #else
- # define dprintf(x)
- #endif
- extern char errbuf[];
- 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
- #define FUTF 15
- /* 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)
- #define isnextfile(n) ((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 )
- #include "proto.h"
|