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