1/* ***************************************************************
2 * copyright (c) lucent technologies 1997
3 * all rights reserved
4 *
5 * permission to use, copy, modify, and distribute this software and
6 * its documentation for any purpose and without fee is hereby
7 * granted, provided that the above copyright notice appear in all
8 * copies and that both that the copyright notice and this
9 * permission notice and warranty disclaimer appear in supporting
10 * documentation, and that the name lucent technologies or any of
11 * its entities not be used in advertising or publicity pertaining
12 * to distribution of the software without specific, written prior
13 * permission
14 *
15 * LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
17 * IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
18 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
20 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
22 * THIS SOFTWARE
23 * ************************************************************** */
24
25/*
26 * this program makes the table to link function names
27 * and type indices that is used by execute() in run.c
28 * it finds the indices in awkgram.tab.h, produced by bison
29 */
30
31#define _POSIX_C_SOURCE 200809L
32#include "awk.h"
33#include "awkgram.tab.h"
34#include <stdio.h>
35#include <stdlib.h>
36#include <string.h>
37
38struct xx {
39 int token;
40 const char *name;
41 const char *pname;
42} proc[] = {
43 {PROGRAM, "program", NULL},
44 {BOR, "boolop", " || "},
45 {AND, "boolop", " && "},
46 {NOT, "boolop", " !"},
47 {NE, "relop", " != "},
48 {EQ, "relop", " == "},
49 {LE, "relop", " <= "},
50 {LT, "relop", " < "},
51 {GE, "relop", " >= "},
52 {GT, "relop", " > "},
53 {ARRAY, "array", NULL},
54 {INDIRECT, "indirect", "$("},
55 {SUBSTR, "substr", "substr"},
56 {SUB, "dosub", "sub"},
57 {GSUB, "dosub", "gsub"},
58 {INDEX, "sindex", "sindex"},
59 {SPRINTF, "awksprintf", "sprintf "},
60 {ADD, "arith", " + "},
61 {MINUS, "arith", " - "},
62 {MULT, "arith", " * "},
63 {DIVIDE, "arith", " / "},
64 {MOD, "arith", " % "},
65 {UMINUS, "arith", " -"},
66 {UPLUS, "arith", " +"},
67 {POWER, "arith", " **"},
68 {PREINCR, "incrdecr", "++"},
69 {POSTINCR, "incrdecr", "++"},
70 {PREDECR, "incrdecr", "--"},
71 {POSTDECR, "incrdecr", "--"},
72 {CAT, "cat", " "},
73 {PASTAT, "pastat", NULL},
74 {PASTAT2, "dopa2", NULL},
75 {MATCH, "matchop", " ~ "},
76 {NOTMATCH, "matchop", " !~ "},
77 {MATCHFCN, "matchop", "matchop"},
78 {INTEST, "intest", "intest"},
79 {PRINTF, "awkprintf", "printf"},
80 {PRINT, "printstat", "print"},
81 {CLOSE, "closefile", "closefile"},
82 {DELETE, "awkdelete", "awkdelete"},
83 {SPLIT, "split", "split"},
84 {ASSIGN, "assign", " = "},
85 {ADDEQ, "assign", " += "},
86 {SUBEQ, "assign", " -= "},
87 {MULTEQ, "assign", " *= "},
88 {DIVEQ, "assign", " /= "},
89 {MODEQ, "assign", " %= "},
90 {POWEQ, "assign", " ^= "},
91 {CONDEXPR, "condexpr", " ?: "},
92 {IF, "ifstat", "if("},
93 {WHILE, "whilestat", "while("},
94 {FOR, "forstat", "for("},
95 {DO, "dostat", "do"},
96 {IN, "instat", "instat"},
97 {NEXT, "jump", "next"},
98 {NEXTFILE, "jump", "nextfile"},
99 {EXIT, "jump", "exit"},
100 {BREAK, "jump", "break"},
101 {CONTINUE, "jump", "continue"},
102 {RETURN, "jump", "ret"},
103 {BLTIN, "bltin", "bltin"},
104 {CALL, "call", "call"},
105 {ARG, "arg", "arg"},
106 {VARNF, "getnf", "NF"},
107 {GETLINE, "awkgetline", "getline"},
108 {0, "", ""},
109};
110
111#define SIZE (LASTTOKEN - FIRSTTOKEN + 1)
112const char *table[SIZE];
113char *names[SIZE];
114
115int
116main(int argc, char *argv[])
117{
118 const struct xx *p;
119 int i, n, tok;
120 char c;
121 FILE *fp;
122 char buf[200], name[200], def[200];
123 enum { TOK_UNKNOWN, TOK_ENUM, TOK_DEFINE } tokentype = TOK_UNKNOWN;
124
125 printf("#include <stdio.h>\n");
126 printf("#include \"awk.h\"\n");
127 printf("#include \"awkgram.tab.h\"\n\n");
128
129 if (argc != 2) {
130 fprintf(stderr, "usage: maketab YTAB_H\n");
131 exit(1);
132 }
133 if ((fp = fopen(argv[1], "r")) == NULL) {
134 fprintf(stderr, "maketab can't open %s!\n", argv[1]);
135 exit(1);
136 }
137 printf("static const char * const printname[%d] = {\n", SIZE);
138 i = 0;
139 while (fgets(buf, sizeof buf, fp) != NULL) {
140 /* 199 is sizeof(def) - 1 */
141 if (tokentype != TOK_ENUM) {
142 n = sscanf(buf, "%1c %199s %199s %d", &c, def, name, &tok);
143 if (n == 4 && c == '#' && strcmp(def, "define") == 0) {
144 tokentype = TOK_DEFINE;
145 } else if (tokentype != TOK_UNKNOWN) {
146 continue;
147 }
148 }
149 if (tokentype != TOK_DEFINE) {
150 /* not a valid #define, bison uses enums now */
151 n = sscanf(buf, "%199s = %d,\n", name, &tok);
152 if (n != 2)
153 continue;
154 tokentype = TOK_ENUM;
155 }
156 if (strcmp(name, "YYSTYPE_IS_DECLARED") == 0) {
157 tokentype = TOK_UNKNOWN;
158 continue;
159 }
160 if (tok < FIRSTTOKEN || tok > LASTTOKEN) {
161 tokentype = TOK_UNKNOWN;
162 /* fprintf(stderr, "maketab funny token %d %s
163 * ignored\n", tok, buf); */
164 continue;
165 }
166 names[tok - FIRSTTOKEN] = strdup(name);
167 if (names[tok - FIRSTTOKEN] == NULL) {
168 fprintf(stderr, "maketab out of space copying %s", name);
169 continue;
170 }
171 printf("\t\"%s\",\t/* %d */\n", name, tok);
172 i++;
173 }
174 printf("};\n\n");
175
176 for (p = proc; p->token != 0; p++)
177 table[p->token - FIRSTTOKEN] = p->name;
178 printf("\nCell *(*proctab[%d])(Node **, int) = {\n", SIZE);
179 for (i = 0; i < SIZE; i++)
180 printf("\t%s,\t/* %s */\n", table[i] ? table[i] : "nullproc", names[i] ? names[i] : "");
181 printf("};\n\n");
182
183 printf("const char *tokname(int n)\n"); /* print a tokname() function */
184 printf("{\n");
185 printf("\tstatic char buf[100];\n\n");
186 printf("\tif (n < FIRSTTOKEN || n > LASTTOKEN) {\n");
187 printf("\t\tsnprintf(buf, sizeof(buf), \"token %%d\", n);\n");
188 printf("\t\treturn buf;\n");
189 printf("\t}\n");
190 printf("\treturn printname[n-FIRSTTOKEN];\n");
191 printf("}\n");
192 return 0;
193}