|
|
1.1 root 1: /*
2: * AWK header - typedefs and c.
3: */
4:
5: #include <stdio.h>
6: #include <setjmp.h>
7: #include <ctype.h>
8:
9: #define NWORD 400 /* Longest word or identifier in yylex */
10: #define NCSET 256 /* Size of character set (ascii + top bit) */
11: #define MAXRECORD 2048 /* Longest input record */
12: #define NBPC 8 /* Bytes in a char */
13: #define NHASH 64 /* Number of symbol table hash buckets */
14: #define NSBRK 256 /* Amount sbroken per call in `xalloc' */
15: #define NCLASSC 128 /* Number of class characters */
16: #define NCLASS (NCLASSC/NBPC) /* Chars in a class */
17: #define NOFILE 10 /* Limit on the number of open files */
18: #define NNEST 15 /* For/while nesting */
19:
20: typedef double FLOAT; /* Floating point type */
21: typedef long INT; /* Integer type */
22: typedef unsigned char CHAR; /* Character type */
23: typedef unsigned char *STRING; /* String type */
24:
25: #define stof atof /* String to FLOAT */
26: #define stoi atol /* String to INT */
27:
28: /*
29: * Used for identifiers, array elements,
30: * and just constants. (The name field is
31: * not used here).
32: */
33: typedef struct TERM {
34: CHAR t_op; /* Op type */
35: CHAR t_flag;
36: struct TERM *t_next; /* Hash chain */
37: unsigned t_hval; /* Hash value for symbol table */
38: unsigned t_ahval; /* Hash value without array index */
39: union {
40: FLOAT t_float;
41: INT t_int;
42: STRING t_str;
43: struct {
44: union NODE *(*t_func)();
45: CHAR t_minarg;
46: CHAR t_maxarg;
47: } t_fun;
48: } t_un;
49: CHAR t_name[]; /* Name of array or identifier */
50: } TERM;
51:
52: /* Node types (t_flag) */
53: #define T_NUM 01 /* Numeric value vs. string */
54: #define T_INT 02 /* Integer vs. floating */
55: #define T_VAR 04 /* Variable */
56: #define T_ARRAY 010 /* Array */
57: #define T_ALLOC 020 /* Allocated string */
58:
59: /*
60: * Expression tree node.
61: */
62: typedef struct OPNODE {
63: CHAR n_op;
64: CHAR n_flag;
65: union {
66: CHAR *n_charp;
67: int n_char;
68: struct NODE *n_node;
69: } n_o1, n_o2, n_o3, n_o4;
70: } OPNODE;
71:
72: /* Defines to made operand NODES easier to type in */
73: #define n_O1 n_o1.n_node
74: #define n_O2 n_o2.n_node
75: #define n_O3 n_o3.n_node
76: #define n_O4 n_o4.n_node
77: #define t_STRING t_un.t_str
78: #define t_INT t_un.t_int
79: #define t_FLOAT t_un.t_float
80: #define t_FUNC t_un.t_fun.t_func
81: #define t_MINARG t_un.t_fun.t_minarg
82: #define t_MAXARG t_un.t_fun.t_maxarg
83:
84: /*
85: * Basic nodes -- union of a TERM
86: * and an expression tree OPNODE.
87: */
88: typedef union NODE {
89: OPNODE opnode;
90: TERM term;
91: } NODE;
92:
93: /*
94: * An open file.
95: */
96: typedef struct OFILE {
97: int of_flag;
98: FILE *of_fp;
99: CHAR *of_name;
100: } OFILE;
101:
102: /* of_flag bits */
103: #define OFPIPE 01 /* This is a pipe output */
104:
105: /* Defined functions */
106: #define nel(x) (sizeof(x)/sizeof((x)[0]))
107: #define endof(x) (&(x)[nel(x)])
108: #define streq(s1,s2) (strcmp(s1,s2)==0)
109: #define bump(ip,t) (ip+=sizeof(t)/sizeof(int)) /* bump for printf */
110:
111: /* Function declaration */
112: CHAR *xalloc();
113: STRING awkinput();
114: NODE *lookup();
115: NODE *alookup();
116: NODE *install();
117: STRING evalstring();
118: INT evalint();
119: FLOAT evalfloat();
120: NODE *evalexpr();
121: FLOAT stof();
122: INT stoi();
123: NODE *node();
124: NODE *cnode();
125: NODE *cpnode();
126: NODE *snode();
127: NODE *fnode();
128: NODE *inode();
129: NODE *fargn();
130: NODE *xadd();
131: NODE *xsub();
132: NODE *xmul();
133: NODE *xdiv();
134: NODE *xmod();
135: NODE *xcmp();
136: NODE *xconc();
137: NODE *xarray();
138: NODE *xfield();
139: NODE *xassign();
140: NODE *xinca();
141: NODE *xdeca();
142: NODE *xneg();
143:
144: /*
145: * Declaration of built-in
146: * functions.
147: */
148: NODE *f_length();
149: NODE *f_sqrt();
150: NODE *f_log();
151: NODE *f_exp();
152: NODE *f_int();
153: NODE *f_substr();
154: NODE *f_index();
155: NODE *f_sprintf();
156: NODE *f_split();
157: NODE *f_abs();
158:
159: /*
160: * External references.
161: */
162: extern CHAR *parg; /* Program argument pointer */
163: extern FILE *pfp; /* Program file pointer */
164: extern int lexre; /* Reading regular expression -- yylex */
165: extern CHAR wordbuf[NWORD];
166: extern TERM xzero;
167: extern TERM xone;
168: extern NODE xfield0;
169: extern NODE *codep;
170: extern int beginflag;
171: extern int endflag;
172: extern int runflag;
173: extern int yflag;
174: extern int nlskip;
175: extern int exitflag;
176: extern int lineno;
177: extern int whitesw;
178: extern CHAR *inline;
179: extern jmp_buf nextenv;
180: extern jmp_buf fwenv[NNEST];
181: extern int fwlevel;
182: extern int brlevel;
183: extern int outflag;
184: extern TERM *symtab[NHASH];
185: extern NODE *tempnodes;
186: extern CHAR SNULL[];
187: extern OFILE files[NOFILE];
188: extern CHAR inbuf[BUFSIZ];
189: extern CHAR outbuf[BUFSIZ];
190:
191: /*
192: * References to the built-in
193: * values.
194: */
195: extern NODE *FILENAMEp;
196: extern NODE *NFp;
197: extern NODE *NRp;
198: extern NODE *FSp;
199: extern NODE *RSp;
200: extern NODE *OFSp;
201: extern NODE *ORSp;
202: extern NODE *OFMTp;
203:
204: #define FILENAME (FILENAMEp->t_STRING)
205: #define NF (NFp->t_INT)
206: #define NR (NRp->t_INT)
207: #define FS (FSp->t_STRING)
208: #define RS (RSp->t_STRING)
209: #define OFS (OFSp->t_STRING)
210: #define ORS (ORSp->t_STRING)
211: #define OFMT (OFMTp->t_STRING)
212: #define FSMAP wordbuf /* Map to speed up field selection */
213:
214: /*
215: * Operators in the expression tree.
216: */
217: #define AROOT 1 /* Root -- pattern, action */
218: #define ARE 2 /* /RE/ */
219: #define AREMAT 3 /* s ~ /RE/ */
220: #define ARENMAT 4 /* S !~ /RE/ */
221: #define AEQ 5 /* a==b */
222: #define ANE 6 /* a!=b */
223: #define AGT 7 /* a>b */
224: #define AGE 8 /* a>=b */
225: #define ALT 9 /* a<b */
226: #define ALE 10 /* a<=b */
227: #define AADD 11 /* a+b */
228: #define ASUB 12 /* a-b */
229: #define AMUL 13 /* a*b */
230: #define ADIV 14 /* a/b */
231: #define AMOD 15 /* a%b */
232: #define AASGN 21 /* a=b */
233: #define ANOT 22 /* !a */
234: #define AANDAND 23 /* a&&b */
235: #define AOROR 24 /* a||b */
236: #define AARRAY 25 /* a[b] */
237: #define AINCA 27 /* a++ */
238: #define ADECA 29 /* a-- */
239: #define ARCLOS 30 /* RE -- a* */
240: #define ARNECL 31 /* RE -- a+ */
241: #define ARZOCL 32 /* RE -- a? */
242: #define AROR 33 /* RE -- a|b */
243: #define ARBOL 34 /* RE -- ^ */
244: #define AREOL 35 /* RE -- $ */
245: #define ARANY 36 /* RE -- . */
246: #define ARCON 37 /* RE - ab */
247: #define ARCLASS 38 /* RE - [...] */
248: #define ARDCLASS 39 /* RE -- class under `-y' */
249: #define ARCHAR 40 /* RE -- CHAR */
250: #define ARDCHAR 41 /* RE -- dual case CHAR */
251: #define AFIELD 42 /* $a */
252: #define APRINT 43 /* print */
253: #define APRINTF 44 /* printf */
254: #define AFUN 45 /* function */
255: #define ALIST 46 /* a,b */
256: #define ANUM 48 /* number or string */
257: #define AFOUT 49 /* > file */
258: #define AFAPP 50 /* >> file */
259: #define AFPIPE 51 /* | command */
260: #define AIF 52 /* if (exp) statement */
261: #define AFORIN 53 /* for (x in array ) */
262: #define AFOR 54 /* for(e;e;e) s */
263: #define AWHILE 55 /* while(e)s */
264: #define ABREAK 56 /* break */
265: #define ACONTIN 57 /* continue */
266: #define ACONC 58 /* s1 s2 */
267: #define ABEGIN 59 /* begin */
268: #define AEND 60 /* end */
269: #define AEXIT 61 /* exit */
270: #define ANEXT 62 /* next */
271: #define ARANGE 63 /* a,b */
272: #define ATERM 64 /* Terminal */
273: #define AFUNC 65 /* Function */
274: #define AKEYW 66 /* Dummy type for keyword */
275: #define ANEG 67 /* - a */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.