perl 3.0 patch #30 patch #29, continued
[perl.git] / arg.h
1 /* $Header: arg.h,v 3.0.1.7 90/10/15 14:53:59 lwall Locked $
2  *
3  *    Copyright (c) 1989, Larry Wall
4  *
5  *    You may distribute under the terms of the GNU General Public License
6  *    as specified in the README file that comes with the perl 3.0 kit.
7  *
8  * $Log:        arg.h,v $
9  * Revision 3.0.1.7  90/10/15  14:53:59  lwall
10  * patch29: added SysV IPC
11  * patch29: added waitpid
12  * patch29: added cmp and <=>
13  * patch29: added caller
14  * patch29: added scalar
15  * patch29: added sysread and syswrite
16  * patch29: added -M, -A and -C
17  * patch29: index and substr now have optional 3rd args
18  * patch29: you can now read into the middle string
19  * patch29: various portability fixes
20  * 
21  * Revision 3.0.1.6  90/08/09  02:25:14  lwall
22  * patch19: added require operator
23  * patch19: added truncate operator
24  * 
25  * Revision 3.0.1.5  90/03/27  15:29:41  lwall
26  * patch16: MSDOS support
27  * 
28  * Revision 3.0.1.4  90/03/12  16:18:21  lwall
29  * patch13: added list slice operator (LIST)[LIST]
30  * patch13: added splice operator: @oldelems = splice(@array,$offset,$len,LIST)
31  * 
32  * Revision 3.0.1.3  90/02/28  16:21:55  lwall
33  * patch9: added pipe function
34  * 
35  * Revision 3.0.1.2  89/12/21  19:13:14  lwall
36  * patch7: send() didn't allow a TO argument
37  * 
38  * Revision 3.0.1.1  89/10/26  23:02:35  lwall
39  * patch1: reverse didn't work
40  * 
41  * Revision 3.0  89/10/18  15:08:27  lwall
42  * 3.0 baseline
43  * 
44  */
45
46 #define O_NULL 0
47 #define O_ITEM 1
48 #define O_ITEM2 2
49 #define O_ITEM3 3
50 #define O_CONCAT 4
51 #define O_MATCH 5
52 #define O_NMATCH 6
53 #define O_SUBST 7
54 #define O_NSUBST 8
55 #define O_ASSIGN 9
56 #define O_MULTIPLY 10
57 #define O_DIVIDE 11
58 #define O_MODULO 12
59 #define O_ADD 13
60 #define O_SUBTRACT 14
61 #define O_LEFT_SHIFT 15
62 #define O_RIGHT_SHIFT 16
63 #define O_LT 17
64 #define O_GT 18
65 #define O_LE 19
66 #define O_GE 20
67 #define O_EQ 21
68 #define O_NE 22
69 #define O_BIT_AND 23
70 #define O_XOR 24
71 #define O_BIT_OR 25
72 #define O_AND 26
73 #define O_OR 27
74 #define O_COND_EXPR 28
75 #define O_COMMA 29
76 #define O_NEGATE 30
77 #define O_NOT 31
78 #define O_COMPLEMENT 32
79 #define O_WRITE 33
80 #define O_OPEN 34
81 #define O_TRANS 35
82 #define O_NTRANS 36
83 #define O_CLOSE 37
84 #define O_ARRAY 38
85 #define O_HASH 39
86 #define O_LARRAY 40
87 #define O_LHASH 41
88 #define O_PUSH 42
89 #define O_POP 43
90 #define O_SHIFT 44
91 #define O_SPLIT 45
92 #define O_LENGTH 46
93 #define O_SPRINTF 47
94 #define O_SUBSTR 48
95 #define O_JOIN 49
96 #define O_SLT 50
97 #define O_SGT 51
98 #define O_SLE 52
99 #define O_SGE 53
100 #define O_SEQ 54
101 #define O_SNE 55
102 #define O_SUBR 56
103 #define O_PRINT 57
104 #define O_CHDIR 58
105 #define O_DIE 59
106 #define O_EXIT 60
107 #define O_RESET 61
108 #define O_LIST 62
109 #define O_SELECT 63
110 #define O_EOF 64
111 #define O_TELL 65
112 #define O_SEEK 66
113 #define O_LAST 67
114 #define O_NEXT 68
115 #define O_REDO 69
116 #define O_GOTO 70
117 #define O_INDEX 71
118 #define O_TIME 72
119 #define O_TMS 73
120 #define O_LOCALTIME 74
121 #define O_GMTIME 75
122 #define O_STAT 76
123 #define O_CRYPT 77
124 #define O_EXP 78
125 #define O_LOG 79
126 #define O_SQRT 80
127 #define O_INT 81
128 #define O_PRTF 82
129 #define O_ORD 83
130 #define O_SLEEP 84
131 #define O_FLIP 85
132 #define O_FLOP 86
133 #define O_KEYS 87
134 #define O_VALUES 88
135 #define O_EACH 89
136 #define O_CHOP 90
137 #define O_FORK 91
138 #define O_EXEC_OP 92
139 #define O_SYSTEM 93
140 #define O_OCT 94
141 #define O_HEX 95
142 #define O_CHMOD 96
143 #define O_CHOWN 97
144 #define O_KILL 98
145 #define O_RENAME 99
146 #define O_UNLINK 100
147 #define O_UMASK 101
148 #define O_UNSHIFT 102
149 #define O_LINK 103
150 #define O_REPEAT 104
151 #define O_EVAL 105
152 #define O_FTEREAD 106
153 #define O_FTEWRITE 107
154 #define O_FTEEXEC 108
155 #define O_FTEOWNED 109
156 #define O_FTRREAD 110
157 #define O_FTRWRITE 111
158 #define O_FTREXEC 112
159 #define O_FTROWNED 113
160 #define O_FTIS 114
161 #define O_FTZERO 115
162 #define O_FTSIZE 116
163 #define O_FTFILE 117
164 #define O_FTDIR 118
165 #define O_FTLINK 119
166 #define O_SYMLINK 120
167 #define O_FTPIPE 121
168 #define O_FTSOCK 122
169 #define O_FTBLK 123
170 #define O_FTCHR 124
171 #define O_FTSUID 125
172 #define O_FTSGID 126
173 #define O_FTSVTX 127
174 #define O_FTTTY 128
175 #define O_DOFILE 129
176 #define O_FTTEXT 130
177 #define O_FTBINARY 131
178 #define O_UTIME 132
179 #define O_WAIT 133
180 #define O_SORT 134
181 #define O_DELETE 135
182 #define O_STUDY 136
183 #define O_ATAN2 137
184 #define O_SIN 138
185 #define O_COS 139
186 #define O_RAND 140
187 #define O_SRAND 141
188 #define O_POW 142
189 #define O_RETURN 143
190 #define O_GETC 144
191 #define O_MKDIR 145
192 #define O_RMDIR 146
193 #define O_GETPPID 147
194 #define O_GETPGRP 148
195 #define O_SETPGRP 149
196 #define O_GETPRIORITY 150
197 #define O_SETPRIORITY 151
198 #define O_CHROOT 152
199 #define O_IOCTL 153
200 #define O_FCNTL 154
201 #define O_FLOCK 155
202 #define O_RINDEX 156
203 #define O_PACK 157
204 #define O_UNPACK 158
205 #define O_READ 159
206 #define O_WARN 160
207 #define O_DBMOPEN 161
208 #define O_DBMCLOSE 162
209 #define O_ASLICE 163
210 #define O_HSLICE 164
211 #define O_LASLICE 165
212 #define O_LHSLICE 166
213 #define O_F_OR_R 167
214 #define O_RANGE 168
215 #define O_RCAT 169
216 #define O_AASSIGN 170
217 #define O_SASSIGN 171
218 #define O_DUMP 172
219 #define O_REVERSE 173
220 #define O_ADDROF 174
221 #define O_SOCKET 175
222 #define O_BIND 176
223 #define O_CONNECT 177
224 #define O_LISTEN 178
225 #define O_ACCEPT 179
226 #define O_SEND 180
227 #define O_RECV 181
228 #define O_SSELECT 182
229 #define O_SOCKPAIR 183
230 #define O_DBSUBR 184
231 #define O_DEFINED 185
232 #define O_UNDEF 186
233 #define O_READLINK 187
234 #define O_LSTAT 188
235 #define O_AELEM 189
236 #define O_HELEM 190
237 #define O_LAELEM 191
238 #define O_LHELEM 192
239 #define O_LOCAL 193
240 #define O_PIPE 194
241 #define O_FILENO 195
242 #define O_GHBYNAME 196
243 #define O_GHBYADDR 197
244 #define O_GHOSTENT 198
245 #define O_SHOSTENT 199
246 #define O_EHOSTENT 200
247 #define O_GSBYNAME 201
248 #define O_GSBYPORT 202
249 #define O_GSERVENT 203
250 #define O_SSERVENT 204
251 #define O_ESERVENT 205
252 #define O_GPBYNAME 206
253 #define O_GPBYNUMBER 207
254 #define O_GPROTOENT 208
255 #define O_SPROTOENT 209
256 #define O_EPROTOENT 210
257 #define O_GNBYNAME 211
258 #define O_GNBYADDR 212
259 #define O_GNETENT 213
260 #define O_SNETENT 214
261 #define O_ENETENT 215
262 #define O_VEC 216
263 #define O_GREP 217
264 #define O_GPWNAM 218
265 #define O_GPWUID 219
266 #define O_GPWENT 220
267 #define O_SPWENT 221
268 #define O_EPWENT 222
269 #define O_GGRNAM 223
270 #define O_GGRGID 224
271 #define O_GGRENT 225
272 #define O_SGRENT 226
273 #define O_EGRENT 227
274 #define O_SHUTDOWN 228
275 #define O_OPENDIR 229
276 #define O_READDIR 230
277 #define O_TELLDIR 231
278 #define O_SEEKDIR 232
279 #define O_REWINDDIR 233
280 #define O_CLOSEDIR 234
281 #define O_GETLOGIN 235
282 #define O_SYSCALL 236
283 #define O_GSOCKOPT 237
284 #define O_SSOCKOPT 238
285 #define O_GETSOCKNAME 239
286 #define O_GETPEERNAME 240
287 #define O_LSLICE 241
288 #define O_SPLICE 242
289 #define O_BINMODE 243
290 #define O_REQUIRE 244
291 #define O_TRUNCATE 245
292 #define O_MSGGET 246
293 #define O_MSGCTL 247
294 #define O_MSGSND 248
295 #define O_MSGRCV 249
296 #define O_SEMGET 250
297 #define O_SEMCTL 251
298 #define O_SEMOP 252
299 #define O_SHMGET 253
300 #define O_SHMCTL 254
301 #define O_SHMREAD 255
302 #define O_SHMWRITE 256
303 #define O_NCMP 257
304 #define O_SCMP 258
305 #define O_CALLER 259
306 #define O_SCALAR 260
307 #define O_SYSREAD 261
308 #define O_SYSWRITE 262
309 #define O_FTMTIME 263
310 #define O_FTATIME 264
311 #define O_FTCTIME 265
312 #define O_WAITPID 266
313 #define MAXO 267
314
315 #ifndef DOINIT
316 extern char *opname[];
317 #else
318 char *opname[] = {
319     "NULL",
320     "ITEM",
321     "ITEM2",
322     "ITEM3",
323     "CONCAT",
324     "MATCH",
325     "NMATCH",
326     "SUBST",
327     "NSUBST",
328     "ASSIGN",
329     "MULTIPLY",
330     "DIVIDE",
331     "MODULO",
332     "ADD",
333     "SUBTRACT",
334     "LEFT_SHIFT",
335     "RIGHT_SHIFT",
336     "LT",
337     "GT",
338     "LE",
339     "GE",
340     "EQ",
341     "NE",
342     "BIT_AND",
343     "XOR",
344     "BIT_OR",
345     "AND",
346     "OR",
347     "COND_EXPR",
348     "COMMA",
349     "NEGATE",
350     "NOT",
351     "COMPLEMENT",
352     "WRITE",
353     "OPEN",
354     "TRANS",
355     "NTRANS",
356     "CLOSE",
357     "ARRAY",
358     "HASH",
359     "LARRAY",
360     "LHASH",
361     "PUSH",
362     "POP",
363     "SHIFT",
364     "SPLIT",
365     "LENGTH",
366     "SPRINTF",
367     "SUBSTR",
368     "JOIN",
369     "SLT",
370     "SGT",
371     "SLE",
372     "SGE",
373     "SEQ",
374     "SNE",
375     "SUBR",
376     "PRINT",
377     "CHDIR",
378     "DIE",
379     "EXIT",
380     "RESET",
381     "LIST",
382     "SELECT",
383     "EOF",
384     "TELL",
385     "SEEK",
386     "LAST",
387     "NEXT",
388     "REDO",
389     "GOTO",/* shudder */
390     "INDEX",
391     "TIME",
392     "TIMES",
393     "LOCALTIME",
394     "GMTIME",
395     "STAT",
396     "CRYPT",
397     "EXP",
398     "LOG",
399     "SQRT",
400     "INT",
401     "PRINTF",
402     "ORD",
403     "SLEEP",
404     "FLIP",
405     "FLOP",
406     "KEYS",
407     "VALUES",
408     "EACH",
409     "CHOP",
410     "FORK",
411     "EXEC",
412     "SYSTEM",
413     "OCT",
414     "HEX",
415     "CHMOD",
416     "CHOWN",
417     "KILL",
418     "RENAME",
419     "UNLINK",
420     "UMASK",
421     "UNSHIFT",
422     "LINK",
423     "REPEAT",
424     "EVAL",
425     "FTEREAD",
426     "FTEWRITE",
427     "FTEEXEC",
428     "FTEOWNED",
429     "FTRREAD",
430     "FTRWRITE",
431     "FTREXEC",
432     "FTROWNED",
433     "FTIS",
434     "FTZERO",
435     "FTSIZE",
436     "FTFILE",
437     "FTDIR",
438     "FTLINK",
439     "SYMLINK",
440     "FTPIPE",
441     "FTSOCK",
442     "FTBLK",
443     "FTCHR",
444     "FTSUID",
445     "FTSGID",
446     "FTSVTX",
447     "FTTTY",
448     "DOFILE",
449     "FTTEXT",
450     "FTBINARY",
451     "UTIME",
452     "WAIT",
453     "SORT",
454     "DELETE",
455     "STUDY",
456     "ATAN2",
457     "SIN",
458     "COS",
459     "RAND",
460     "SRAND",
461     "POW",
462     "RETURN",
463     "GETC",
464     "MKDIR",
465     "RMDIR",
466     "GETPPID",
467     "GETPGRP",
468     "SETPGRP",
469     "GETPRIORITY",
470     "SETPRIORITY",
471     "CHROOT",
472     "IOCTL",
473     "FCNTL",
474     "FLOCK",
475     "RINDEX",
476     "PACK",
477     "UNPACK",
478     "READ",
479     "WARN",
480     "DBMOPEN",
481     "DBMCLOSE",
482     "ASLICE",
483     "HSLICE",
484     "LASLICE",
485     "LHSLICE",
486     "FLIP_OR_RANGE",
487     "RANGE",
488     "RCAT",
489     "AASSIGN",
490     "SASSIGN",
491     "DUMP",
492     "REVERSE",
493     "ADDRESS_OF",
494     "SOCKET",
495     "BIND",
496     "CONNECT",
497     "LISTEN",
498     "ACCEPT",
499     "SEND",
500     "RECV",
501     "SSELECT",
502     "SOCKPAIR",
503     "DBSUBR",
504     "DEFINED",
505     "UNDEF",
506     "READLINK",
507     "LSTAT",
508     "AELEM",
509     "HELEM",
510     "LAELEM",
511     "LHELEM",
512     "LOCAL",
513     "PIPE",
514     "FILENO",
515     "GHBYNAME",
516     "GHBYADDR",
517     "GHOSTENT",
518     "SHOSTENT",
519     "EHOSTENT",
520     "GSBYNAME",
521     "GSBYPORT",
522     "GSERVENT",
523     "SSERVENT",
524     "ESERVENT",
525     "GPBYNAME",
526     "GPBYNUMBER",
527     "GPROTOENT",
528     "SPROTOENT",
529     "EPROTOENT",
530     "GNBYNAME",
531     "GNBYADDR",
532     "GNETENT",
533     "SNETENT",
534     "ENETENT",
535     "VEC",
536     "GREP",
537     "GPWNAM",
538     "GPWUID",
539     "GPWENT",
540     "SPWENT",
541     "EPWENT",
542     "GGRNAM",
543     "GGRGID",
544     "GGRENT",
545     "SGRENT",
546     "EGRENT",
547     "SHUTDOWN",
548     "OPENDIR",
549     "READDIR",
550     "TELLDIR",
551     "SEEKDIR",
552     "REWINDDIR",
553     "CLOSEDIR",
554     "GETLOGIN",
555     "SYSCALL",
556     "GSOCKOPT",
557     "SSOCKOPT",
558     "GETSOCKNAME",
559     "GETPEERNAME",
560     "LSLICE",
561     "SPLICE",
562     "BINMODE",
563     "REQUIRE",
564     "TRUNCATE",
565     "MSGGET",
566     "MSGCTL",
567     "MSGSND",
568     "MSGRCV",
569     "SEMGET",
570     "SEMCTL",
571     "SEMOP",
572     "SHMGET",
573     "SHMCTL",
574     "SHMREAD",
575     "SHMWRITE",
576     "NCMP",
577     "SCMP",
578     "CALLER",
579     "SCALAR",
580     "SYSREAD",
581     "SYSWRITE",
582     "FTMTIME",
583     "FTATIME",
584     "FTCTIME",
585     "WAITPID",
586     "264"
587 };
588 #endif
589
590 #define A_NULL 0
591 #define A_EXPR 1
592 #define A_CMD 2
593 #define A_STAB 3
594 #define A_LVAL 4
595 #define A_SINGLE 5
596 #define A_DOUBLE 6
597 #define A_BACKTICK 7
598 #define A_READ 8
599 #define A_SPAT 9
600 #define A_LEXPR 10
601 #define A_ARYLEN 11
602 #define A_ARYSTAB 12
603 #define A_LARYLEN 13
604 #define A_GLOB 14
605 #define A_WORD 15
606 #define A_INDREAD 16
607 #define A_LARYSTAB 17
608 #define A_STAR 18
609 #define A_LSTAR 19
610 #define A_WANTARRAY 20
611
612 #define A_MASK 31
613 #define A_DONT 32               /* or this into type to suppress evaluation */
614
615 #ifndef DOINIT
616 extern char *argname[];
617 #else
618 char *argname[] = {
619     "A_NULL",
620     "EXPR",
621     "CMD",
622     "STAB",
623     "LVAL",
624     "SINGLE",
625     "DOUBLE",
626     "BACKTICK",
627     "READ",
628     "SPAT",
629     "LEXPR",
630     "ARYLEN",
631     "ARYSTAB",
632     "LARYLEN",
633     "GLOB",
634     "WORD",
635     "INDREAD",
636     "LARYSTAB",
637     "STAR",
638     "LSTAR",
639     "WANTARRAY",
640     "21"
641 };
642 #endif
643
644 #ifndef DOINIT
645 extern bool hoistable[];
646 #else
647 bool hoistable[] =
648   {0,   /* A_NULL */
649    0,   /* EXPR */
650    1,   /* CMD */
651    1,   /* STAB */
652    0,   /* LVAL */
653    1,   /* SINGLE */
654    0,   /* DOUBLE */
655    0,   /* BACKTICK */
656    0,   /* READ */
657    0,   /* SPAT */
658    0,   /* LEXPR */
659    1,   /* ARYLEN */
660    1,   /* ARYSTAB */
661    0,   /* LARYLEN */
662    0,   /* GLOB */
663    1,   /* WORD */
664    0,   /* INDREAD */
665    0,   /* LARYSTAB */
666    1,   /* STAR */
667    1,   /* LSTAR */
668    1,   /* WANTARRAY */
669    0,   /* 21 */
670 };
671 #endif
672
673 union argptr {
674     ARG         *arg_arg;
675     char        *arg_cval;
676     STAB        *arg_stab;
677     SPAT        *arg_spat;
678     CMD         *arg_cmd;
679     STR         *arg_str;
680     HASH        *arg_hash;
681 };
682
683 struct arg {
684     union argptr arg_ptr;
685     short       arg_len;
686     unsigned short arg_type;
687     unsigned short arg_flags;
688 };
689
690 #define AF_ARYOK 1              /* op can handle multiple values here */
691 #define AF_POST 2               /* post *crement this item */
692 #define AF_PRE 4                /* pre *crement this item */
693 #define AF_UP 8                 /* increment rather than decrement */
694 #define AF_COMMON 16            /* left and right have symbols in common */
695 #define AF_UNUSED 32            /*  */
696 #define AF_LISTISH 64           /* turn into list if important */
697 #define AF_LOCAL 128            /* list of local variables */
698
699 /*
700  * Most of the ARG pointers are used as pointers to arrays of ARG.  When
701  * so used, the 0th element is special, and represents the operator to
702  * use on the list of arguments following.  The arg_len in the 0th element
703  * gives the maximum argument number, and the arg_str is used to store
704  * the return value in a more-or-less static location.  Sorry it's not
705  * re-entrant (yet), but it sure makes it efficient.  The arg_type of the
706  * 0th element is an operator (O_*) rather than an argument type (A_*).
707  */
708
709 #define Nullarg Null(ARG*)
710
711 #ifndef DOINIT
712 EXT unsigned short opargs[MAXO+1];
713 #else
714 #define A(e1,e2,e3)        (e1+(e2<<2)+(e3<<4))
715 #define A5(e1,e2,e3,e4,e5) (e1+(e2<<2)+(e3<<4)+(e4<<6)+(e5<<8))
716 unsigned short opargs[MAXO+1] = {
717         A(0,0,0),       /* NULL */
718         A(1,0,0),       /* ITEM */
719         A(0,0,0),       /* ITEM2 */
720         A(0,0,0),       /* ITEM3 */
721         A(1,1,0),       /* CONCAT */
722         A(1,0,0),       /* MATCH */
723         A(1,0,0),       /* NMATCH */
724         A(1,0,0),       /* SUBST */
725         A(1,0,0),       /* NSUBST */
726         A(1,1,0),       /* ASSIGN */
727         A(1,1,0),       /* MULTIPLY */
728         A(1,1,0),       /* DIVIDE */
729         A(1,1,0),       /* MODULO */
730         A(1,1,0),       /* ADD */
731         A(1,1,0),       /* SUBTRACT */
732         A(1,1,0),       /* LEFT_SHIFT */
733         A(1,1,0),       /* RIGHT_SHIFT */
734         A(1,1,0),       /* LT */
735         A(1,1,0),       /* GT */
736         A(1,1,0),       /* LE */
737         A(1,1,0),       /* GE */
738         A(1,1,0),       /* EQ */
739         A(1,1,0),       /* NE */
740         A(1,1,0),       /* BIT_AND */
741         A(1,1,0),       /* XOR */
742         A(1,1,0),       /* BIT_OR */
743         A(1,0,0),       /* AND */
744         A(1,0,0),       /* OR */
745         A(1,0,0),       /* COND_EXPR */
746         A(1,1,0),       /* COMMA */
747         A(1,0,0),       /* NEGATE */
748         A(1,0,0),       /* NOT */
749         A(1,0,0),       /* COMPLEMENT */
750         A(1,0,0),       /* WRITE */
751         A(1,1,0),       /* OPEN */
752         A(1,0,0),       /* TRANS */
753         A(1,0,0),       /* NTRANS */
754         A(1,0,0),       /* CLOSE */
755         A(0,0,0),       /* ARRAY */
756         A(0,0,0),       /* HASH */
757         A(0,0,0),       /* LARRAY */
758         A(0,0,0),       /* LHASH */
759         A(0,3,0),       /* PUSH */
760         A(0,0,0),       /* POP */
761         A(0,0,0),       /* SHIFT */
762         A(1,0,1),       /* SPLIT */
763         A(1,0,0),       /* LENGTH */
764         A(3,0,0),       /* SPRINTF */
765         A(1,1,1),       /* SUBSTR */
766         A(1,3,0),       /* JOIN */
767         A(1,1,0),       /* SLT */
768         A(1,1,0),       /* SGT */
769         A(1,1,0),       /* SLE */
770         A(1,1,0),       /* SGE */
771         A(1,1,0),       /* SEQ */
772         A(1,1,0),       /* SNE */
773         A(0,3,0),       /* SUBR */
774         A(1,3,0),       /* PRINT */
775         A(1,0,0),       /* CHDIR */
776         A(0,3,0),       /* DIE */
777         A(1,0,0),       /* EXIT */
778         A(1,0,0),       /* RESET */
779         A(3,0,0),       /* LIST */
780         A(1,0,0),       /* SELECT */
781         A(1,0,0),       /* EOF */
782         A(1,0,0),       /* TELL */
783         A(1,1,1),       /* SEEK */
784         A(0,0,0),       /* LAST */
785         A(0,0,0),       /* NEXT */
786         A(0,0,0),       /* REDO */
787         A(0,0,0),       /* GOTO */
788         A(1,1,1),       /* INDEX */
789         A(0,0,0),       /* TIME */
790         A(0,0,0),       /* TIMES */
791         A(1,0,0),       /* LOCALTIME */
792         A(1,0,0),       /* GMTIME */
793         A(1,0,0),       /* STAT */
794         A(1,1,0),       /* CRYPT */
795         A(1,0,0),       /* EXP */
796         A(1,0,0),       /* LOG */
797         A(1,0,0),       /* SQRT */
798         A(1,0,0),       /* INT */
799         A(1,3,0),       /* PRINTF */
800         A(1,0,0),       /* ORD */
801         A(1,0,0),       /* SLEEP */
802         A(1,0,0),       /* FLIP */
803         A(0,1,0),       /* FLOP */
804         A(0,0,0),       /* KEYS */
805         A(0,0,0),       /* VALUES */
806         A(0,0,0),       /* EACH */
807         A(3,0,0),       /* CHOP */
808         A(0,0,0),       /* FORK */
809         A(1,3,0),       /* EXEC */
810         A(1,3,0),       /* SYSTEM */
811         A(1,0,0),       /* OCT */
812         A(1,0,0),       /* HEX */
813         A(0,3,0),       /* CHMOD */
814         A(0,3,0),       /* CHOWN */
815         A(0,3,0),       /* KILL */
816         A(1,1,0),       /* RENAME */
817         A(0,3,0),       /* UNLINK */
818         A(1,0,0),       /* UMASK */
819         A(0,3,0),       /* UNSHIFT */
820         A(1,1,0),       /* LINK */
821         A(1,1,0),       /* REPEAT */
822         A(1,0,0),       /* EVAL */
823         A(1,0,0),       /* FTEREAD */
824         A(1,0,0),       /* FTEWRITE */
825         A(1,0,0),       /* FTEEXEC */
826         A(1,0,0),       /* FTEOWNED */
827         A(1,0,0),       /* FTRREAD */
828         A(1,0,0),       /* FTRWRITE */
829         A(1,0,0),       /* FTREXEC */
830         A(1,0,0),       /* FTROWNED */
831         A(1,0,0),       /* FTIS */
832         A(1,0,0),       /* FTZERO */
833         A(1,0,0),       /* FTSIZE */
834         A(1,0,0),       /* FTFILE */
835         A(1,0,0),       /* FTDIR */
836         A(1,0,0),       /* FTLINK */
837         A(1,1,0),       /* SYMLINK */
838         A(1,0,0),       /* FTPIPE */
839         A(1,0,0),       /* FTSOCK */
840         A(1,0,0),       /* FTBLK */
841         A(1,0,0),       /* FTCHR */
842         A(1,0,0),       /* FTSUID */
843         A(1,0,0),       /* FTSGID */
844         A(1,0,0),       /* FTSVTX */
845         A(1,0,0),       /* FTTTY */
846         A(1,0,0),       /* DOFILE */
847         A(1,0,0),       /* FTTEXT */
848         A(1,0,0),       /* FTBINARY */
849         A(0,3,0),       /* UTIME */
850         A(0,0,0),       /* WAIT */
851         A(1,3,0),       /* SORT */
852         A(0,1,0),       /* DELETE */
853         A(1,0,0),       /* STUDY */
854         A(1,1,0),       /* ATAN2 */
855         A(1,0,0),       /* SIN */
856         A(1,0,0),       /* COS */
857         A(1,0,0),       /* RAND */
858         A(1,0,0),       /* SRAND */
859         A(1,1,0),       /* POW */
860         A(0,3,0),       /* RETURN */
861         A(1,0,0),       /* GETC */
862         A(1,1,0),       /* MKDIR */
863         A(1,0,0),       /* RMDIR */
864         A(0,0,0),       /* GETPPID */
865         A(1,0,0),       /* GETPGRP */
866         A(1,1,0),       /* SETPGRP */
867         A(1,1,0),       /* GETPRIORITY */
868         A(1,1,1),       /* SETPRIORITY */
869         A(1,0,0),       /* CHROOT */
870         A(1,1,1),       /* IOCTL */
871         A(1,1,1),       /* FCNTL */
872         A(1,1,0),       /* FLOCK */
873         A(1,1,1),       /* RINDEX */
874         A(1,3,0),       /* PACK */
875         A(1,1,0),       /* UNPACK */
876         A(1,1,3),       /* READ */
877         A(0,3,0),       /* WARN */
878         A(1,1,1),       /* DBMOPEN */
879         A(1,0,0),       /* DBMCLOSE */
880         A(0,3,0),       /* ASLICE */
881         A(0,3,0),       /* HSLICE */
882         A(0,3,0),       /* LASLICE */
883         A(0,3,0),       /* LHSLICE */
884         A(1,0,0),       /* F_OR_R */
885         A(1,1,0),       /* RANGE */
886         A(1,1,0),       /* RCAT */
887         A(3,3,0),       /* AASSIGN */
888         A(0,0,0),       /* SASSIGN */
889         A(0,0,0),       /* DUMP */
890         A(0,3,0),       /* REVERSE */
891         A(1,0,0),       /* ADDROF */
892         A(1,1,1),       /* SOCKET */
893         A(1,1,0),       /* BIND */
894         A(1,1,0),       /* CONNECT */
895         A(1,1,0),       /* LISTEN */
896         A(1,1,0),       /* ACCEPT */
897         A(1,1,3),       /* SEND */
898         A(1,1,3),       /* RECV */
899         A(1,1,1),       /* SSELECT */
900         A(1,1,1),       /* SOCKPAIR */
901         A(0,3,0),       /* DBSUBR */
902         A(1,0,0),       /* DEFINED */
903         A(1,0,0),       /* UNDEF */
904         A(1,0,0),       /* READLINK */
905         A(1,0,0),       /* LSTAT */
906         A(0,1,0),       /* AELEM */
907         A(0,1,0),       /* HELEM */
908         A(0,1,0),       /* LAELEM */
909         A(0,1,0),       /* LHELEM */
910         A(1,0,0),       /* LOCAL */
911         A(1,1,0),       /* PIPE */
912         A(1,0,0),       /* FILENO */
913         A(1,0,0),       /* GHBYNAME */
914         A(1,1,0),       /* GHBYADDR */
915         A(0,0,0),       /* GHOSTENT */
916         A(1,0,0),       /* SHOSTENT */
917         A(0,0,0),       /* EHOSTENT */
918         A(1,1,0),       /* GSBYNAME */
919         A(1,1,0),       /* GSBYPORT */
920         A(0,0,0),       /* GSERVENT */
921         A(1,0,0),       /* SSERVENT */
922         A(0,0,0),       /* ESERVENT */
923         A(1,0,0),       /* GPBYNAME */
924         A(1,0,0),       /* GPBYNUMBER */
925         A(0,0,0),       /* GPROTOENT */
926         A(1,0,0),       /* SPROTOENT */
927         A(0,0,0),       /* EPROTOENT */
928         A(1,0,0),       /* GNBYNAME */
929         A(1,1,0),       /* GNBYADDR */
930         A(0,0,0),       /* GNETENT */
931         A(1,0,0),       /* SNETENT */
932         A(0,0,0),       /* ENETENT */
933         A(1,1,1),       /* VEC */
934         A(0,3,0),       /* GREP */
935         A(1,0,0),       /* GPWNAM */
936         A(1,0,0),       /* GPWUID */
937         A(0,0,0),       /* GPWENT */
938         A(0,0,0),       /* SPWENT */
939         A(0,0,0),       /* EPWENT */
940         A(1,0,0),       /* GGRNAM */
941         A(1,0,0),       /* GGRGID */
942         A(0,0,0),       /* GGRENT */
943         A(0,0,0),       /* SGRENT */
944         A(0,0,0),       /* EGRENT */
945         A(1,1,0),       /* SHUTDOWN */
946         A(1,1,0),       /* OPENDIR */
947         A(1,0,0),       /* READDIR */
948         A(1,0,0),       /* TELLDIR */
949         A(1,1,0),       /* SEEKDIR */
950         A(1,0,0),       /* REWINDDIR */
951         A(1,0,0),       /* CLOSEDIR */
952         A(0,0,0),       /* GETLOGIN */
953         A(1,3,0),       /* SYSCALL */
954         A(1,1,1),       /* GSOCKOPT */
955         A(1,1,1),       /* SSOCKOPT */
956         A(1,0,0),       /* GETSOCKNAME */
957         A(1,0,0),       /* GETPEERNAME */
958         A(0,3,3),       /* LSLICE */
959         A(0,3,1),       /* SPLICE */
960         A(1,0,0),       /* BINMODE */
961         A(1,0,0),       /* REQUIRE */
962         A(1,1,0),       /* TRUNCATE */
963         A(1,1,0),       /* MSGGET */
964         A(1,1,1),       /* MSGCTL */
965         A(1,1,1),       /* MSGSND */
966         A5(1,1,1,1,1),  /* MSGRCV */
967         A(1,1,1),       /* SEMGET */
968         A5(1,1,1,1,0),  /* SEMCTL */
969         A(1,1,1),       /* SEMOP */
970         A(1,1,1),       /* SHMGET */
971         A(1,1,1),       /* SHMCTL */
972         A5(1,1,1,1,0),  /* SHMREAD */
973         A5(1,1,1,1,0),  /* SHMWRITE */
974         A(1,1,0),       /* NCMP */
975         A(1,1,0),       /* SCMP */
976         A(1,0,0),       /* CALLER */
977         A(1,0,0),       /* SCALAR */
978         A(1,1,3),       /* SYSREAD */
979         A(1,1,3),       /* SYSWRITE */
980         A(1,0,0),       /* FTMTIME */
981         A(1,0,0),       /* FTATIME */
982         A(1,0,0),       /* FTCTIME */
983         A(1,1,0),       /* WAITPID */
984         0
985 };
986 #undef A
987 #undef A5
988 #endif
989
990 int do_trans();
991 int do_split();
992 bool do_eof();
993 long do_tell();
994 bool do_seek();
995 int do_tms();
996 int do_time();
997 int do_stat();
998 STR *do_push();
999 FILE *nextargv();
1000 STR *do_fttext();
1001 int do_slice();