awk.h (4625B)
1 /* 2 Copyright (c) Lucent Technologies 1997 3 All Rights Reserved 4 5 */ 6 7 typedef double Awkfloat; 8 9 /* unsigned char is more trouble than it's worth */ 10 11 typedef unsigned char uschar; 12 13 #define xfree(a) { if ((a) != NULL) { free((char *) a); a = NULL; } } 14 15 #define DEBUG 16 #ifdef DEBUG 17 /* uses have to be doubly parenthesized */ 18 # define dprintf(x) if (dbg) printf x 19 #else 20 # define dprintf(x) 21 #endif 22 23 extern char errbuf[]; 24 25 extern int compile_time; /* 1 if compiling, 0 if running */ 26 extern int safe; /* 0 => unsafe, 1 => safe */ 27 28 #define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */ 29 extern int recsize; /* size of current record, orig RECSIZE */ 30 31 extern char **FS; 32 extern char **RS; 33 extern char **ORS; 34 extern char **OFS; 35 extern char **OFMT; 36 extern Awkfloat *NR; 37 extern Awkfloat *FNR; 38 extern Awkfloat *NF; 39 extern char **FILENAME; 40 extern char **SUBSEP; 41 extern Awkfloat *RSTART; 42 extern Awkfloat *RLENGTH; 43 44 extern char *record; /* points to $0 */ 45 extern int lineno; /* line number in awk program */ 46 extern int errorflag; /* 1 if error has occurred */ 47 extern int donefld; /* 1 if record broken into fields */ 48 extern int donerec; /* 1 if record is valid (no fld has changed */ 49 extern char inputFS[]; /* FS at time of input, for field splitting */ 50 51 extern int dbg; 52 53 extern char *patbeg; /* beginning of pattern matched */ 54 extern int patlen; /* length of pattern matched. set in b.c */ 55 56 /* Cell: all information about a variable or constant */ 57 58 typedef struct Cell { 59 uschar ctype; /* OCELL, OBOOL, OJUMP, etc. */ 60 uschar csub; /* CCON, CTEMP, CFLD, etc. */ 61 char *nval; /* name, for variables only */ 62 char *sval; /* string value */ 63 Awkfloat fval; /* value as number */ 64 int tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */ 65 struct Cell *cnext; /* ptr to next if chained */ 66 } Cell; 67 68 typedef struct Array { /* symbol table array */ 69 int nelem; /* elements in table right now */ 70 int size; /* size of tab */ 71 Cell **tab; /* hash table pointers */ 72 } Array; 73 74 #define NSYMTAB 50 /* initial size of a symbol table */ 75 extern Array *symtab; 76 77 extern Cell *nrloc; /* NR */ 78 extern Cell *fnrloc; /* FNR */ 79 extern Cell *nfloc; /* NF */ 80 extern Cell *rstartloc; /* RSTART */ 81 extern Cell *rlengthloc; /* RLENGTH */ 82 83 /* Cell.tval values: */ 84 #define NUM 01 /* number value is valid */ 85 #define STR 02 /* string value is valid */ 86 #define DONTFREE 04 /* string space is not freeable */ 87 #define CON 010 /* this is a constant */ 88 #define ARR 020 /* this is an array */ 89 #define FCN 040 /* this is a function name */ 90 #define FLD 0100 /* this is a field $1, $2, ... */ 91 #define REC 0200 /* this is $0 */ 92 93 94 /* function types */ 95 #define FLENGTH 1 96 #define FSQRT 2 97 #define FEXP 3 98 #define FLOG 4 99 #define FINT 5 100 #define FSYSTEM 6 101 #define FRAND 7 102 #define FSRAND 8 103 #define FSIN 9 104 #define FCOS 10 105 #define FATAN 11 106 #define FTOUPPER 12 107 #define FTOLOWER 13 108 #define FFLUSH 14 109 #define FUTF 15 110 111 /* Node: parse tree is made of nodes, with Cell's at bottom */ 112 113 typedef struct Node { 114 int ntype; 115 struct Node *nnext; 116 int lineno; 117 int nobj; 118 struct Node *narg[1]; /* variable: actual size set by calling malloc */ 119 } Node; 120 121 #define NIL ((Node *) 0) 122 123 extern Node *winner; 124 extern Node *nullstat; 125 extern Node *nullnode; 126 127 /* ctypes */ 128 #define OCELL 1 129 #define OBOOL 2 130 #define OJUMP 3 131 132 /* Cell subtypes: csub */ 133 #define CFREE 7 134 #define CCOPY 6 135 #define CCON 5 136 #define CTEMP 4 137 #define CNAME 3 138 #define CVAR 2 139 #define CFLD 1 140 #define CUNK 0 141 142 /* bool subtypes */ 143 #define BTRUE 11 144 #define BFALSE 12 145 146 /* jump subtypes */ 147 #define JEXIT 21 148 #define JNEXT 22 149 #define JBREAK 23 150 #define JCONT 24 151 #define JRET 25 152 #define JNEXTFILE 26 153 154 /* node types */ 155 #define NVALUE 1 156 #define NSTAT 2 157 #define NEXPR 3 158 159 160 extern int pairstack[], paircnt; 161 162 #define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc) 163 #define isvalue(n) ((n)->ntype == NVALUE) 164 #define isexpr(n) ((n)->ntype == NEXPR) 165 #define isjump(n) ((n)->ctype == OJUMP) 166 #define isexit(n) ((n)->csub == JEXIT) 167 #define isbreak(n) ((n)->csub == JBREAK) 168 #define iscont(n) ((n)->csub == JCONT) 169 #define isnext(n) ((n)->csub == JNEXT) 170 #define isnextfile(n) ((n)->csub == JNEXTFILE) 171 #define isret(n) ((n)->csub == JRET) 172 #define isrec(n) ((n)->tval & REC) 173 #define isfld(n) ((n)->tval & FLD) 174 #define isstr(n) ((n)->tval & STR) 175 #define isnum(n) ((n)->tval & NUM) 176 #define isarr(n) ((n)->tval & ARR) 177 #define isfcn(n) ((n)->tval & FCN) 178 #define istrue(n) ((n)->csub == BTRUE) 179 #define istemp(n) ((n)->csub == CTEMP) 180 #define isargument(n) ((n)->nobj == ARG) 181 /* #define freeable(p) (!((p)->tval & DONTFREE)) */ 182 #define freeable(p) ( ((p)->tval & (STR|DONTFREE)) == STR ) 183 184 #include "proto.h" 185