|
|
1.1 root 1: typedef double Awkfloat;
2: typedef unsigned char uchar;
3:
4: #ifdef MYALLOC
5: extern uchar *Malloc(), *Calloc();
6: #else
7: # define Malloc malloc
8: # define Calloc calloc
9: # define Free free
10: #endif
11:
12: #define xfree(a) { if ((a) != NULL) { Free(a); a = NULL; } }
13:
14: #ifdef DEBUG
15: # define dprintf if(dbg)printf
16: #else
17: # define dprintf(x1, x2, x3, x4)
18: #endif
19:
20: extern int compile_time; /* 1 if compiling, 0 if running */
21:
22: #define RECSIZE (3 * 1024) /* sets limit on records, fields, etc., etc. */
23:
24: extern uchar **FS;
25: extern uchar **RS;
26: extern uchar **ORS;
27: extern uchar **OFS;
28: extern uchar **OFMT;
29: extern Awkfloat *NR;
30: extern Awkfloat *FNR;
31: extern Awkfloat *NF;
32: extern uchar **FILENAME;
33: extern uchar **SUBSEP;
34: extern Awkfloat *RSTART;
35: extern Awkfloat *RLENGTH;
36:
37: extern uchar *record;
38: extern int dbg;
39: extern int lineno;
40: extern int errorflag;
41: extern int donefld; /* 1 if record broken into fields */
42: extern int donerec; /* 1 if record is valid (no fld has changed */
43:
44: #define CBUFLEN 400
45: extern uchar cbuf[CBUFLEN]; /* miscellaneous character collection */
46:
47: extern uchar *patbeg; /* beginning of pattern matched */
48: extern int patlen; /* length. set in b.c */
49:
50: /* Cell: all information about a variable or constant */
51:
52: typedef struct Cell {
53: uchar ctype; /* OCELL, OBOOL, OJUMP, etc. */
54: uchar csub; /* CCON, CTEMP, CFLD, etc. */
55: uchar *nval; /* name, for variables only */
56: uchar *sval; /* string value */
57: Awkfloat fval; /* value as number */
58: unsigned tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
59: struct Cell *cnext; /* ptr to next if chained */
60: } Cell;
61:
62: typedef struct { /* symbol table array */
63: int nelem; /* elements in table right now */
64: int size; /* size of tab */
65: Cell **tab; /* hash table pointers */
66: } Array;
67:
68: #define NSYMTAB 50 /* initial size of a symbol table */
69: extern Array *symtab, *makesymtab();
70: extern Cell *setsymtab(), *lookup();
71:
72: extern Cell *recloc; /* location of input record */
73: extern Cell *nrloc; /* NR */
74: extern Cell *fnrloc; /* FNR */
75: extern Cell *nfloc; /* NF */
76: extern Cell *rstartloc; /* RSTART */
77: extern Cell *rlengthloc; /* RLENGTH */
78:
79: /* Cell.tval values: */
80: #define NUM 01 /* number value is valid */
81: #define STR 02 /* string value is valid */
82: #define DONTFREE 04 /* string space is not freeable */
83: #define CON 010 /* this is a constant */
84: #define ARR 020 /* this is an array */
85: #define FCN 040 /* this is a function name */
86: #define FLD 0100 /* this is a field $1, $2, ... */
87: #define REC 0200 /* this is $0 */
88:
89: #define freeable(p) (!((p)->tval & DONTFREE))
90:
91: Awkfloat setfval(), getfval();
92: uchar *setsval(), *getsval();
93: uchar *tostring(), *tokname(), *malloc(), *calloc(), *qstring();
94: double log(), sqrt(), exp(), atof();
95:
96: /* function types */
97: #define FLENGTH 1
98: #define FSQRT 2
99: #define FEXP 3
100: #define FLOG 4
101: #define FINT 5
102: #define FSYSTEM 6
103: #define FRAND 7
104: #define FSRAND 8
105: #define FSIN 9
106: #define FCOS 10
107: #define FATAN 11
108:
109: /* Node: parse tree is made of nodes, with Cell's at bottom */
110:
111: typedef struct Node {
112: int ntype;
113: struct Node *nnext;
114: int lineno;
115: int nobj;
116: struct Node *narg[1]; /* variable: actual size set by calling malloc */
117: } Node;
118:
119: #define NIL ((Node *) 0)
120:
121: extern Node *winner;
122: extern Node *nullstat;
123: extern Node *nullnode;
124:
125: /* ctypes */
126: #define OCELL 1
127: #define OBOOL 2
128: #define OJUMP 3
129:
130: /* Cell subtypes: csub */
131: #define CCOPY 6
132: #define CCON 5
133: #define CTEMP 4
134: #define CNAME 3
135: #define CVAR 2
136: #define CFLD 1
137:
138: /* bool subtypes */
139: #define BTRUE 11
140: #define BFALSE 12
141:
142: /* jump subtypes */
143: #define JEXIT 21
144: #define JNEXT 22
145: #define JBREAK 23
146: #define JCONT 24
147: #define JRET 25
148:
149: /* node types */
150: #define NVALUE 1
151: #define NSTAT 2
152: #define NEXPR 3
153: #define NFIELD 4
154:
155: extern Cell *(*proctab[])();
156: extern Cell *nullproc();
157: extern Cell *relop();
158: extern int pairstack[], paircnt;
159: extern Cell *fieldadr();
160:
161: extern Node *stat1(), *stat2(), *stat3(), *stat4(), *pa2stat();
162: extern Node *op1(), *op2(), *op3(), *op4();
163: extern Node *linkum(), *valtonode(), *rectonode(), *exptostat();
164: extern Node *makearr();
165:
166: #define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
167: #define isvalue(n) ((n)->ntype == NVALUE)
168: #define isexpr(n) ((n)->ntype == NEXPR)
169: #define isjump(n) ((n)->ctype == OJUMP)
170: #define isexit(n) ((n)->csub == JEXIT)
171: #define isbreak(n) ((n)->csub == JBREAK)
172: #define iscont(n) ((n)->csub == JCONT)
173: #define isnext(n) ((n)->csub == JNEXT)
174: #define isret(n) ((n)->csub == JRET)
175: #define isstr(n) ((n)->tval & STR)
176: #define isnum(n) ((n)->tval & NUM)
177: #define isarr(n) ((n)->tval & ARR)
178: #define isfunc(n) ((n)->tval & FCN)
179: #define istrue(n) ((n)->csub == BTRUE)
180: #define istemp(n) ((n)->csub == CTEMP)
181:
182: #define NCHARS (128+1) /* could be 256+1 */
183: #define NSTATES 16
184:
185: typedef struct rrow {
186: int ltype;
187: int lval;
188: int *lfollow;
189: } rrow;
190:
191: typedef struct fa {
192: uchar *restr;
193: int anchor;
194: int use;
195: uchar gototab[NSTATES][NCHARS];
196: int *posns[NSTATES];
197: uchar out[NSTATES];
198: int initstat;
199: int curstat;
200: int accept;
201: int reset;
202: struct rrow re[1];
203: } fa;
204:
205: extern fa *makedfa();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.