1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T     */
  27 /*        All Rights Reserved   */
  28 
  29 #include <stdio.h>
  30 #include <string.h>
  31 #include <stdlib.h>
  32 #include <libintl.h>
  33 #include "awk.h"
  34 #include "y.tab.h"
  35 
  36 struct xx {
  37         int token;
  38         char *name;
  39         char *pname;
  40 } proc[] = {
  41         { PROGRAM, "program", NULL },
  42         { BOR, "boolop", " || " },
  43         { AND, "boolop", " && " },
  44         { NOT, "boolop", " !" },
  45         { NE, "relop", " != " },
  46         { EQ, "relop", " == " },
  47         { LE, "relop", " <= " },
  48         { LT, "relop", " < " },
  49         { GE, "relop", " >= " },
  50         { GT, "relop", " > " },
  51         { ARRAY, "array", NULL },
  52         { INDIRECT, "indirect", "$(" },
  53         { SUBSTR, "substr", "substr" },
  54         { SUB, "sub", "sub" },
  55         { GSUB, "gsub", "gsub" },
  56         { INDEX, "sindex", "sindex" },
  57         { SPRINTF, "a_sprintf", "sprintf " },
  58         { ADD, "arith", " + " },
  59         { MINUS, "arith", " - " },
  60         { MULT, "arith", " * " },
  61         { DIVIDE, "arith", " / " },
  62         { MOD, "arith", " % " },
  63         { UMINUS, "arith", " -" },
  64         { POWER, "arith", " **" },
  65         { PREINCR, "incrdecr", "++" },
  66         { POSTINCR, "incrdecr", "++" },
  67         { PREDECR, "incrdecr", "--" },
  68         { POSTDECR, "incrdecr", "--" },
  69         { CAT, "cat", " " },
  70         { PASTAT, "pastat", NULL },
  71         { PASTAT2, "dopa2", NULL },
  72         { MATCH, "matchop", " ~ " },
  73         { NOTMATCH, "matchop", " !~ " },
  74         { MATCHFCN, "matchop", "matchop" },
  75         { INTEST, "intest", "intest" },
  76         { PRINTF, "aprintf", "printf" },
  77         { PRINT, "print", "print" },
  78         { CLOSE, "closefile", "closefile" },
  79         { DELETE, "delete", "delete" },
  80         { SPLIT, "split", "split" },
  81         { ASSIGN, "assign", " = " },
  82         { ADDEQ, "assign", " += " },
  83         { SUBEQ, "assign", " -= " },
  84         { MULTEQ, "assign", " *= " },
  85         { DIVEQ, "assign", " /= " },
  86         { MODEQ, "assign", " %= " },
  87         { POWEQ, "assign", " ^= " },
  88         { CONDEXPR, "condexpr", " ?: " },
  89         { IF, "ifstat", "if(" },
  90         { WHILE, "whilestat", "while(" },
  91         { FOR, "forstat", "for(" },
  92         { DO, "dostat", "do" },
  93         { IN, "instat", "instat" },
  94         { NEXT, "jump", "next" },
  95         { EXIT, "jump", "exit" },
  96         { BREAK, "jump", "break" },
  97         { CONTINUE, "jump", "continue" },
  98         { RETURN, "jump", "ret" },
  99         { BLTIN, "bltin", "bltin" },
 100         { CALL, "call", "call" },
 101         { ARG, "arg", "arg" },
 102         { VARNF, "getnf", "NF" },
 103         { GETLINE, "getaline", "getline" },
 104         { 0, "", "" },
 105 };
 106 
 107 #define SIZE    LASTTOKEN - FIRSTTOKEN + 1
 108 char *table[SIZE];
 109 char *names[SIZE];
 110 
 111 int
 112 main()
 113 {
 114         struct xx *p;
 115         int i, n, tok;
 116         char c;
 117         FILE *fp;
 118         char buf[100], name[100], def[100];
 119 
 120         printf("#include \"awk.h\"\n");
 121         printf("#include \"y.tab.h\"\n\n");
 122 
 123         if ((fp = fopen("y.tab.h", "r")) == NULL) {
 124                 fprintf(stderr, gettext("maketab can't open y.tab.h!\n"));
 125                 exit(1);
 126         }
 127         printf("static uchar *printname[%d] = {\n", SIZE);
 128         i = 0;
 129         while (fgets(buf, sizeof (buf), fp) != NULL) {
 130                 n = sscanf(buf, "%1c %s %s %d", &c, def, name, &tok);
 131                 /* not a valid #define? */
 132                 if (c != '#' || n != 4 && strcmp(def, "define") != 0)
 133                         continue;
 134                 if (tok < FIRSTTOKEN || tok > LASTTOKEN) {
 135                         fprintf(stderr, gettext("maketab funny token %d %s\n"),
 136                             tok, buf);
 137                         exit(1);
 138                 }
 139                 names[tok-FIRSTTOKEN] = malloc(strlen(name)+1);
 140                 strcpy(names[tok-FIRSTTOKEN], name);
 141                 printf("\t(uchar *) \"%s\",\t/* %d */\n", name, tok);
 142                 i++;
 143         }
 144         printf("};\n\n");
 145 
 146         for (p = proc; p->token != 0; p++)
 147                 table[p->token-FIRSTTOKEN] = p->name;
 148         printf("\nCell *(*proctab[%d])() = {\n", SIZE);
 149         for (i = 0; i < SIZE; i++)
 150                 if (table[i] == 0)
 151                         printf("\tnullproc,\t/* %s */\n", names[i]);
 152                 else
 153                         printf("\t%s,\t/* %s */\n", table[i], names[i]);
 154         printf("};\n\n");
 155 
 156         printf("uchar *\ntokname(int n)\n");    /* print a tokname() function */
 157         printf("{\n");
 158         printf("        static char buf[100];\n\n");
 159         printf("        if (n < FIRSTTOKEN || n > LASTTOKEN) {\n");
 160         printf("                (void) sprintf(buf, \"token %%d\", n);\n");
 161         printf("                return ((uchar *)buf);\n");
 162         printf("        }\n");
 163         printf("        return printname[n-257];\n");
 164         printf("}\n");
 165         exit(0);
 166 }