17dd7cddfSDavid du Colombier /****************************************************************
27dd7cddfSDavid du Colombier Copyright (C) Lucent Technologies 1997
33e12c5d1SDavid du Colombier All Rights Reserved
43e12c5d1SDavid du Colombier
57dd7cddfSDavid du Colombier Permission to use, copy, modify, and distribute this software and
67dd7cddfSDavid du Colombier its documentation for any purpose and without fee is hereby
77dd7cddfSDavid du Colombier granted, provided that the above copyright notice appear in all
87dd7cddfSDavid du Colombier copies and that both that the copyright notice and this
97dd7cddfSDavid du Colombier permission notice and warranty disclaimer appear in supporting
107dd7cddfSDavid du Colombier documentation, and that the name Lucent Technologies or any of
117dd7cddfSDavid du Colombier its entities not be used in advertising or publicity pertaining
127dd7cddfSDavid du Colombier to distribution of the software without specific, written prior
137dd7cddfSDavid du Colombier permission.
143e12c5d1SDavid du Colombier
157dd7cddfSDavid du Colombier LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
167dd7cddfSDavid du Colombier INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
177dd7cddfSDavid du Colombier IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
187dd7cddfSDavid du Colombier SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
197dd7cddfSDavid du Colombier WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
207dd7cddfSDavid du Colombier IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
217dd7cddfSDavid du Colombier ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
227dd7cddfSDavid du Colombier THIS SOFTWARE.
237dd7cddfSDavid du Colombier ****************************************************************/
243e12c5d1SDavid du Colombier
25219b2ee8SDavid du Colombier /*
26219b2ee8SDavid du Colombier * this program makes the table to link function names
27219b2ee8SDavid du Colombier * and type indices that is used by execute() in run.c.
28219b2ee8SDavid du Colombier * it finds the indices in y.tab.h, produced by yacc.
29219b2ee8SDavid du Colombier */
30219b2ee8SDavid du Colombier
313e12c5d1SDavid du Colombier #include <stdio.h>
323e12c5d1SDavid du Colombier #include <string.h>
333e12c5d1SDavid du Colombier #include <stdlib.h>
343e12c5d1SDavid du Colombier #include "awk.h"
353e12c5d1SDavid du Colombier #include "y.tab.h"
363e12c5d1SDavid du Colombier
373e12c5d1SDavid du Colombier struct xx
383e12c5d1SDavid du Colombier { int token;
39*a2c41696SDavid du Colombier const char *name;
40*a2c41696SDavid du Colombier const char *pname;
413e12c5d1SDavid du Colombier } proc[] = {
423e12c5d1SDavid du Colombier { PROGRAM, "program", NULL },
433e12c5d1SDavid du Colombier { BOR, "boolop", " || " },
443e12c5d1SDavid du Colombier { AND, "boolop", " && " },
453e12c5d1SDavid du Colombier { NOT, "boolop", " !" },
463e12c5d1SDavid du Colombier { NE, "relop", " != " },
473e12c5d1SDavid du Colombier { EQ, "relop", " == " },
483e12c5d1SDavid du Colombier { LE, "relop", " <= " },
493e12c5d1SDavid du Colombier { LT, "relop", " < " },
503e12c5d1SDavid du Colombier { GE, "relop", " >= " },
513e12c5d1SDavid du Colombier { GT, "relop", " > " },
523e12c5d1SDavid du Colombier { ARRAY, "array", NULL },
533e12c5d1SDavid du Colombier { INDIRECT, "indirect", "$(" },
543e12c5d1SDavid du Colombier { SUBSTR, "substr", "substr" },
553e12c5d1SDavid du Colombier { SUB, "sub", "sub" },
563e12c5d1SDavid du Colombier { GSUB, "gsub", "gsub" },
573e12c5d1SDavid du Colombier { INDEX, "sindex", "sindex" },
587dd7cddfSDavid du Colombier { SPRINTF, "awksprintf", "sprintf " },
593e12c5d1SDavid du Colombier { ADD, "arith", " + " },
603e12c5d1SDavid du Colombier { MINUS, "arith", " - " },
613e12c5d1SDavid du Colombier { MULT, "arith", " * " },
623e12c5d1SDavid du Colombier { DIVIDE, "arith", " / " },
633e12c5d1SDavid du Colombier { MOD, "arith", " % " },
643e12c5d1SDavid du Colombier { UMINUS, "arith", " -" },
653e12c5d1SDavid du Colombier { POWER, "arith", " **" },
663e12c5d1SDavid du Colombier { PREINCR, "incrdecr", "++" },
673e12c5d1SDavid du Colombier { POSTINCR, "incrdecr", "++" },
683e12c5d1SDavid du Colombier { PREDECR, "incrdecr", "--" },
693e12c5d1SDavid du Colombier { POSTDECR, "incrdecr", "--" },
703e12c5d1SDavid du Colombier { CAT, "cat", " " },
713e12c5d1SDavid du Colombier { PASTAT, "pastat", NULL },
723e12c5d1SDavid du Colombier { PASTAT2, "dopa2", NULL },
733e12c5d1SDavid du Colombier { MATCH, "matchop", " ~ " },
743e12c5d1SDavid du Colombier { NOTMATCH, "matchop", " !~ " },
753e12c5d1SDavid du Colombier { MATCHFCN, "matchop", "matchop" },
763e12c5d1SDavid du Colombier { INTEST, "intest", "intest" },
777dd7cddfSDavid du Colombier { PRINTF, "awkprintf", "printf" },
783e12c5d1SDavid du Colombier { PRINT, "printstat", "print" },
793e12c5d1SDavid du Colombier { CLOSE, "closefile", "closefile" },
807dd7cddfSDavid du Colombier { DELETE, "awkdelete", "awkdelete" },
813e12c5d1SDavid du Colombier { SPLIT, "split", "split" },
823e12c5d1SDavid du Colombier { ASSIGN, "assign", " = " },
833e12c5d1SDavid du Colombier { ADDEQ, "assign", " += " },
843e12c5d1SDavid du Colombier { SUBEQ, "assign", " -= " },
853e12c5d1SDavid du Colombier { MULTEQ, "assign", " *= " },
863e12c5d1SDavid du Colombier { DIVEQ, "assign", " /= " },
873e12c5d1SDavid du Colombier { MODEQ, "assign", " %= " },
883e12c5d1SDavid du Colombier { POWEQ, "assign", " ^= " },
893e12c5d1SDavid du Colombier { CONDEXPR, "condexpr", " ?: " },
903e12c5d1SDavid du Colombier { IF, "ifstat", "if(" },
913e12c5d1SDavid du Colombier { WHILE, "whilestat", "while(" },
923e12c5d1SDavid du Colombier { FOR, "forstat", "for(" },
933e12c5d1SDavid du Colombier { DO, "dostat", "do" },
943e12c5d1SDavid du Colombier { IN, "instat", "instat" },
953e12c5d1SDavid du Colombier { NEXT, "jump", "next" },
967dd7cddfSDavid du Colombier { NEXTFILE, "jump", "nextfile" },
973e12c5d1SDavid du Colombier { EXIT, "jump", "exit" },
983e12c5d1SDavid du Colombier { BREAK, "jump", "break" },
993e12c5d1SDavid du Colombier { CONTINUE, "jump", "continue" },
1003e12c5d1SDavid du Colombier { RETURN, "jump", "ret" },
1013e12c5d1SDavid du Colombier { BLTIN, "bltin", "bltin" },
1023e12c5d1SDavid du Colombier { CALL, "call", "call" },
1033e12c5d1SDavid du Colombier { ARG, "arg", "arg" },
1043e12c5d1SDavid du Colombier { VARNF, "getnf", "NF" },
105*a2c41696SDavid du Colombier { GETLINE, "awkgetline", "getline" },
1063e12c5d1SDavid du Colombier { 0, "", "" },
1073e12c5d1SDavid du Colombier };
1083e12c5d1SDavid du Colombier
109219b2ee8SDavid du Colombier #define SIZE (LASTTOKEN - FIRSTTOKEN + 1)
110*a2c41696SDavid du Colombier const char *table[SIZE];
1113e12c5d1SDavid du Colombier char *names[SIZE];
1123e12c5d1SDavid du Colombier
main(int argc,char * argv[])1137dd7cddfSDavid du Colombier int main(int argc, char *argv[])
1143e12c5d1SDavid du Colombier {
115*a2c41696SDavid du Colombier const struct xx *p;
1163e12c5d1SDavid du Colombier int i, n, tok;
1173e12c5d1SDavid du Colombier char c;
1183e12c5d1SDavid du Colombier FILE *fp;
119219b2ee8SDavid du Colombier char buf[200], name[200], def[200];
1203e12c5d1SDavid du Colombier
1213e12c5d1SDavid du Colombier printf("#include <stdio.h>\n");
1223e12c5d1SDavid du Colombier printf("#include \"awk.h\"\n");
1233e12c5d1SDavid du Colombier printf("#include \"y.tab.h\"\n\n");
1243e12c5d1SDavid du Colombier for (i = SIZE; --i >= 0; )
1253e12c5d1SDavid du Colombier names[i] = "";
1263e12c5d1SDavid du Colombier
1273e12c5d1SDavid du Colombier if ((fp = fopen("y.tab.h", "r")) == NULL) {
1283e12c5d1SDavid du Colombier fprintf(stderr, "maketab can't open y.tab.h!\n");
1293e12c5d1SDavid du Colombier exit(1);
1303e12c5d1SDavid du Colombier }
1317dd7cddfSDavid du Colombier printf("static char *printname[%d] = {\n", SIZE);
1323e12c5d1SDavid du Colombier i = 0;
1333e12c5d1SDavid du Colombier while (fgets(buf, sizeof buf, fp) != NULL) {
1343e12c5d1SDavid du Colombier n = sscanf(buf, "%1c %s %s %d", &c, def, name, &tok);
1357dd7cddfSDavid du Colombier if (c != '#' || (n != 4 && strcmp(def,"define") != 0)) /* not a valid #define */
1363e12c5d1SDavid du Colombier continue;
1373e12c5d1SDavid du Colombier if (tok < FIRSTTOKEN || tok > LASTTOKEN) {
138*a2c41696SDavid du Colombier /* fprintf(stderr, "maketab funny token %d %s ignored\n", tok, buf); */
139*a2c41696SDavid du Colombier continue;
1403e12c5d1SDavid du Colombier }
141219b2ee8SDavid du Colombier names[tok-FIRSTTOKEN] = (char *) malloc(strlen(name)+1);
1423e12c5d1SDavid du Colombier strcpy(names[tok-FIRSTTOKEN], name);
1437dd7cddfSDavid du Colombier printf("\t(char *) \"%s\",\t/* %d */\n", name, tok);
1443e12c5d1SDavid du Colombier i++;
1453e12c5d1SDavid du Colombier }
1463e12c5d1SDavid du Colombier printf("};\n\n");
1473e12c5d1SDavid du Colombier
1483e12c5d1SDavid du Colombier for (p=proc; p->token!=0; p++)
1493e12c5d1SDavid du Colombier table[p->token-FIRSTTOKEN] = p->name;
1503e12c5d1SDavid du Colombier printf("\nCell *(*proctab[%d])(Node **, int) = {\n", SIZE);
1513e12c5d1SDavid du Colombier for (i=0; i<SIZE; i++)
1523e12c5d1SDavid du Colombier if (table[i]==0)
1533e12c5d1SDavid du Colombier printf("\tnullproc,\t/* %s */\n", names[i]);
1543e12c5d1SDavid du Colombier else
1553e12c5d1SDavid du Colombier printf("\t%s,\t/* %s */\n", table[i], names[i]);
1563e12c5d1SDavid du Colombier printf("};\n\n");
1573e12c5d1SDavid du Colombier
1587dd7cddfSDavid du Colombier printf("char *tokname(int n)\n"); /* print a tokname() function */
1593e12c5d1SDavid du Colombier printf("{\n");
1607dd7cddfSDavid du Colombier printf(" static char buf[100];\n\n");
1613e12c5d1SDavid du Colombier printf(" if (n < FIRSTTOKEN || n > LASTTOKEN) {\n");
1623e12c5d1SDavid du Colombier printf(" sprintf(buf, \"token %%d\", n);\n");
1633e12c5d1SDavid du Colombier printf(" return buf;\n");
1643e12c5d1SDavid du Colombier printf(" }\n");
1653e12c5d1SDavid du Colombier printf(" return printname[n-FIRSTTOKEN];\n");
1663e12c5d1SDavid du Colombier printf("}\n");
1673e12c5d1SDavid du Colombier return 0;
1683e12c5d1SDavid du Colombier }
169