13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier Copyright (c) 1989 AT&T 33e12c5d1SDavid du Colombier All Rights Reserved 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T. 63e12c5d1SDavid du Colombier 73e12c5d1SDavid du Colombier The copyright notice above does not evidence any 83e12c5d1SDavid du Colombier actual or intended publication of such source code. 93e12c5d1SDavid du Colombier */ 103e12c5d1SDavid du Colombier 11*219b2ee8SDavid du Colombier /* 12*219b2ee8SDavid du Colombier * this program makes the table to link function names 13*219b2ee8SDavid du Colombier * and type indices that is used by execute() in run.c. 14*219b2ee8SDavid du Colombier * it finds the indices in y.tab.h, produced by yacc. 15*219b2ee8SDavid du Colombier */ 16*219b2ee8SDavid du Colombier 173e12c5d1SDavid du Colombier #include <stdio.h> 183e12c5d1SDavid du Colombier #include <string.h> 193e12c5d1SDavid du Colombier #include <stdlib.h> 203e12c5d1SDavid du Colombier #include "awk.h" 213e12c5d1SDavid du Colombier #include "y.tab.h" 223e12c5d1SDavid du Colombier 233e12c5d1SDavid du Colombier struct xx 243e12c5d1SDavid du Colombier { int token; 253e12c5d1SDavid du Colombier char *name; 263e12c5d1SDavid du Colombier char *pname; 273e12c5d1SDavid du Colombier } proc[] = { 283e12c5d1SDavid du Colombier { PROGRAM, "program", NULL }, 293e12c5d1SDavid du Colombier { BOR, "boolop", " || " }, 303e12c5d1SDavid du Colombier { AND, "boolop", " && " }, 313e12c5d1SDavid du Colombier { NOT, "boolop", " !" }, 323e12c5d1SDavid du Colombier { NE, "relop", " != " }, 333e12c5d1SDavid du Colombier { EQ, "relop", " == " }, 343e12c5d1SDavid du Colombier { LE, "relop", " <= " }, 353e12c5d1SDavid du Colombier { LT, "relop", " < " }, 363e12c5d1SDavid du Colombier { GE, "relop", " >= " }, 373e12c5d1SDavid du Colombier { GT, "relop", " > " }, 383e12c5d1SDavid du Colombier { ARRAY, "array", NULL }, 393e12c5d1SDavid du Colombier { INDIRECT, "indirect", "$(" }, 403e12c5d1SDavid du Colombier { SUBSTR, "substr", "substr" }, 413e12c5d1SDavid du Colombier { SUB, "sub", "sub" }, 423e12c5d1SDavid du Colombier { GSUB, "gsub", "gsub" }, 433e12c5d1SDavid du Colombier { INDEX, "sindex", "sindex" }, 443e12c5d1SDavid du Colombier { SPRINTF, "asprintf", "sprintf " }, 453e12c5d1SDavid du Colombier { ADD, "arith", " + " }, 463e12c5d1SDavid du Colombier { MINUS, "arith", " - " }, 473e12c5d1SDavid du Colombier { MULT, "arith", " * " }, 483e12c5d1SDavid du Colombier { DIVIDE, "arith", " / " }, 493e12c5d1SDavid du Colombier { MOD, "arith", " % " }, 503e12c5d1SDavid du Colombier { UMINUS, "arith", " -" }, 513e12c5d1SDavid du Colombier { POWER, "arith", " **" }, 523e12c5d1SDavid du Colombier { PREINCR, "incrdecr", "++" }, 533e12c5d1SDavid du Colombier { POSTINCR, "incrdecr", "++" }, 543e12c5d1SDavid du Colombier { PREDECR, "incrdecr", "--" }, 553e12c5d1SDavid du Colombier { POSTDECR, "incrdecr", "--" }, 563e12c5d1SDavid du Colombier { CAT, "cat", " " }, 573e12c5d1SDavid du Colombier { PASTAT, "pastat", NULL }, 583e12c5d1SDavid du Colombier { PASTAT2, "dopa2", NULL }, 593e12c5d1SDavid du Colombier { MATCH, "matchop", " ~ " }, 603e12c5d1SDavid du Colombier { NOTMATCH, "matchop", " !~ " }, 613e12c5d1SDavid du Colombier { MATCHFCN, "matchop", "matchop" }, 623e12c5d1SDavid du Colombier { INTEST, "intest", "intest" }, 633e12c5d1SDavid du Colombier { PRINTF, "aprintf", "printf" }, 643e12c5d1SDavid du Colombier { PRINT, "printstat", "print" }, 653e12c5d1SDavid du Colombier { CLOSE, "closefile", "closefile" }, 66*219b2ee8SDavid du Colombier { DELETE, "adelete", "adelete" }, 673e12c5d1SDavid du Colombier { SPLIT, "split", "split" }, 683e12c5d1SDavid du Colombier { ASSIGN, "assign", " = " }, 693e12c5d1SDavid du Colombier { ADDEQ, "assign", " += " }, 703e12c5d1SDavid du Colombier { SUBEQ, "assign", " -= " }, 713e12c5d1SDavid du Colombier { MULTEQ, "assign", " *= " }, 723e12c5d1SDavid du Colombier { DIVEQ, "assign", " /= " }, 733e12c5d1SDavid du Colombier { MODEQ, "assign", " %= " }, 743e12c5d1SDavid du Colombier { POWEQ, "assign", " ^= " }, 753e12c5d1SDavid du Colombier { CONDEXPR, "condexpr", " ?: " }, 763e12c5d1SDavid du Colombier { IF, "ifstat", "if(" }, 773e12c5d1SDavid du Colombier { WHILE, "whilestat", "while(" }, 783e12c5d1SDavid du Colombier { FOR, "forstat", "for(" }, 793e12c5d1SDavid du Colombier { DO, "dostat", "do" }, 803e12c5d1SDavid du Colombier { IN, "instat", "instat" }, 813e12c5d1SDavid du Colombier { NEXT, "jump", "next" }, 823e12c5d1SDavid du Colombier { EXIT, "jump", "exit" }, 833e12c5d1SDavid du Colombier { BREAK, "jump", "break" }, 843e12c5d1SDavid du Colombier { CONTINUE, "jump", "continue" }, 853e12c5d1SDavid du Colombier { RETURN, "jump", "ret" }, 863e12c5d1SDavid du Colombier { BLTIN, "bltin", "bltin" }, 873e12c5d1SDavid du Colombier { CALL, "call", "call" }, 883e12c5d1SDavid du Colombier { ARG, "arg", "arg" }, 893e12c5d1SDavid du Colombier { VARNF, "getnf", "NF" }, 903e12c5d1SDavid du Colombier { GETLINE, "getline", "getline" }, 913e12c5d1SDavid du Colombier { 0, "", "" }, 923e12c5d1SDavid du Colombier }; 933e12c5d1SDavid du Colombier 94*219b2ee8SDavid du Colombier #define SIZE (LASTTOKEN - FIRSTTOKEN + 1) 953e12c5d1SDavid du Colombier char *table[SIZE]; 963e12c5d1SDavid du Colombier char *names[SIZE]; 973e12c5d1SDavid du Colombier 98*219b2ee8SDavid du Colombier main(int argc, char *argv[]) 993e12c5d1SDavid du Colombier { 1003e12c5d1SDavid du Colombier struct xx *p; 1013e12c5d1SDavid du Colombier int i, n, tok; 1023e12c5d1SDavid du Colombier char c; 1033e12c5d1SDavid du Colombier FILE *fp; 104*219b2ee8SDavid du Colombier char buf[200], name[200], def[200]; 1053e12c5d1SDavid du Colombier 1063e12c5d1SDavid du Colombier printf("#include <stdio.h>\n"); 1073e12c5d1SDavid du Colombier printf("#include \"awk.h\"\n"); 1083e12c5d1SDavid du Colombier printf("#include \"y.tab.h\"\n\n"); 1093e12c5d1SDavid du Colombier for (i = SIZE; --i >= 0; ) 1103e12c5d1SDavid du Colombier names[i] = ""; 1113e12c5d1SDavid du Colombier 1123e12c5d1SDavid du Colombier if ((fp = fopen("y.tab.h", "r")) == NULL) { 1133e12c5d1SDavid du Colombier fprintf(stderr, "maketab can't open y.tab.h!\n"); 1143e12c5d1SDavid du Colombier exit(1); 1153e12c5d1SDavid du Colombier } 1163e12c5d1SDavid du Colombier printf("static uchar *printname[%d] = {\n", SIZE); 1173e12c5d1SDavid du Colombier i = 0; 1183e12c5d1SDavid du Colombier while (fgets(buf, sizeof buf, fp) != NULL) { 1193e12c5d1SDavid du Colombier n = sscanf(buf, "%1c %s %s %d", &c, def, name, &tok); 1203e12c5d1SDavid du Colombier if (c != '#' || n != 4 && strcmp(def,"define") != 0) /* not a valid #define */ 1213e12c5d1SDavid du Colombier continue; 1223e12c5d1SDavid du Colombier if (tok < FIRSTTOKEN || tok > LASTTOKEN) { 1233e12c5d1SDavid du Colombier fprintf(stderr, "maketab funny token %d %s\n", tok, buf); 1243e12c5d1SDavid du Colombier exit(1); 1253e12c5d1SDavid du Colombier } 126*219b2ee8SDavid du Colombier names[tok-FIRSTTOKEN] = (char *) malloc(strlen(name)+1); 1273e12c5d1SDavid du Colombier strcpy(names[tok-FIRSTTOKEN], name); 1283e12c5d1SDavid du Colombier printf("\t(uchar *) \"%s\",\t/* %d */\n", name, tok); 1293e12c5d1SDavid du Colombier i++; 1303e12c5d1SDavid du Colombier } 1313e12c5d1SDavid du Colombier printf("};\n\n"); 1323e12c5d1SDavid du Colombier 1333e12c5d1SDavid du Colombier for (p=proc; p->token!=0; p++) 1343e12c5d1SDavid du Colombier table[p->token-FIRSTTOKEN] = p->name; 1353e12c5d1SDavid du Colombier printf("\nCell *(*proctab[%d])(Node **, int) = {\n", SIZE); 1363e12c5d1SDavid du Colombier for (i=0; i<SIZE; i++) 1373e12c5d1SDavid du Colombier if (table[i]==0) 1383e12c5d1SDavid du Colombier printf("\tnullproc,\t/* %s */\n", names[i]); 1393e12c5d1SDavid du Colombier else 1403e12c5d1SDavid du Colombier printf("\t%s,\t/* %s */\n", table[i], names[i]); 1413e12c5d1SDavid du Colombier printf("};\n\n"); 1423e12c5d1SDavid du Colombier 1433e12c5d1SDavid du Colombier printf("uchar *tokname(int n)\n"); /* print a tokname() function */ 1443e12c5d1SDavid du Colombier printf("{\n"); 1453e12c5d1SDavid du Colombier printf(" static uchar buf[100];\n\n"); 1463e12c5d1SDavid du Colombier printf(" if (n < FIRSTTOKEN || n > LASTTOKEN) {\n"); 1473e12c5d1SDavid du Colombier printf(" sprintf(buf, \"token %%d\", n);\n"); 1483e12c5d1SDavid du Colombier printf(" return buf;\n"); 1493e12c5d1SDavid du Colombier printf(" }\n"); 1503e12c5d1SDavid du Colombier printf(" return printname[n-FIRSTTOKEN];\n"); 1513e12c5d1SDavid du Colombier printf("}\n"); 1523e12c5d1SDavid du Colombier return 0; 1533e12c5d1SDavid du Colombier } 154