xref: /netbsd-src/external/historical/nawk/dist/proctab.c (revision 696d0ef0dc91fbd57b3fe791979df51cfceabe8f)
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 
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