summaryrefslogtreecommitdiff
path: root/arg.h
blob: df139dbbca14636a2c5b35cff634049ae6c3e46b (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
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
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
/* $Header: arg.h,v 3.0.1.7 90/10/15 14:53:59 lwall Locked $
 *
 *    Copyright (c) 1989, Larry Wall
 *
 *    You may distribute under the terms of the GNU General Public License
 *    as specified in the README file that comes with the perl 3.0 kit.
 *
 * $Log:	arg.h,v $
 * Revision 3.0.1.7  90/10/15  14:53:59  lwall
 * patch29: added SysV IPC
 * patch29: added waitpid
 * patch29: added cmp and <=>
 * patch29: added caller
 * patch29: added scalar
 * patch29: added sysread and syswrite
 * patch29: added -M, -A and -C
 * patch29: index and substr now have optional 3rd args
 * patch29: you can now read into the middle string
 * patch29: various portability fixes
 * 
 * Revision 3.0.1.6  90/08/09  02:25:14  lwall
 * patch19: added require operator
 * patch19: added truncate operator
 * 
 * Revision 3.0.1.5  90/03/27  15:29:41  lwall
 * patch16: MSDOS support
 * 
 * Revision 3.0.1.4  90/03/12  16:18:21  lwall
 * patch13: added list slice operator (LIST)[LIST]
 * patch13: added splice operator: @oldelems = splice(@array,$offset,$len,LIST)
 * 
 * Revision 3.0.1.3  90/02/28  16:21:55  lwall
 * patch9: added pipe function
 * 
 * Revision 3.0.1.2  89/12/21  19:13:14  lwall
 * patch7: send() didn't allow a TO argument
 * 
 * Revision 3.0.1.1  89/10/26  23:02:35  lwall
 * patch1: reverse didn't work
 * 
 * Revision 3.0  89/10/18  15:08:27  lwall
 * 3.0 baseline
 * 
 */

#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_OP 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 O_ATAN2 137
#define O_SIN 138
#define O_COS 139
#define O_RAND 140
#define O_SRAND 141
#define O_POW 142
#define O_RETURN 143
#define O_GETC 144
#define O_MKDIR 145
#define O_RMDIR 146
#define O_GETPPID 147
#define O_GETPGRP 148
#define O_SETPGRP 149
#define O_GETPRIORITY 150
#define O_SETPRIORITY 151
#define O_CHROOT 152
#define O_IOCTL 153
#define O_FCNTL 154
#define O_FLOCK 155
#define O_RINDEX 156
#define O_PACK 157
#define O_UNPACK 158
#define O_READ 159
#define O_WARN 160
#define O_DBMOPEN 161
#define O_DBMCLOSE 162
#define O_ASLICE 163
#define O_HSLICE 164
#define O_LASLICE 165
#define O_LHSLICE 166
#define O_F_OR_R 167
#define O_RANGE 168
#define O_RCAT 169
#define O_AASSIGN 170
#define O_SASSIGN 171
#define O_DUMP 172
#define O_REVERSE 173
#define O_ADDROF 174
#define O_SOCKET 175
#define O_BIND 176
#define O_CONNECT 177
#define O_LISTEN 178
#define O_ACCEPT 179
#define O_SEND 180
#define O_RECV 181
#define O_SSELECT 182
#define O_SOCKPAIR 183
#define O_DBSUBR 184
#define O_DEFINED 185
#define O_UNDEF 186
#define O_READLINK 187
#define O_LSTAT 188
#define O_AELEM 189
#define O_HELEM 190
#define O_LAELEM 191
#define O_LHELEM 192
#define O_LOCAL 193
#define O_PIPE 194
#define O_FILENO 195
#define O_GHBYNAME 196
#define O_GHBYADDR 197
#define O_GHOSTENT 198
#define O_SHOSTENT 199
#define O_EHOSTENT 200
#define O_GSBYNAME 201
#define O_GSBYPORT 202
#define O_GSERVENT 203
#define O_SSERVENT 204
#define O_ESERVENT 205
#define O_GPBYNAME 206
#define O_GPBYNUMBER 207
#define O_GPROTOENT 208
#define O_SPROTOENT 209
#define O_EPROTOENT 210
#define O_GNBYNAME 211
#define O_GNBYADDR 212
#define O_GNETENT 213
#define O_SNETENT 214
#define O_ENETENT 215
#define O_VEC 216
#define O_GREP 217
#define O_GPWNAM 218
#define O_GPWUID 219
#define O_GPWENT 220
#define O_SPWENT 221
#define O_EPWENT 222
#define O_GGRNAM 223
#define O_GGRGID 224
#define O_GGRENT 225
#define O_SGRENT 226
#define O_EGRENT 227
#define O_SHUTDOWN 228
#define O_OPENDIR 229
#define O_READDIR 230
#define O_TELLDIR 231
#define O_SEEKDIR 232
#define O_REWINDDIR 233
#define O_CLOSEDIR 234
#define O_GETLOGIN 235
#define O_SYSCALL 236
#define O_GSOCKOPT 237
#define O_SSOCKOPT 238
#define O_GETSOCKNAME 239
#define O_GETPEERNAME 240
#define O_LSLICE 241
#define O_SPLICE 242
#define O_BINMODE 243
#define O_REQUIRE 244
#define O_TRUNCATE 245
#define O_MSGGET 246
#define O_MSGCTL 247
#define O_MSGSND 248
#define O_MSGRCV 249
#define O_SEMGET 250
#define O_SEMCTL 251
#define O_SEMOP 252
#define O_SHMGET 253
#define O_SHMCTL 254
#define O_SHMREAD 255
#define O_SHMWRITE 256
#define O_NCMP 257
#define O_SCMP 258
#define O_CALLER 259
#define O_SCALAR 260
#define O_SYSREAD 261
#define O_SYSWRITE 262
#define O_FTMTIME 263
#define O_FTATIME 264
#define O_FTCTIME 265
#define O_WAITPID 266
#define MAXO 267

#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",
    "ATAN2",
    "SIN",
    "COS",
    "RAND",
    "SRAND",
    "POW",
    "RETURN",
    "GETC",
    "MKDIR",
    "RMDIR",
    "GETPPID",
    "GETPGRP",
    "SETPGRP",
    "GETPRIORITY",
    "SETPRIORITY",
    "CHROOT",
    "IOCTL",
    "FCNTL",
    "FLOCK",
    "RINDEX",
    "PACK",
    "UNPACK",
    "READ",
    "WARN",
    "DBMOPEN",
    "DBMCLOSE",
    "ASLICE",
    "HSLICE",
    "LASLICE",
    "LHSLICE",
    "FLIP_OR_RANGE",
    "RANGE",
    "RCAT",
    "AASSIGN",
    "SASSIGN",
    "DUMP",
    "REVERSE",
    "ADDRESS_OF",
    "SOCKET",
    "BIND",
    "CONNECT",
    "LISTEN",
    "ACCEPT",
    "SEND",
    "RECV",
    "SSELECT",
    "SOCKPAIR",
    "DBSUBR",
    "DEFINED",
    "UNDEF",
    "READLINK",
    "LSTAT",
    "AELEM",
    "HELEM",
    "LAELEM",
    "LHELEM",
    "LOCAL",
    "PIPE",
    "FILENO",
    "GHBYNAME",
    "GHBYADDR",
    "GHOSTENT",
    "SHOSTENT",
    "EHOSTENT",
    "GSBYNAME",
    "GSBYPORT",
    "GSERVENT",
    "SSERVENT",
    "ESERVENT",
    "GPBYNAME",
    "GPBYNUMBER",
    "GPROTOENT",
    "SPROTOENT",
    "EPROTOENT",
    "GNBYNAME",
    "GNBYADDR",
    "GNETENT",
    "SNETENT",
    "ENETENT",
    "VEC",
    "GREP",
    "GPWNAM",
    "GPWUID",
    "GPWENT",
    "SPWENT",
    "EPWENT",
    "GGRNAM",
    "GGRGID",
    "GGRENT",
    "SGRENT",
    "EGRENT",
    "SHUTDOWN",
    "OPENDIR",
    "READDIR",
    "TELLDIR",
    "SEEKDIR",
    "REWINDDIR",
    "CLOSEDIR",
    "GETLOGIN",
    "SYSCALL",
    "GSOCKOPT",
    "SSOCKOPT",
    "GETSOCKNAME",
    "GETPEERNAME",
    "LSLICE",
    "SPLICE",
    "BINMODE",
    "REQUIRE",
    "TRUNCATE",
    "MSGGET",
    "MSGCTL",
    "MSGSND",
    "MSGRCV",
    "SEMGET",
    "SEMCTL",
    "SEMOP",
    "SHMGET",
    "SHMCTL",
    "SHMREAD",
    "SHMWRITE",
    "NCMP",
    "SCMP",
    "CALLER",
    "SCALAR",
    "SYSREAD",
    "SYSWRITE",
    "FTMTIME",
    "FTATIME",
    "FTCTIME",
    "WAITPID",
    "264"
};
#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_ARYSTAB 12
#define A_LARYLEN 13
#define A_GLOB 14
#define A_WORD 15
#define A_INDREAD 16
#define A_LARYSTAB 17
#define A_STAR 18
#define A_LSTAR 19
#define A_WANTARRAY 20

#define A_MASK 31
#define A_DONT 32		/* or this into type to suppress evaluation */

#ifndef DOINIT
extern char *argname[];
#else
char *argname[] = {
    "A_NULL",
    "EXPR",
    "CMD",
    "STAB",
    "LVAL",
    "SINGLE",
    "DOUBLE",
    "BACKTICK",
    "READ",
    "SPAT",
    "LEXPR",
    "ARYLEN",
    "ARYSTAB",
    "LARYLEN",
    "GLOB",
    "WORD",
    "INDREAD",
    "LARYSTAB",
    "STAR",
    "LSTAR",
    "WANTARRAY",
    "21"
};
#endif

#ifndef DOINIT
extern bool hoistable[];
#else
bool hoistable[] =
  {0,	/* A_NULL */
   0,	/* EXPR */
   1,	/* CMD */
   1,	/* STAB */
   0,	/* LVAL */
   1,	/* SINGLE */
   0,	/* DOUBLE */
   0,	/* BACKTICK */
   0,	/* READ */
   0,	/* SPAT */
   0,	/* LEXPR */
   1,	/* ARYLEN */
   1,	/* ARYSTAB */
   0,	/* LARYLEN */
   0,	/* GLOB */
   1,	/* WORD */
   0,	/* INDREAD */
   0,	/* LARYSTAB */
   1,	/* STAR */
   1,	/* LSTAR */
   1,	/* WANTARRAY */
   0,	/* 21 */
};
#endif

union argptr {
    ARG		*arg_arg;
    char	*arg_cval;
    STAB	*arg_stab;
    SPAT	*arg_spat;
    CMD		*arg_cmd;
    STR		*arg_str;
    HASH	*arg_hash;
};

struct arg {
    union argptr arg_ptr;
    short	arg_len;
    unsigned short arg_type;
    unsigned short arg_flags;
};

#define AF_ARYOK 1		/* op can handle multiple values here */
#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_UNUSED 32		/*  */
#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 (yet), 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*)

#ifndef DOINIT
EXT unsigned short opargs[MAXO+1];
#else
#define A(e1,e2,e3)        (e1+(e2<<2)+(e3<<4))
#define A5(e1,e2,e3,e4,e5) (e1+(e2<<2)+(e3<<4)+(e4<<6)+(e5<<8))
unsigned short opargs[MAXO+1] = {
	A(0,0,0),	/* NULL */
	A(1,0,0),	/* ITEM */
	A(0,0,0),	/* ITEM2 */
	A(0,0,0),	/* ITEM3 */
	A(1,1,0),	/* CONCAT */
	A(1,0,0),	/* MATCH */
	A(1,0,0),	/* NMATCH */
	A(1,0,0),	/* SUBST */
	A(1,0,0),	/* NSUBST */
	A(1,1,0),	/* ASSIGN */
	A(1,1,0),	/* MULTIPLY */
	A(1,1,0),	/* DIVIDE */
	A(1,1,0),	/* MODULO */
	A(1,1,0),	/* ADD */
	A(1,1,0),	/* SUBTRACT */
	A(1,1,0),	/* LEFT_SHIFT */
	A(1,1,0),	/* RIGHT_SHIFT */
	A(1,1,0),	/* LT */
	A(1,1,0),	/* GT */
	A(1,1,0),	/* LE */
	A(1,1,0),	/* GE */
	A(1,1,0),	/* EQ */
	A(1,1,0),	/* NE */
	A(1,1,0),	/* BIT_AND */
	A(1,1,0),	/* XOR */
	A(1,1,0),	/* BIT_OR */
	A(1,0,0),	/* AND */
	A(1,0,0),	/* OR */
	A(1,0,0),	/* COND_EXPR */
	A(1,1,0),	/* COMMA */
	A(1,0,0),	/* NEGATE */
	A(1,0,0),	/* NOT */
	A(1,0,0),	/* COMPLEMENT */
	A(1,0,0),	/* WRITE */
	A(1,1,0),	/* OPEN */
	A(1,0,0),	/* TRANS */
	A(1,0,0),	/* NTRANS */
	A(1,0,0),	/* CLOSE */
	A(0,0,0),	/* ARRAY */
	A(0,0,0),	/* HASH */
	A(0,0,0),	/* LARRAY */
	A(0,0,0),	/* LHASH */
	A(0,3,0),	/* PUSH */
	A(0,0,0),	/* POP */
	A(0,0,0),	/* SHIFT */
	A(1,0,1),	/* SPLIT */
	A(1,0,0),	/* LENGTH */
	A(3,0,0),	/* SPRINTF */
	A(1,1,1),	/* SUBSTR */
	A(1,3,0),	/* JOIN */
	A(1,1,0),	/* SLT */
	A(1,1,0),	/* SGT */
	A(1,1,0),	/* SLE */
	A(1,1,0),	/* SGE */
	A(1,1,0),	/* SEQ */
	A(1,1,0),	/* SNE */
	A(0,3,0),	/* SUBR */
	A(1,3,0),	/* PRINT */
	A(1,0,0),	/* CHDIR */
	A(0,3,0),	/* DIE */
	A(1,0,0),	/* EXIT */
	A(1,0,0),	/* RESET */
	A(3,0,0),	/* LIST */
	A(1,0,0),	/* SELECT */
	A(1,0,0),	/* EOF */
	A(1,0,0),	/* TELL */
	A(1,1,1),	/* SEEK */
	A(0,0,0),	/* LAST */
	A(0,0,0),	/* NEXT */
	A(0,0,0),	/* REDO */
	A(0,0,0),	/* GOTO */
	A(1,1,1),	/* INDEX */
	A(0,0,0),	/* TIME */
	A(0,0,0),	/* TIMES */
	A(1,0,0),	/* LOCALTIME */
	A(1,0,0),	/* GMTIME */
	A(1,0,0),	/* STAT */
	A(1,1,0),	/* CRYPT */
	A(1,0,0),	/* EXP */
	A(1,0,0),	/* LOG */
	A(1,0,0),	/* SQRT */
	A(1,0,0),	/* INT */
	A(1,3,0),	/* PRINTF */
	A(1,0,0),	/* ORD */
	A(1,0,0),	/* SLEEP */
	A(1,0,0),	/* FLIP */
	A(0,1,0),	/* FLOP */
	A(0,0,0),	/* KEYS */
	A(0,0,0),	/* VALUES */
	A(0,0,0),	/* EACH */
	A(3,0,0),	/* CHOP */
	A(0,0,0),	/* FORK */
	A(1,3,0),	/* EXEC */
	A(1,3,0),	/* SYSTEM */
	A(1,0,0),	/* OCT */
	A(1,0,0),	/* HEX */
	A(0,3,0),	/* CHMOD */
	A(0,3,0),	/* CHOWN */
	A(0,3,0),	/* KILL */
	A(1,1,0),	/* RENAME */
	A(0,3,0),	/* UNLINK */
	A(1,0,0),	/* UMASK */
	A(0,3,0),	/* UNSHIFT */
	A(1,1,0),	/* LINK */
	A(1,1,0),	/* REPEAT */
	A(1,0,0),	/* EVAL */
	A(1,0,0),	/* FTEREAD */
	A(1,0,0),	/* FTEWRITE */
	A(1,0,0),	/* FTEEXEC */
	A(1,0,0),	/* FTEOWNED */
	A(1,0,0),	/* FTRREAD */
	A(1,0,0),	/* FTRWRITE */
	A(1,0,0),	/* FTREXEC */
	A(1,0,0),	/* FTROWNED */
	A(1,0,0),	/* FTIS */
	A(1,0,0),	/* FTZERO */
	A(1,0,0),	/* FTSIZE */
	A(1,0,0),	/* FTFILE */
	A(1,0,0),	/* FTDIR */
	A(1,0,0),	/* FTLINK */
	A(1,1,0),	/* SYMLINK */
	A(1,0,0),	/* FTPIPE */
	A(1,0,0),	/* FTSOCK */
	A(1,0,0),	/* FTBLK */
	A(1,0,0),	/* FTCHR */
	A(1,0,0),	/* FTSUID */
	A(1,0,0),	/* FTSGID */
	A(1,0,0),	/* FTSVTX */
	A(1,0,0),	/* FTTTY */
	A(1,0,0),	/* DOFILE */
	A(1,0,0),	/* FTTEXT */
	A(1,0,0),	/* FTBINARY */
	A(0,3,0),	/* UTIME */
	A(0,0,0),	/* WAIT */
	A(1,3,0),	/* SORT */
	A(0,1,0),	/* DELETE */
	A(1,0,0),	/* STUDY */
	A(1,1,0),	/* ATAN2 */
	A(1,0,0),	/* SIN */
	A(1,0,0),	/* COS */
	A(1,0,0),	/* RAND */
	A(1,0,0),	/* SRAND */
	A(1,1,0),	/* POW */
	A(0,3,0),	/* RETURN */
	A(1,0,0),	/* GETC */
	A(1,1,0),	/* MKDIR */
	A(1,0,0),	/* RMDIR */
	A(0,0,0),	/* GETPPID */
	A(1,0,0),	/* GETPGRP */
	A(1,1,0),	/* SETPGRP */
	A(1,1,0),	/* GETPRIORITY */
	A(1,1,1),	/* SETPRIORITY */
	A(1,0,0),	/* CHROOT */
	A(1,1,1),	/* IOCTL */
	A(1,1,1),	/* FCNTL */
	A(1,1,0),	/* FLOCK */
	A(1,1,1),	/* RINDEX */
	A(1,3,0),	/* PACK */
	A(1,1,0),	/* UNPACK */
	A(1,1,3),	/* READ */
	A(0,3,0),	/* WARN */
	A(1,1,1),	/* DBMOPEN */
	A(1,0,0),	/* DBMCLOSE */
	A(0,3,0),	/* ASLICE */
	A(0,3,0),	/* HSLICE */
	A(0,3,0),	/* LASLICE */
	A(0,3,0),	/* LHSLICE */
	A(1,0,0),	/* F_OR_R */
	A(1,1,0),	/* RANGE */
	A(1,1,0),	/* RCAT */
	A(3,3,0),	/* AASSIGN */
	A(0,0,0),	/* SASSIGN */
	A(0,0,0),	/* DUMP */
	A(0,3,0),	/* REVERSE */
	A(1,0,0),	/* ADDROF */
	A(1,1,1),	/* SOCKET */
	A(1,1,0),	/* BIND */
	A(1,1,0),	/* CONNECT */
	A(1,1,0),	/* LISTEN */
	A(1,1,0),	/* ACCEPT */
	A(1,1,3),	/* SEND */
	A(1,1,3),	/* RECV */
	A(1,1,1),	/* SSELECT */
	A(1,1,1),	/* SOCKPAIR */
	A(0,3,0),	/* DBSUBR */
	A(1,0,0),	/* DEFINED */
	A(1,0,0),	/* UNDEF */
	A(1,0,0),	/* READLINK */
	A(1,0,0),	/* LSTAT */
	A(0,1,0),	/* AELEM */
	A(0,1,0),	/* HELEM */
	A(0,1,0),	/* LAELEM */
	A(0,1,0),	/* LHELEM */
	A(1,0,0),	/* LOCAL */
	A(1,1,0),	/* PIPE */
	A(1,0,0),	/* FILENO */
	A(1,0,0),	/* GHBYNAME */
	A(1,1,0),	/* GHBYADDR */
	A(0,0,0),	/* GHOSTENT */
	A(1,0,0),	/* SHOSTENT */
	A(0,0,0),	/* EHOSTENT */
	A(1,1,0),	/* GSBYNAME */
	A(1,1,0),	/* GSBYPORT */
	A(0,0,0),	/* GSERVENT */
	A(1,0,0),	/* SSERVENT */
	A(0,0,0),	/* ESERVENT */
	A(1,0,0),	/* GPBYNAME */
	A(1,0,0),	/* GPBYNUMBER */
	A(0,0,0),	/* GPROTOENT */
	A(1,0,0),	/* SPROTOENT */
	A(0,0,0),	/* EPROTOENT */
	A(1,0,0),	/* GNBYNAME */
	A(1,1,0),	/* GNBYADDR */
	A(0,0,0),	/* GNETENT */
	A(1,0,0),	/* SNETENT */
	A(0,0,0),	/* ENETENT */
	A(1,1,1),	/* VEC */
	A(0,3,0),	/* GREP */
	A(1,0,0),	/* GPWNAM */
	A(1,0,0),	/* GPWUID */
	A(0,0,0),	/* GPWENT */
	A(0,0,0),	/* SPWENT */
	A(0,0,0),	/* EPWENT */
	A(1,0,0),	/* GGRNAM */
	A(1,0,0),	/* GGRGID */
	A(0,0,0),	/* GGRENT */
	A(0,0,0),	/* SGRENT */
	A(0,0,0),	/* EGRENT */
	A(1,1,0),	/* SHUTDOWN */
	A(1,1,0),	/* OPENDIR */
	A(1,0,0),	/* READDIR */
	A(1,0,0),	/* TELLDIR */
	A(1,1,0),	/* SEEKDIR */
	A(1,0,0),	/* REWINDDIR */
	A(1,0,0),	/* CLOSEDIR */
	A(0,0,0),	/* GETLOGIN */
	A(1,3,0),	/* SYSCALL */
	A(1,1,1),	/* GSOCKOPT */
	A(1,1,1),	/* SSOCKOPT */
	A(1,0,0),	/* GETSOCKNAME */
	A(1,0,0),	/* GETPEERNAME */
	A(0,3,3),	/* LSLICE */
	A(0,3,1),	/* SPLICE */
	A(1,0,0),	/* BINMODE */
	A(1,0,0),	/* REQUIRE */
	A(1,1,0),	/* TRUNCATE */
	A(1,1,0),	/* MSGGET */
	A(1,1,1),	/* MSGCTL */
	A(1,1,1),	/* MSGSND */
	A5(1,1,1,1,1),	/* MSGRCV */
	A(1,1,1),	/* SEMGET */
	A5(1,1,1,1,0),	/* SEMCTL */
	A(1,1,1),	/* SEMOP */
	A(1,1,1),	/* SHMGET */
	A(1,1,1),	/* SHMCTL */
	A5(1,1,1,1,0),	/* SHMREAD */
	A5(1,1,1,1,0),	/* SHMWRITE */
	A(1,1,0),	/* NCMP */
	A(1,1,0),	/* SCMP */
	A(1,0,0),	/* CALLER */
	A(1,0,0),	/* SCALAR */
	A(1,1,3),	/* SYSREAD */
	A(1,1,3),	/* SYSWRITE */
	A(1,0,0),	/* FTMTIME */
	A(1,0,0),	/* FTATIME */
	A(1,0,0),	/* FTCTIME */
	A(1,1,0),	/* WAITPID */
	0
};
#undef A
#undef A5
#endif

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();
int do_slice();