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
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
|
/* $Header: arg.h,v 2.0 88/06/05 00:08:14 root Exp $
*
* $Log: arg.h,v $
* Revision 2.0 88/06/05 00:08:14 root
* Baseline version 2.0.
*
*/
#define O_NULL 0
#define O_ITEM 1
#define O_ITEM2 2
#define O_ITEM3 3
#define O_CONCAT 4
#define O_MATCH 5
#define O_NMATCH 6
#define O_SUBST 7
#define O_NSUBST 8
#define O_ASSIGN 9
#define O_MULTIPLY 10
#define O_DIVIDE 11
#define O_MODULO 12
#define O_ADD 13
#define O_SUBTRACT 14
#define O_LEFT_SHIFT 15
#define O_RIGHT_SHIFT 16
#define O_LT 17
#define O_GT 18
#define O_LE 19
#define O_GE 20
#define O_EQ 21
#define O_NE 22
#define O_BIT_AND 23
#define O_XOR 24
#define O_BIT_OR 25
#define O_AND 26
#define O_OR 27
#define O_COND_EXPR 28
#define O_COMMA 29
#define O_NEGATE 30
#define O_NOT 31
#define O_COMPLEMENT 32
#define O_WRITE 33
#define O_OPEN 34
#define O_TRANS 35
#define O_NTRANS 36
#define O_CLOSE 37
#define O_ARRAY 38
#define O_HASH 39
#define O_LARRAY 40
#define O_LHASH 41
#define O_PUSH 42
#define O_POP 43
#define O_SHIFT 44
#define O_SPLIT 45
#define O_LENGTH 46
#define O_SPRINTF 47
#define O_SUBSTR 48
#define O_JOIN 49
#define O_SLT 50
#define O_SGT 51
#define O_SLE 52
#define O_SGE 53
#define O_SEQ 54
#define O_SNE 55
#define O_SUBR 56
#define O_PRINT 57
#define O_CHDIR 58
#define O_DIE 59
#define O_EXIT 60
#define O_RESET 61
#define O_LIST 62
#define O_SELECT 63
#define O_EOF 64
#define O_TELL 65
#define O_SEEK 66
#define O_LAST 67
#define O_NEXT 68
#define O_REDO 69
#define O_GOTO 70
#define O_INDEX 71
#define O_TIME 72
#define O_TMS 73
#define O_LOCALTIME 74
#define O_GMTIME 75
#define O_STAT 76
#define O_CRYPT 77
#define O_EXP 78
#define O_LOG 79
#define O_SQRT 80
#define O_INT 81
#define O_PRTF 82
#define O_ORD 83
#define O_SLEEP 84
#define O_FLIP 85
#define O_FLOP 86
#define O_KEYS 87
#define O_VALUES 88
#define O_EACH 89
#define O_CHOP 90
#define O_FORK 91
#define O_EXEC 92
#define O_SYSTEM 93
#define O_OCT 94
#define O_HEX 95
#define O_CHMOD 96
#define O_CHOWN 97
#define O_KILL 98
#define O_RENAME 99
#define O_UNLINK 100
#define O_UMASK 101
#define O_UNSHIFT 102
#define O_LINK 103
#define O_REPEAT 104
#define O_EVAL 105
#define O_FTEREAD 106
#define O_FTEWRITE 107
#define O_FTEEXEC 108
#define O_FTEOWNED 109
#define O_FTRREAD 110
#define O_FTRWRITE 111
#define O_FTREXEC 112
#define O_FTROWNED 113
#define O_FTIS 114
#define O_FTZERO 115
#define O_FTSIZE 116
#define O_FTFILE 117
#define O_FTDIR 118
#define O_FTLINK 119
#define O_SYMLINK 120
#define O_FTPIPE 121
#define O_FTSOCK 122
#define O_FTBLK 123
#define O_FTCHR 124
#define O_FTSUID 125
#define O_FTSGID 126
#define O_FTSVTX 127
#define O_FTTTY 128
#define O_DOFILE 129
#define O_FTTEXT 130
#define O_FTBINARY 131
#define O_UTIME 132
#define O_WAIT 133
#define O_SORT 134
#define O_DELETE 135
#define O_STUDY 136
#define MAXO 137
#ifndef DOINIT
extern char *opname[];
#else
char *opname[] = {
"NULL",
"ITEM",
"ITEM2",
"ITEM3",
"CONCAT",
"MATCH",
"NMATCH",
"SUBST",
"NSUBST",
"ASSIGN",
"MULTIPLY",
"DIVIDE",
"MODULO",
"ADD",
"SUBTRACT",
"LEFT_SHIFT",
"RIGHT_SHIFT",
"LT",
"GT",
"LE",
"GE",
"EQ",
"NE",
"BIT_AND",
"XOR",
"BIT_OR",
"AND",
"OR",
"COND_EXPR",
"COMMA",
"NEGATE",
"NOT",
"COMPLEMENT",
"WRITE",
"OPEN",
"TRANS",
"NTRANS",
"CLOSE",
"ARRAY",
"HASH",
"LARRAY",
"LHASH",
"PUSH",
"POP",
"SHIFT",
"SPLIT",
"LENGTH",
"SPRINTF",
"SUBSTR",
"JOIN",
"SLT",
"SGT",
"SLE",
"SGE",
"SEQ",
"SNE",
"SUBR",
"PRINT",
"CHDIR",
"DIE",
"EXIT",
"RESET",
"LIST",
"SELECT",
"EOF",
"TELL",
"SEEK",
"LAST",
"NEXT",
"REDO",
"GOTO",/* shudder */
"INDEX",
"TIME",
"TIMES",
"LOCALTIME",
"GMTIME",
"STAT",
"CRYPT",
"EXP",
"LOG",
"SQRT",
"INT",
"PRINTF",
"ORD",
"SLEEP",
"FLIP",
"FLOP",
"KEYS",
"VALUES",
"EACH",
"CHOP",
"FORK",
"EXEC",
"SYSTEM",
"OCT",
"HEX",
"CHMOD",
"CHOWN",
"KILL",
"RENAME",
"UNLINK",
"UMASK",
"UNSHIFT",
"LINK",
"REPEAT",
"EVAL",
"FTEREAD",
"FTEWRITE",
"FTEEXEC",
"FTEOWNED",
"FTRREAD",
"FTRWRITE",
"FTREXEC",
"FTROWNED",
"FTIS",
"FTZERO",
"FTSIZE",
"FTFILE",
"FTDIR",
"FTLINK",
"SYMLINK",
"FTPIPE",
"FTSOCK",
"FTBLK",
"FTCHR",
"FTSUID",
"FTSGID",
"FTSVTX",
"FTTTY",
"DOFILE",
"FTTEXT",
"FTBINARY",
"UTIME",
"WAIT",
"SORT",
"DELETE",
"STUDY",
"135"
};
#endif
#define A_NULL 0
#define A_EXPR 1
#define A_CMD 2
#define A_STAB 3
#define A_LVAL 4
#define A_SINGLE 5
#define A_DOUBLE 6
#define A_BACKTICK 7
#define A_READ 8
#define A_SPAT 9
#define A_LEXPR 10
#define A_ARYLEN 11
#define A_NUMBER 12
#define A_LARYLEN 13
#define A_GLOB 14
#define A_WORD 15
#define A_INDREAD 16
#ifndef DOINIT
extern char *argname[];
#else
char *argname[] = {
"A_NULL",
"EXPR",
"CMD",
"STAB",
"LVAL",
"SINGLE",
"DOUBLE",
"BACKTICK",
"READ",
"SPAT",
"LEXPR",
"ARYLEN",
"NUMBER",
"LARYLEN",
"GLOB",
"WORD",
"INDREAD",
"17"
};
#endif
#ifndef DOINIT
extern bool hoistable[];
#else
bool hoistable[] = {0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0};
#endif
union argptr {
ARG *arg_arg;
char *arg_cval;
STAB *arg_stab;
SPAT *arg_spat;
CMD *arg_cmd;
STR *arg_str;
double arg_nval;
};
struct arg {
union argptr arg_ptr;
short arg_len;
unsigned char arg_type;
unsigned char arg_flags;
};
#define AF_SPECIAL 1 /* op wants to evaluate this arg itself */
#define AF_POST 2 /* post *crement this item */
#define AF_PRE 4 /* pre *crement this item */
#define AF_UP 8 /* increment rather than decrement */
#define AF_COMMON 16 /* left and right have symbols in common */
#define AF_NUMERIC 32 /* return as numeric rather than string */
#define AF_LISTISH 64 /* turn into list if important */
#define AF_LOCAL 128 /* list of local variables */
/*
* Most of the ARG pointers are used as pointers to arrays of ARG. When
* so used, the 0th element is special, and represents the operator to
* use on the list of arguments following. The arg_len in the 0th element
* gives the maximum argument number, and the arg_str is used to store
* the return value in a more-or-less static location. Sorry it's not
* re-entrant, but it sure makes it efficient. The arg_type of the
* 0th element is an operator (O_*) rather than an argument type (A_*).
*/
#define Nullarg Null(ARG*)
EXT char opargs[MAXO];
int do_trans();
int do_split();
bool do_eof();
long do_tell();
bool do_seek();
int do_tms();
int do_time();
int do_stat();
STR *do_push();
FILE *nextargv();
STR *do_fttext();
|