| maketab.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
| git clone git://git.suckless.org/9base | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| maketab.c (5102B) | |
| --- | |
| 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 y.tab.h, produced by yacc. | |
| 29 */ | |
| 30 | |
| 31 #include <stdio.h> | |
| 32 #include <string.h> | |
| 33 #include <stdlib.h> | |
| 34 #include "awk.h" | |
| 35 #include "y.tab.h" | |
| 36 | |
| 37 struct xx | |
| 38 { int token; | |
| 39 char *name; | |
| 40 char *pname; | |
| 41 } proc[] = { | |
| 42 { PROGRAM, "program", NULL }, | |
| 43 { BOR, "boolop", " || " }, | |
| 44 { AND, "boolop", " && " }, | |
| 45 { NOT, "boolop", " !" }, | |
| 46 { NE, "relop", " != " }, | |
| 47 { EQ, "relop", " == " }, | |
| 48 { LE, "relop", " <= " }, | |
| 49 { LT, "relop", " < " }, | |
| 50 { GE, "relop", " >= " }, | |
| 51 { GT, "relop", " > " }, | |
| 52 { ARRAY, "array", NULL }, | |
| 53 { INDIRECT, "indirect", "$(" }, | |
| 54 { SUBSTR, "substr", "substr" }, | |
| 55 { SUB, "sub", "sub" }, | |
| 56 { GSUB, "gsub", "gsub" }, | |
| 57 { INDEX, "sindex", "sindex" }, | |
| 58 { SPRINTF, "awksprintf", "sprintf " }, | |
| 59 { ADD, "arith", " + " }, | |
| 60 { MINUS, "arith", " - " }, | |
| 61 { MULT, "arith", " * " }, | |
| 62 { DIVIDE, "arith", " / " }, | |
| 63 { MOD, "arith", " % " }, | |
| 64 { UMINUS, "arith", " -" }, | |
| 65 { POWER, "arith", " **" }, | |
| 66 { PREINCR, "incrdecr", "++" }, | |
| 67 { POSTINCR, "incrdecr", "++" }, | |
| 68 { PREDECR, "incrdecr", "--" }, | |
| 69 { POSTDECR, "incrdecr", "--" }, | |
| 70 { CAT, "cat", " " }, | |
| 71 { PASTAT, "pastat", NULL }, | |
| 72 { PASTAT2, "dopa2", NULL }, | |
| 73 { MATCH, "matchop", " ~ " }, | |
| 74 { NOTMATCH, "matchop", " !~ " }, | |
| 75 { MATCHFCN, "matchop", "matchop" }, | |
| 76 { INTEST, "intest", "intest" }, | |
| 77 { PRINTF, "awkprintf", "printf" }, | |
| 78 { PRINT, "printstat", "print" }, | |
| 79 { CLOSE, "closefile", "closefile" }, | |
| 80 { DELETE, "awkdelete", "awkdelete" }, | |
| 81 { SPLIT, "split", "split" }, | |
| 82 { ASSIGN, "assign", " = " }, | |
| 83 { ADDEQ, "assign", " += " }, | |
| 84 { SUBEQ, "assign", " -= " }, | |
| 85 { MULTEQ, "assign", " *= " }, | |
| 86 { DIVEQ, "assign", " /= " }, | |
| 87 { MODEQ, "assign", " %= " }, | |
| 88 { POWEQ, "assign", " ^= " }, | |
| 89 { CONDEXPR, "condexpr", " ?: " }, | |
| 90 { IF, "ifstat", "if(" }, | |
| 91 { WHILE, "whilestat", "while(" }, | |
| 92 { FOR, "forstat", "for(" }, | |
| 93 { DO, "dostat", "do" }, | |
| 94 { IN, "instat", "instat" }, | |
| 95 { NEXT, "jump", "next" }, | |
| 96 { NEXTFILE, "jump", "nextfile" }, | |
| 97 { EXIT, "jump", "exit" }, | |
| 98 { BREAK, "jump", "break" }, | |
| 99 { CONTINUE, "jump", "continue" }, | |
| 100 { RETURN, "jump", "ret" }, | |
| 101 { BLTIN, "bltin", "bltin" }, | |
| 102 { CALL, "call", "call" }, | |
| 103 { ARG, "arg", "arg" }, | |
| 104 { VARNF, "getnf", "NF" }, | |
| 105 { GETLINE, "getline", "getline" }, | |
| 106 { 0, "", "" }, | |
| 107 }; | |
| 108 | |
| 109 #define SIZE (LASTTOKEN - FIRSTTOKEN + 1) | |
| 110 char *table[SIZE]; | |
| 111 char *names[SIZE]; | |
| 112 | |
| 113 int main(int argc, char *argv[]) | |
| 114 { | |
| 115 struct xx *p; | |
| 116 int i, n, tok; | |
| 117 char c; | |
| 118 FILE *fp; | |
| 119 char buf[200], name[200], def[200]; | |
| 120 | |
| 121 printf("#include <stdio.h>\n"); | |
| 122 printf("#include \"awk.h\"\n"); | |
| 123 printf("#include \"y.tab.h\"\n\n"); | |
| 124 for (i = SIZE; --i >= 0; ) | |
| 125 names[i] = ""; | |
| 126 | |
| 127 if ((fp = fopen("y.tab.h", "r")) == NULL) { | |
| 128 fprintf(stderr, "maketab can't open y.tab.h!\n"); | |
| 129 exit(1); | |
| 130 } | |
| 131 printf("static char *printname[%d] = {\n", SIZE); | |
| 132 i = 0; | |
| 133 while (fgets(buf, sizeof buf, fp) != NULL) { | |
| 134 n = sscanf(buf, "%1c %s %s %d", &c, def, name, &tok); | |
| 135 if (c != '#' || (n != 4 && strcmp(def,"define") != 0)) … | |
| 136 continue; | |
| 137 if (tok < FIRSTTOKEN || tok > LASTTOKEN) { | |
| 138 fprintf(stderr, "maketab funny token %d %s\n", t… | |
| 139 exit(1); | |
| 140 } | |
| 141 names[tok-FIRSTTOKEN] = (char *) malloc(strlen(name)+1); | |
| 142 strcpy(names[tok-FIRSTTOKEN], name); | |
| 143 printf("\t(char *) \"%s\",\t/* %d */\n", name, tok); | |
| 144 i++; | |
| 145 } | |
| 146 printf("};\n\n"); | |
| 147 | |
| 148 for (p=proc; p->token!=0; p++) | |
| 149 table[p->token-FIRSTTOKEN] = p->name; | |
| 150 printf("\nCell *(*proctab[%d])(Node **, int) = {\n", SIZE); | |
| 151 for (i=0; i<SIZE; i++) | |
| 152 if (table[i]==0) | |
| 153 printf("\tnullproc,\t/* %s */\n", names[i]); | |
| 154 else | |
| 155 printf("\t%s,\t/* %s */\n", table[i], names[i]); | |
| 156 printf("};\n\n"); | |
| 157 | |
| 158 printf("char *tokname(int n)\n"); /* print a tokname() fu… | |
| 159 printf("{\n"); | |
| 160 printf(" static char buf[100];\n\n"); | |
| 161 printf(" if (n < FIRSTTOKEN || n > LASTTOKEN) {\n"); | |
| 162 printf(" sprintf(buf, \"token %%d\", n);\n"); | |
| 163 printf(" return buf;\n"); | |
| 164 printf(" }\n"); | |
| 165 printf(" return printname[n-FIRSTTOKEN];\n"); | |
| 166 printf("}\n"); | |
| 167 return 0; | |
| 168 } | |
| 169 |