summaryrefslogtreecommitdiff
path: root/usr/src/cmd/awk_xpg4/awk0.c
blob: ba5a4583bd238a77bfe69c34667257eebef82c5e (plain)
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 */