1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Awk -- data definitions
*
* Copyright (c) 1995 by Sun Microsystems, Inc.
*
* Copyright 1986, 1992 by Mortice Kern Systems Inc. All rights reserved.
*
* Based on MKS awk(1) ported to be /usr/xpg4/bin/awk with POSIX/XCU4 changes
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include "awk.h"
#include "y.tab.h"
/*
* This file contains data definitions for awk.
*/
RESERVED reserved[] = {
s_BEGIN, KEYWORD, BEGIN, NULL,
s_END, KEYWORD, END, NULL,
M_MB_L("break"), KEYWORD, BREAK, NULL,
M_MB_L("continue"), KEYWORD, CONTINUE, NULL,
M_MB_L("for"), KEYWORD, FOR, NULL,
M_MB_L("if"), KEYWORD, IF, NULL,
M_MB_L("else"), KEYWORD, ELSE, NULL,
M_MB_L("in"), KEYWORD, IN, NULL,
s_next, KEYWORD, NEXT, NULL,
M_MB_L("while"), KEYWORD, WHILE, NULL,
M_MB_L("do"), KEYWORD, DO, NULL,
M_MB_L("print"), KEYWORD, PRINT, NULL,
M_MB_L("printf"), KEYWORD, PRINTF, NULL,
M_MB_L("return"), KEYWORD, RETURN, NULL,
M_MB_L("func"), KEYWORD, DEFFUNC, NULL,
M_MB_L("function"), KEYWORD, DEFFUNC, NULL,
M_MB_L("delete"), KEYWORD, DELETE, NULL,
M_MB_L("exit"), KEYWORD, EXIT, NULL,
s_FILENAME, VAR, 0, _null,
s_NF, SVAR, 0, NULL,
s_NR, VAR, 0, NULL,
s_FS, SVAR, 1, M_MB_L(" "),
s_OFS, VAR, 1, M_MB_L(" "),
s_ORS, VAR, 1, M_MB_L("\n"),
s_OFMT, VAR, 4, M_MB_L("%.6g"),
s_CONVFMT, VAR, 4, M_MB_L("%.6g"),
s_RS, SVAR, 1, M_MB_L("\n"),
s_FNR, VAR, 0, NULL,
s_SUBSEP, VAR, 1,
#ifdef M_AWK_SUBSEP
M_AWK_SUBSEP,
#else
M_MB_L("\34"),
#endif
s_ARGC, SVAR, 0, NULL,
(LOCCHARP)NULL
};
RESFUNC resfuncs[] = {
s_exp, FUNC, f_exp,
s_getline, GETLINE, f_getline,
s_index, FUNC, f_index,
s_int, FUNC, f_int,
s_length, FUNC, f_length,
s_log, FUNC, f_log,
s_split, FUNC, f_split,
s_sprintf, FUNC, f_sprintf,
s_sqrt, FUNC, f_sqrt,
s_substr, FUNC, f_substr,
s_rand, FUNC, f_rand,
s_srand, FUNC, f_srand,
s_sin, FUNC, f_sin,
s_cos, FUNC, f_cos,
s_atan2, FUNC, f_atan2,
s_sub, FUNC, f_sub,
s_gsub, FUNC, f_gsub,
s_match, FUNC, f_match,
s_system, FUNC, f_system,
s_ord, FUNC, f_ord,
s_toupper, FUNC, f_toupper,
s_tolower, FUNC, f_tolower,
s_asort, FUNC, f_asort,
s_close, FUNC, f_close,
(LOCCHARP)NULL
};
OFILE *ofiles; /* Remembered open files (print) */
long NIOSTREAM = 512; /* max num of open file descriptors */
wchar_t _null[] = M_MB_L(""); /* Empty string */
char r[] = "r"; /* Read file mode */
char w[] = "w"; /* Write file mode */
wchar_t s_OFMT[] = M_MB_L("OFMT"); /* Name of "OFMT" variable */
wchar_t s_CONVFMT[] = M_MB_L("CONVFMT"); /* Name of "CONVFMT" variable */
wchar_t s_NR[] = M_MB_L("NR"); /* Name of "NR" variable */
wchar_t s_NF[] = M_MB_L("NF"); /* Name of "NF" variable */
wchar_t s_OFS[] = M_MB_L("OFS"); /* Name of "OFS" variable */
wchar_t s_ORS[] = M_MB_L("ORS"); /* Name of "ORS" variable */
wchar_t s_RS[] = M_MB_L("RS"); /* Name of "RS" variable */
wchar_t s_FS[] = M_MB_L("FS"); /* Name of "FS" variable */
wchar_t s_FNR[] = M_MB_L("FNR"); /* Name of "FNR" variable */
wchar_t s_SUBSEP[] = M_MB_L("SUBSEP"); /* Name of "SUBSEP" variable */
wchar_t s_ARGC[] = M_MB_L("ARGC"); /* Name of "ARGC" variable */
wchar_t s_ARGV[] = M_MB_L("ARGV"); /* Name of "ARGV" array variable */
wchar_t s_ENVIRON[] = M_MB_L("ENVIRON"); /* Name of "ENVIRON" array variable */
wchar_t s_FILENAME[] = M_MB_L("FILENAME"); /* Name of "FILENAME" variable */
wchar_t s_SYMTAB[] = M_MB_L("SYMTAB"); /* Name of "SYMTAB" variable */
wchar_t s_BEGIN[] = M_MB_L("BEGIN"); /* Name of "BEGIN" action */
wchar_t s_END[] = M_MB_L("END"); /* Name of "END" action */
wchar_t s_next[] = M_MB_L("next"); /* Name of "next" keyword */
wchar_t s_exp[] = M_MB_L("exp"); /* Name of "exp" function */
wchar_t s_getline[] = M_MB_L("getline"); /* Name of "getline" function */
wchar_t s_index[] = M_MB_L("index"); /* Name of "index" function */
wchar_t s_int[] = M_MB_L("int"); /* Name of "int" function */
wchar_t s_length[] = M_MB_L("length"); /* Name of "length" function */
wchar_t s_log[] = M_MB_L("log"); /* Name of "log" function */
wchar_t s_split[] = M_MB_L("split"); /* Name of "split" function */
wchar_t s_sprintf[] = M_MB_L("sprintf"); /* Name of "sprintf" function */
wchar_t s_sqrt[] = M_MB_L("sqrt"); /* Name of "sqrt" function */
wchar_t s_substr[] = M_MB_L("substr"); /* Name of "substr" function */
wchar_t s_rand[] = M_MB_L("rand"); /* Name of "rand" function */
wchar_t s_srand[] = M_MB_L("srand"); /* Name of "srand" function */
wchar_t s_sin[] = M_MB_L("sin"); /* Name of "sin" function */
wchar_t s_cos[] = M_MB_L("cos"); /* Name of "cos" function */
wchar_t s_atan2[] = M_MB_L("atan2"); /* Name of "atan" function */
wchar_t s_sub[] = M_MB_L("sub"); /* Name of "sub" function */
wchar_t s_gsub[] = M_MB_L("gsub"); /* Name of "gsub" function */
wchar_t s_match[] = M_MB_L("match"); /* Name of "match" function */
wchar_t s_system[] = M_MB_L("system"); /* Name of "system" function */
wchar_t s_ord[] = M_MB_L("ord"); /* Name of "ord" function */
wchar_t s_toupper[] = M_MB_L("toupper"); /* Name of "toupper" function */
wchar_t s_tolower[] = M_MB_L("tolower"); /* Name of "tolower" function */
wchar_t s_asort[] = M_MB_L("asort"); /* Name of "asort" function */
wchar_t s_close[] = M_MB_L("close"); /* Name of "close" function */
wchar_t redelim; /* Delimiter for regexp (yylex) */
uchar_t inprint; /* Special meaning for '>' & '|' */
uchar_t funparm; /* Defining function parameters */
uchar_t splitdone; /* Line split into fields (fieldbuf) */
uint npattern; /* Number of non-BEGIN patterns */
uint nfield; /* Number of fields (if splitdone) */
uint fcount; /* Field counter (used by blackfield)*/
uint phase; /* BEGIN, END, or 0 */
uint running = 0; /* Set if not in compile phase */
uchar_t catterm; /* Can inject concat or ';' */
uint lexlast = '\n'; /* Last lexical token */
uint lineno = 0; /* Current programme line number */
uchar_t doing_begin; /* set if compiling BEGIN block */
uchar_t begin_getline; /* flags a getline was done in BEGIN */
uchar_t needsplit; /* Set if $0 must be split when read */
uchar_t needenviron; /* Set if ENVIRON variable referenced */
ushort slevel; /* Scope level (0 == root) */
ushort loopexit; /* Short circuit loop with keyword */
wchar_t radixpoint; /* soft radix point for I18N */
REGEXP resep; /* Field separator as regexp */
wchar_t *linebuf = NULL; /* $0 buffer - malloc'd in awk1.c */
size_t lbuflen; /* Length of linebuf */
/*
* XXX - Make sure to check where this error message is printed
*/
char interr[] = "internal execution tree error at E string";
char nomem[] = "insufficient memory for string storage";
NODE *symtab[NBUCKET]; /* Heads of symbol table buckets */
NODE *yytree; /* Code tree */
NODE *freelist; /* Free every pattern {action} line */
wchar_t *(*awkrecord) ANSI((wchar_t *, int, FILE*)) = defrecord;
/* Function to read a record */
wchar_t *(*awkfield) ANSI((wchar_t **)) = whitefield;
/* Function to extract a field */
/*
* Nodes used to speed up the execution of the
* interpreter.
*/
NODE *constant; /* Node to hold a constant INT */
NODE *const0; /* Constant INT 0 node */
NODE *const1; /* Constant INT 1 node */
NODE *constundef; /* Undefined variable */
NODE *field0; /* $0 */
NODE *incNR; /* Code to increment NR variable */
NODE *incFNR; /* Code to increment FNR variable */
NODE *clrFNR; /* Zero FNR variable (each file) */
NODE *ARGVsubi; /* Compute ARGV[i] */
NODE *varNR; /* Remove search for NR variable */
NODE *varFNR; /* Don't search for FNR variable */
NODE *varNF; /* Pointer to NF variable */
NODE *varOFMT; /* For s_prf */
NODE *varCONVFMT; /* For internal conv of float to str */
NODE *varOFS; /* For s_print */
NODE *varORS; /* For s_print */
NODE *varFS; /* Field separtor */
NODE *varRS; /* Record separator */
NODE *varARGC; /* Quick access to ARGC */
NODE *varSUBSEP; /* Quick access to SUBSEP */
NODE *varENVIRON; /* Pointer to ENVIRON variable */
NODE *varSYMTAB; /* Symbol table special variable */
NODE *varFILENAME; /* Node for FILENAME variable */
NODE *curnode; /* Pointer to current line */
NODE *inc_oper; /* used by INC/DEC in awk3.c */
NODE *asn_oper; /* used by AADD, etc in awk3.c */
|