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.
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.
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]
23 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
26 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
27 /* All Rights Reserved */
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", "--" },
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" },
107 #define SIZE LASTTOKEN - FIRSTTOKEN + 1
118 char buf
[100], name
[100], def
[100];
120 printf("#include \"awk.h\"\n");
121 printf("#include \"y.tab.h\"\n\n");
123 if ((fp
= fopen("y.tab.h", "r")) == NULL
) {
124 fprintf(stderr
, gettext("maketab can't open y.tab.h!\n"));
127 printf("static uchar *printname[%d] = {\n", SIZE
);
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)
134 if (tok
< FIRSTTOKEN
|| tok
> LASTTOKEN
) {
135 fprintf(stderr
, gettext("maketab funny token %d %s\n"),
139 names
[tok
-FIRSTTOKEN
] = malloc(strlen(name
)+1);
140 strcpy(names
[tok
-FIRSTTOKEN
], name
);
141 printf("\t(uchar *) \"%s\",\t/* %d */\n", name
, tok
);
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
++)
151 printf("\tnullproc,\t/* %s */\n", names
[i
]);
153 printf("\t%s,\t/* %s */\n", table
[i
], names
[i
]);
156 printf("uchar *\ntokname(int n)\n"); /* print a tokname() function */
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");
163 printf(" return printname[n-257];\n");