1 #include <stdio.h>
2 #include "awk.h"
3 #include "awkgram.h"
4 
5 static const char * const printname[96] = {
6           "FIRSTTOKEN",       /* 257 */
7           "PROGRAM",          /* 258 */
8           "PASTAT", /* 259 */
9           "PASTAT2",          /* 260 */
10           "XBEGIN", /* 261 */
11           "XEND",   /* 262 */
12           "NL",     /* 263 */
13           "ARRAY",  /* 264 */
14           "MATCH",  /* 265 */
15           "NOTMATCH",         /* 266 */
16           "MATCHOP",          /* 267 */
17           "FINAL",  /* 268 */
18           "DOT",    /* 269 */
19           "ALL",    /* 270 */
20           "CCL",    /* 271 */
21           "NCCL",   /* 272 */
22           "CHAR",   /* 273 */
23           "OR",     /* 274 */
24           "STAR",   /* 275 */
25           "QUEST",  /* 276 */
26           "PLUS",   /* 277 */
27           "EMPTYRE",          /* 278 */
28           "ZERO",   /* 279 */
29           "AND",    /* 280 */
30           "BOR",    /* 281 */
31           "APPEND", /* 282 */
32           "EQ",     /* 283 */
33           "GE",     /* 284 */
34           "GT",     /* 285 */
35           "LE",     /* 286 */
36           "LT",     /* 287 */
37           "NE",     /* 288 */
38           "IN",     /* 289 */
39           "ARG",    /* 290 */
40           "BLTIN",  /* 291 */
41           "BREAK",  /* 292 */
42           "CLOSE",  /* 293 */
43           "CONTINUE",         /* 294 */
44           "DELETE", /* 295 */
45           "DO",     /* 296 */
46           "EXIT",   /* 297 */
47           "FOR",    /* 298 */
48           "FUNC",   /* 299 */
49           "GENSUB", /* 300 */
50           "SUB",    /* 301 */
51           "GSUB",   /* 302 */
52           "IF",     /* 303 */
53           "INDEX",  /* 304 */
54           "LSUBSTR",          /* 305 */
55           "MATCHFCN",         /* 306 */
56           "NEXT",   /* 307 */
57           "NEXTFILE",         /* 308 */
58           "ADD",    /* 309 */
59           "MINUS",  /* 310 */
60           "MULT",   /* 311 */
61           "DIVIDE", /* 312 */
62           "MOD",    /* 313 */
63           "ASSIGN", /* 314 */
64           "ASGNOP", /* 315 */
65           "ADDEQ",  /* 316 */
66           "SUBEQ",  /* 317 */
67           "MULTEQ", /* 318 */
68           "DIVEQ",  /* 319 */
69           "MODEQ",  /* 320 */
70           "POWEQ",  /* 321 */
71           "PRINT",  /* 322 */
72           "PRINTF", /* 323 */
73           "SPRINTF",          /* 324 */
74           "ELSE",   /* 325 */
75           "INTEST", /* 326 */
76           "CONDEXPR",         /* 327 */
77           "POSTINCR",         /* 328 */
78           "PREINCR",          /* 329 */
79           "POSTDECR",         /* 330 */
80           "PREDECR",          /* 331 */
81           "VAR",    /* 332 */
82           "IVAR",   /* 333 */
83           "VARNF",  /* 334 */
84           "CALL",   /* 335 */
85           "NUMBER", /* 336 */
86           "STRING", /* 337 */
87           "REGEXPR",          /* 338 */
88           "GETLINE",          /* 339 */
89           "RETURN", /* 340 */
90           "SPLIT",  /* 341 */
91           "SUBSTR", /* 342 */
92           "WHILE",  /* 343 */
93           "CAT",    /* 344 */
94           "NOT",    /* 345 */
95           "UMINUS", /* 346 */
96           "UPLUS",  /* 347 */
97           "POWER",  /* 348 */
98           "DECR",   /* 349 */
99           "INCR",   /* 350 */
100           "INDIRECT",         /* 351 */
101           "LASTTOKEN",        /* 352 */
102 };
103 
104 
105 Cell *(*proctab[96])(Node **, int) = {
106           nullproc, /* FIRSTTOKEN */
107           program,  /* PROGRAM */
108           pastat,   /* PASTAT */
109           dopa2,    /* PASTAT2 */
110           nullproc, /* XBEGIN */
111           nullproc, /* XEND */
112           nullproc, /* NL */
113           array,    /* ARRAY */
114           matchop,  /* MATCH */
115           matchop,  /* NOTMATCH */
116           nullproc, /* MATCHOP */
117           nullproc, /* FINAL */
118           nullproc, /* DOT */
119           nullproc, /* ALL */
120           nullproc, /* CCL */
121           nullproc, /* NCCL */
122           nullproc, /* CHAR */
123           nullproc, /* OR */
124           nullproc, /* STAR */
125           nullproc, /* QUEST */
126           nullproc, /* PLUS */
127           nullproc, /* EMPTYRE */
128           nullproc, /* ZERO */
129           boolop,   /* AND */
130           boolop,   /* BOR */
131           nullproc, /* APPEND */
132           relop,    /* EQ */
133           relop,    /* GE */
134           relop,    /* GT */
135           relop,    /* LE */
136           relop,    /* LT */
137           relop,    /* NE */
138           instat,   /* IN */
139           arg,      /* ARG */
140           bltin,    /* BLTIN */
141           jump,     /* BREAK */
142           closefile,          /* CLOSE */
143           jump,     /* CONTINUE */
144           awkdelete,          /* DELETE */
145           dostat,   /* DO */
146           jump,     /* EXIT */
147           forstat,  /* FOR */
148           nullproc, /* FUNC */
149           gensub,   /* GENSUB */
150           dosub,    /* SUB */
151           dosub,    /* GSUB */
152           ifstat,   /* IF */
153           sindex,   /* INDEX */
154           nullproc, /* LSUBSTR */
155           matchop,  /* MATCHFCN */
156           jump,     /* NEXT */
157           jump,     /* NEXTFILE */
158           arith,    /* ADD */
159           arith,    /* MINUS */
160           arith,    /* MULT */
161           arith,    /* DIVIDE */
162           arith,    /* MOD */
163           assign,   /* ASSIGN */
164           nullproc, /* ASGNOP */
165           assign,   /* ADDEQ */
166           assign,   /* SUBEQ */
167           assign,   /* MULTEQ */
168           assign,   /* DIVEQ */
169           assign,   /* MODEQ */
170           assign,   /* POWEQ */
171           printstat,          /* PRINT */
172           awkprintf,          /* PRINTF */
173           awksprintf,         /* SPRINTF */
174           nullproc, /* ELSE */
175           intest,   /* INTEST */
176           condexpr, /* CONDEXPR */
177           incrdecr, /* POSTINCR */
178           incrdecr, /* PREINCR */
179           incrdecr, /* POSTDECR */
180           incrdecr, /* PREDECR */
181           nullproc, /* VAR */
182           nullproc, /* IVAR */
183           getnf,    /* VARNF */
184           call,     /* CALL */
185           nullproc, /* NUMBER */
186           nullproc, /* STRING */
187           nullproc, /* REGEXPR */
188           awkgetline,         /* GETLINE */
189           jump,     /* RETURN */
190           split,    /* SPLIT */
191           substr,   /* SUBSTR */
192           whilestat,          /* WHILE */
193           cat,      /* CAT */
194           boolop,   /* NOT */
195           arith,    /* UMINUS */
196           arith,    /* UPLUS */
197           arith,    /* POWER */
198           nullproc, /* DECR */
199           nullproc, /* INCR */
200           indirect, /* INDIRECT */
201           nullproc, /* LASTTOKEN */
202 };
203 
tokname(int n)204 const char *tokname(int n)
205 {
206           static char buf[100];
207 
208           if (n < FIRSTTOKEN || n > LASTTOKEN) {
209                     snprintf(buf, sizeof(buf), "token %d", n);
210                     return buf;
211           }
212           return printname[n-FIRSTTOKEN];
213 }
214