Blame


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