perl 4.0 patch 14: patch #11, continued
[p5sagit/p5-mst-13.2.git] / arg.h
diff --git a/arg.h b/arg.h
index 2e1bd8a..ee5aade 100644 (file)
--- a/arg.h
+++ b/arg.h
-/* $Header: arg.h,v 1.0 87/12/18 13:04:39 root Exp $
+/* $RCSfile: arg.h,v $$Revision: 4.0.1.1 $$Date: 91/06/07 10:18:30 $
+ *
+ *    Copyright (c) 1991, Larry Wall
+ *
+ *    You may distribute under the terms of either the GNU General Public
+ *    License or the Artistic License, as specified in the README file.
  *
  * $Log:       arg.h,v $
- * Revision 1.0  87/12/18  13:04:39  root
- * Initial revision
+ * Revision 4.0.1.1  91/06/07  10:18:30  lwall
+ * patch4: length($`), length($&), length($') now optimized to avoid string copy
+ * patch4: new copyright notice
+ * patch4: many, many itty-bitty portability fixes
+ * 
+ * Revision 4.0  91/03/20  01:03:09  lwall
+ * 4.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 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 MAXO 105
+#define O_RCAT 1
+#define O_ITEM 2
+#define O_SCALAR 3
+#define O_ITEM2 4
+#define O_ITEM3 5
+#define O_CONCAT 6
+#define O_REPEAT 7
+#define O_MATCH 8
+#define O_NMATCH 9
+#define O_SUBST 10
+#define O_NSUBST 11
+#define O_ASSIGN 12
+#define O_LOCAL 13
+#define O_AASSIGN 14
+#define O_SASSIGN 15
+#define O_CHOP 16
+#define O_DEFINED 17
+#define O_UNDEF 18
+#define O_STUDY 19
+#define O_POW 20
+#define O_MULTIPLY 21
+#define O_DIVIDE 22
+#define O_MODULO 23
+#define O_ADD 24
+#define O_SUBTRACT 25
+#define O_LEFT_SHIFT 26
+#define O_RIGHT_SHIFT 27
+#define O_LT 28
+#define O_GT 29
+#define O_LE 30
+#define O_GE 31
+#define O_EQ 32
+#define O_NE 33
+#define O_NCMP 34
+#define O_BIT_AND 35
+#define O_XOR 36
+#define O_BIT_OR 37
+#define O_AND 38
+#define O_OR 39
+#define O_COND_EXPR 40
+#define O_COMMA 41
+#define O_NEGATE 42
+#define O_NOT 43
+#define O_COMPLEMENT 44
+#define O_SELECT 45
+#define O_WRITE 46
+#define O_DBMOPEN 47
+#define O_DBMCLOSE 48
+#define O_OPEN 49
+#define O_TRANS 50
+#define O_NTRANS 51
+#define O_CLOSE 52
+#define O_EACH 53
+#define O_VALUES 54
+#define O_KEYS 55
+#define O_LARRAY 56
+#define O_ARRAY 57
+#define O_AELEM 58
+#define O_DELETE 59
+#define O_LHASH 60
+#define O_HASH 61
+#define O_HELEM 62
+#define O_LAELEM 63
+#define O_LHELEM 64
+#define O_LSLICE 65
+#define O_ASLICE 66
+#define O_HSLICE 67
+#define O_LASLICE 68
+#define O_LHSLICE 69
+#define O_SPLICE 70
+#define O_PUSH 71
+#define O_POP 72
+#define O_SHIFT 73
+#define O_UNPACK 74
+#define O_SPLIT 75
+#define O_LENGTH 76
+#define O_SPRINTF 77
+#define O_SUBSTR 78
+#define O_PACK 79
+#define O_GREP 80
+#define O_JOIN 81
+#define O_SLT 82
+#define O_SGT 83
+#define O_SLE 84
+#define O_SGE 85
+#define O_SEQ 86
+#define O_SNE 87
+#define O_SCMP 88
+#define O_SUBR 89
+#define O_DBSUBR 90
+#define O_CALLER 91
+#define O_SORT 92
+#define O_REVERSE 93
+#define O_WARN 94
+#define O_DIE 95
+#define O_PRTF 96
+#define O_PRINT 97
+#define O_CHDIR 98
+#define O_EXIT 99
+#define O_RESET 100
+#define O_LIST 101
+#define O_EOF 102
+#define O_GETC 103
+#define O_TELL 104
+#define O_RECV 105
+#define O_READ 106
+#define O_SYSREAD 107
+#define O_SYSWRITE 108
+#define O_SEND 109
+#define O_SEEK 110
+#define O_RETURN 111
+#define O_REDO 112
+#define O_NEXT 113
+#define O_LAST 114
+#define O_DUMP 115
+#define O_GOTO 116
+#define O_INDEX 117
+#define O_RINDEX 118
+#define O_TIME 119
+#define O_TMS 120
+#define O_LOCALTIME 121
+#define O_GMTIME 122
+#define O_TRUNCATE 123
+#define O_LSTAT 124
+#define O_STAT 125
+#define O_CRYPT 126
+#define O_ATAN2 127
+#define O_SIN 128
+#define O_COS 129
+#define O_RAND 130
+#define O_SRAND 131
+#define O_EXP 132
+#define O_LOG 133
+#define O_SQRT 134
+#define O_INT 135
+#define O_ORD 136
+#define O_ALARM 137
+#define O_SLEEP 138
+#define O_RANGE 139
+#define O_F_OR_R 140
+#define O_FLIP 141
+#define O_FLOP 142
+#define O_FORK 143
+#define O_WAIT 144
+#define O_WAITPID 145
+#define O_SYSTEM 146
+#define O_EXEC_OP 147
+#define O_HEX 148
+#define O_OCT 149
+#define O_CHOWN 150
+#define O_KILL 151
+#define O_UNLINK 152
+#define O_CHMOD 153
+#define O_UTIME 154
+#define O_UMASK 155
+#define O_MSGGET 156
+#define O_SHMGET 157
+#define O_SEMGET 158
+#define O_MSGCTL 159
+#define O_SHMCTL 160
+#define O_SEMCTL 161
+#define O_MSGSND 162
+#define O_MSGRCV 163
+#define O_SEMOP 164
+#define O_SHMREAD 165
+#define O_SHMWRITE 166
+#define O_RENAME 167
+#define O_LINK 168
+#define O_MKDIR 169
+#define O_RMDIR 170
+#define O_GETPPID 171
+#define O_GETPGRP 172
+#define O_SETPGRP 173
+#define O_GETPRIORITY 174
+#define O_SETPRIORITY 175
+#define O_CHROOT 176
+#define O_FCNTL 177
+#define O_IOCTL 178
+#define O_FLOCK 179
+#define O_UNSHIFT 180
+#define O_REQUIRE 181
+#define O_DOFILE 182
+#define O_EVAL 183
+#define O_FTRREAD 184
+#define O_FTRWRITE 185
+#define O_FTREXEC 186
+#define O_FTEREAD 187
+#define O_FTEWRITE 188
+#define O_FTEEXEC 189
+#define O_FTIS 190
+#define O_FTEOWNED 191
+#define O_FTROWNED 192
+#define O_FTZERO 193
+#define O_FTSIZE 194
+#define O_FTMTIME 195
+#define O_FTATIME 196
+#define O_FTCTIME 197
+#define O_FTSOCK 198
+#define O_FTCHR 199
+#define O_FTBLK 200
+#define O_FTFILE 201
+#define O_FTDIR 202
+#define O_FTPIPE 203
+#define O_FTLINK 204
+#define O_SYMLINK 205
+#define O_READLINK 206
+#define O_FTSUID 207
+#define O_FTSGID 208
+#define O_FTSVTX 209
+#define O_FTTTY 210
+#define O_FTTEXT 211
+#define O_FTBINARY 212
+#define O_SOCKET 213
+#define O_BIND 214
+#define O_CONNECT 215
+#define O_LISTEN 216
+#define O_ACCEPT 217
+#define O_GHBYNAME 218
+#define O_GHBYADDR 219
+#define O_GHOSTENT 220
+#define O_GNBYNAME 221
+#define O_GNBYADDR 222
+#define O_GNETENT 223
+#define O_GPBYNAME 224
+#define O_GPBYNUMBER 225
+#define O_GPROTOENT 226
+#define O_GSBYNAME 227
+#define O_GSBYPORT 228
+#define O_GSERVENT 229
+#define O_SHOSTENT 230
+#define O_SNETENT 231
+#define O_SPROTOENT 232
+#define O_SSERVENT 233
+#define O_EHOSTENT 234
+#define O_ENETENT 235
+#define O_EPROTOENT 236
+#define O_ESERVENT 237
+#define O_SOCKPAIR 238
+#define O_SHUTDOWN 239
+#define O_GSOCKOPT 240
+#define O_SSOCKOPT 241
+#define O_GETSOCKNAME 242
+#define O_GETPEERNAME 243
+#define O_SSELECT 244
+#define O_FILENO 245
+#define O_BINMODE 246
+#define O_VEC 247
+#define O_GPWNAM 248
+#define O_GPWUID 249
+#define O_GPWENT 250
+#define O_SPWENT 251
+#define O_EPWENT 252
+#define O_GGRNAM 253
+#define O_GGRGID 254
+#define O_GGRENT 255
+#define O_SGRENT 256
+#define O_EGRENT 257
+#define O_GETLOGIN 258
+#define O_OPEN_DIR 259
+#define O_READDIR 260
+#define O_TELLDIR 261
+#define O_SEEKDIR 262
+#define O_REWINDDIR 263
+#define O_CLOSEDIR 264
+#define O_SYSCALL 265
+#define O_PIPE 266
+#define MAXO 267
 
 #ifndef DOINIT
 extern char *opname[];
 #else
 char *opname[] = {
     "NULL",
+    "RCAT",
     "ITEM",
+    "SCALAR",
     "ITEM2",
     "ITEM3",
     "CONCAT",
+    "REPEAT",
     "MATCH",
     "NMATCH",
     "SUBST",
     "NSUBST",
     "ASSIGN",
+    "LOCAL",
+    "AASSIGN",
+    "SASSIGN",
+    "CHOP",
+    "DEFINED",
+    "UNDEF",
+    "STUDY",
+    "POW",
     "MULTIPLY",
     "DIVIDE",
     "MODULO",
@@ -140,6 +323,7 @@ char *opname[] = {
     "GE",
     "EQ",
     "NE",
+    "NCMP",
     "BIT_AND",
     "XOR",
     "BIT_OR",
@@ -150,22 +334,42 @@ char *opname[] = {
     "NEGATE",
     "NOT",
     "COMPLEMENT",
+    "SELECT",
     "WRITE",
+    "DBMOPEN",
+    "DBMCLOSE",
     "OPEN",
     "TRANS",
     "NTRANS",
     "CLOSE",
-    "ARRAY",
-    "HASH",
+    "EACH",
+    "VALUES",
+    "KEYS",
     "LARRAY",
+    "ARRAY",
+    "AELEM",
+    "DELETE",
     "LHASH",
+    "HASH",
+    "HELEM",
+    "LAELEM",
+    "LHELEM",
+    "LSLICE",
+    "ASLICE",
+    "HSLICE",
+    "LASLICE",
+    "LHSLICE",
+    "SPLICE",
     "PUSH",
     "POP",
     "SHIFT",
+    "UNPACK",
     "SPLIT",
     "LENGTH",
     "SPRINTF",
     "SUBSTR",
+    "PACK",
+    "GREP",
     "JOIN",
     "SLT",
     "SGT",
@@ -173,56 +377,186 @@ char *opname[] = {
     "SGE",
     "SEQ",
     "SNE",
+    "SCMP",
     "SUBR",
+    "DBSUBR",
+    "CALLER",
+    "SORT",
+    "REVERSE",
+    "WARN",
+    "DIE",
+    "PRINTF",
     "PRINT",
     "CHDIR",
-    "DIE",
     "EXIT",
     "RESET",
     "LIST",
-    "SELECT",
     "EOF",
+    "GETC",
     "TELL",
+    "RECV",
+    "READ",
+    "SYSREAD",
+    "SYSWRITE",
+    "SEND",
     "SEEK",
-    "LAST",
-    "NEXT",
+    "RETURN",
     "REDO",
+    "NEXT",
+    "LAST",
+    "DUMP",
     "GOTO",/* shudder */
     "INDEX",
+    "RINDEX",
     "TIME",
     "TIMES",
     "LOCALTIME",
     "GMTIME",
+    "TRUNCATE",
+    "LSTAT",
     "STAT",
     "CRYPT",
+    "ATAN2",
+    "SIN",
+    "COS",
+    "RAND",
+    "SRAND",
     "EXP",
     "LOG",
     "SQRT",
     "INT",
-    "PRINTF",
     "ORD",
+    "ALARM",
     "SLEEP",
+    "RANGE",
+    "FLIP_OR_RANGE",
     "FLIP",
     "FLOP",
-    "KEYS",
-    "VALUES",
-    "EACH",
-    "CHOP",
     "FORK",
-    "EXEC",
+    "WAIT",
+    "WAITPID",
     "SYSTEM",
-    "OCT",
+    "EXEC",
     "HEX",
-    "CHMOD",
+    "OCT",
     "CHOWN",
     "KILL",
-    "RENAME",
     "UNLINK",
+    "CHMOD",
+    "UTIME",
     "UMASK",
-    "UNSHIFT",
+    "MSGGET",
+    "SHMGET",
+    "SEMGET",
+    "MSGCTL",
+    "SHMCTL",
+    "SEMCTL",
+    "MSGSND",
+    "MSGRCV",
+    "SEMOP",
+    "SHMREAD",
+    "SHMWRITE",
+    "RENAME",
     "LINK",
-    "REPEAT",
-    "105"
+    "MKDIR",
+    "RMDIR",
+    "GETPPID",
+    "GETPGRP",
+    "SETPGRP",
+    "GETPRIORITY",
+    "SETPRIORITY",
+    "CHROOT",
+    "FCNTL",
+    "SYSIOCTL",
+    "FLOCK",
+    "UNSHIFT",
+    "REQUIRE",
+    "DOFILE",
+    "EVAL",
+    "FTRREAD",
+    "FTRWRITE",
+    "FTREXEC",
+    "FTEREAD",
+    "FTEWRITE",
+    "FTEEXEC",
+    "FTIS",
+    "FTEOWNED",
+    "FTROWNED",
+    "FTZERO",
+    "FTSIZE",
+    "FTMTIME",
+    "FTATIME",
+    "FTCTIME",
+    "FTSOCK",
+    "FTCHR",
+    "FTBLK",
+    "FTFILE",
+    "FTDIR",
+    "FTPIPE",
+    "FTLINK",
+    "SYMLINK",
+    "READLINK",
+    "FTSUID",
+    "FTSGID",
+    "FTSVTX",
+    "FTTTY",
+    "FTTEXT",
+    "FTBINARY",
+    "SOCKET",
+    "BIND",
+    "CONNECT",
+    "LISTEN",
+    "ACCEPT",
+    "GHBYNAME",
+    "GHBYADDR",
+    "GHOSTENT",
+    "GNBYNAME",
+    "GNBYADDR",
+    "GNETENT",
+    "GPBYNAME",
+    "GPBYNUMBER",
+    "GPROTOENT",
+    "GSBYNAME",
+    "GSBYPORT",
+    "GSERVENT",
+    "SHOSTENT",
+    "SNETENT",
+    "SPROTOENT",
+    "SSERVENT",
+    "EHOSTENT",
+    "ENETENT",
+    "EPROTOENT",
+    "ESERVENT",
+    "SOCKPAIR",
+    "SHUTDOWN",
+    "GSOCKOPT",
+    "SSOCKOPT",
+    "GETSOCKNAME",
+    "GETPEERNAME",
+    "SSELECT",
+    "FILENO",
+    "BINMODE",
+    "VEC",
+    "GPWNAM",
+    "GPWUID",
+    "GPWENT",
+    "SPWENT",
+    "EPWENT",
+    "GGRNAM",
+    "GGRGID",
+    "GGRENT",
+    "SGRENT",
+    "EGRENT",
+    "GETLOGIN",
+    "OPENDIR",
+    "READDIR",
+    "TELLDIR",
+    "SEEKDIR",
+    "REWINDDIR",
+    "CLOSEDIR",
+    "SYSCALL",
+    "PIPE",
+    "267"
 };
 #endif
 
@@ -238,7 +572,19 @@ char *opname[] = {
 #define A_SPAT 9
 #define A_LEXPR 10
 #define A_ARYLEN 11
-#define A_NUMBER 12
+#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_LENSTAB 21
+
+#define A_MASK 31
+#define A_DONT 32              /* or this into type to suppress evaluation */
 
 #ifndef DOINIT
 extern char *argname[];
@@ -256,39 +602,75 @@ char *argname[] = {
     "SPAT",
     "LEXPR",
     "ARYLEN",
-    "NUMBER",
-    "13"
+    "ARYSTAB",
+    "LARYLEN",
+    "GLOB",
+    "WORD",
+    "INDREAD",
+    "LARYSTAB",
+    "STAR",
+    "LSTAR",
+    "WANTARRAY",
+    "LENSTAB",
+    "22"
 };
 #endif
 
 #ifndef DOINIT
 extern bool hoistable[];
 #else
-bool hoistable[] = {0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0};
+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,  /* LENSTAB */
+   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     *arg_arg;
-       char    *arg_cval;
-       STAB    *arg_stab;
-       SPAT    *arg_spat;
-       CMD     *arg_cmd;
-       STR     *arg_str;
-       double  arg_nval;
-    } arg_ptr;
+    union argptr arg_ptr;
     short      arg_len;
-    char       arg_type;
-    char       arg_flags;
+    unsigned short arg_type;
+    unsigned short arg_flags;
 };
 
-#define AF_SPECIAL 1           /* op wants to evaluate this arg itself */
+#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_NUMERIC 32          /* return as numeric rather than string */
+#define AF_DEPR 32             /* an older form of the construct */
 #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
@@ -296,13 +678,290 @@ struct arg {
  * 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
+ * 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*)
 
-EXT char opargs[MAXO];
+#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,1,0),       /* RCAT */
+       A(1,0,0),       /* ITEM */
+       A(1,0,0),       /* SCALAR */
+       A(0,0,0),       /* ITEM2 */
+       A(0,0,0),       /* ITEM3 */
+       A(1,1,0),       /* CONCAT */
+       A(3,1,0),       /* REPEAT */
+       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,0,0),       /* LOCAL */
+       A(3,3,0),       /* AASSIGN */
+       A(0,0,0),       /* SASSIGN */
+       A(3,0,0),       /* CHOP */
+       A(1,0,0),       /* DEFINED */
+       A(1,0,0),       /* UNDEF */
+       A(1,0,0),       /* STUDY */
+       A(1,1,0),       /* POW */
+       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),       /* NCMP */
+       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),       /* SELECT */
+       A(1,0,0),       /* WRITE */
+       A(1,1,1),       /* DBMOPEN */
+       A(1,0,0),       /* DBMCLOSE */
+       A(1,1,0),       /* OPEN */
+       A(1,0,0),       /* TRANS */
+       A(1,0,0),       /* NTRANS */
+       A(1,0,0),       /* CLOSE */
+       A(0,0,0),       /* EACH */
+       A(0,0,0),       /* VALUES */
+       A(0,0,0),       /* KEYS */
+       A(0,0,0),       /* LARRAY */
+       A(0,0,0),       /* ARRAY */
+       A(0,1,0),       /* AELEM */
+       A(0,1,0),       /* DELETE */
+       A(0,0,0),       /* LHASH */
+       A(0,0,0),       /* HASH */
+       A(0,1,0),       /* HELEM */
+       A(0,1,0),       /* LAELEM */
+       A(0,1,0),       /* LHELEM */
+       A(0,3,3),       /* LSLICE */
+       A(0,3,0),       /* ASLICE */
+       A(0,3,0),       /* HSLICE */
+       A(0,3,0),       /* LASLICE */
+       A(0,3,0),       /* LHSLICE */
+       A(0,3,1),       /* SPLICE */
+       A(0,3,0),       /* PUSH */
+       A(0,0,0),       /* POP */
+       A(0,0,0),       /* SHIFT */
+       A(1,1,0),       /* UNPACK */
+       A(1,0,1),       /* SPLIT */
+       A(1,0,0),       /* LENGTH */
+       A(3,0,0),       /* SPRINTF */
+       A(1,1,1),       /* SUBSTR */
+       A(1,3,0),       /* PACK */
+       A(0,3,0),       /* GREP */
+       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(1,1,0),       /* SCMP */
+       A(0,3,0),       /* SUBR */
+       A(0,3,0),       /* DBSUBR */
+       A(1,0,0),       /* CALLER */
+       A(1,3,0),       /* SORT */
+       A(0,3,0),       /* REVERSE */
+       A(0,3,0),       /* WARN */
+       A(0,3,0),       /* DIE */
+       A(1,3,0),       /* PRINTF */
+       A(1,3,0),       /* PRINT */
+       A(1,0,0),       /* CHDIR */
+       A(1,0,0),       /* EXIT */
+       A(1,0,0),       /* RESET */
+       A(3,0,0),       /* LIST */
+       A(1,0,0),       /* EOF */
+       A(1,0,0),       /* GETC */
+       A(1,0,0),       /* TELL */
+       A5(1,1,1,1,0),  /* RECV */
+       A(1,1,3),       /* READ */
+       A(1,1,3),       /* SYSREAD */
+       A(1,1,3),       /* SYSWRITE */
+       A(1,1,3),       /* SEND */
+       A(1,1,1),       /* SEEK */
+       A(0,3,0),       /* RETURN */
+       A(0,0,0),       /* REDO */
+       A(0,0,0),       /* NEXT */
+       A(0,0,0),       /* LAST */
+       A(0,0,0),       /* DUMP */
+       A(0,0,0),       /* GOTO */
+       A(1,1,1),       /* INDEX */
+       A(1,1,1),       /* RINDEX */
+       A(0,0,0),       /* TIME */
+       A(0,0,0),       /* TIMES */
+       A(1,0,0),       /* LOCALTIME */
+       A(1,0,0),       /* GMTIME */
+       A(1,1,0),       /* TRUNCATE */
+       A(1,0,0),       /* LSTAT */
+       A(1,0,0),       /* STAT */
+       A(1,1,0),       /* CRYPT */
+       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,0,0),       /* EXP */
+       A(1,0,0),       /* LOG */
+       A(1,0,0),       /* SQRT */
+       A(1,0,0),       /* INT */
+       A(1,0,0),       /* ORD */
+       A(1,0,0),       /* ALARM */
+       A(1,0,0),       /* SLEEP */
+       A(1,1,0),       /* RANGE */
+       A(1,0,0),       /* F_OR_R */
+       A(1,0,0),       /* FLIP */
+       A(0,1,0),       /* FLOP */
+       A(0,0,0),       /* FORK */
+       A(0,0,0),       /* WAIT */
+       A(1,1,0),       /* WAITPID */
+       A(1,3,0),       /* SYSTEM */
+       A(1,3,0),       /* EXEC */
+       A(1,0,0),       /* HEX */
+       A(1,0,0),       /* OCT */
+       A(0,3,0),       /* CHOWN */
+       A(0,3,0),       /* KILL */
+       A(0,3,0),       /* UNLINK */
+       A(0,3,0),       /* CHMOD */
+       A(0,3,0),       /* UTIME */
+       A(1,0,0),       /* UMASK */
+       A(1,1,0),       /* MSGGET */
+       A(1,1,1),       /* SHMGET */
+       A(1,1,1),       /* SEMGET */
+       A(1,1,1),       /* MSGCTL */
+       A(1,1,1),       /* SHMCTL */
+       A5(1,1,1,1,0),  /* SEMCTL */
+       A(1,1,1),       /* MSGSND */
+       A5(1,1,1,1,1),  /* MSGRCV */
+       A(1,1,1),       /* SEMOP */
+       A5(1,1,1,1,0),  /* SHMREAD */
+       A5(1,1,1,1,0),  /* SHMWRITE */
+       A(1,1,0),       /* RENAME */
+       A(1,1,0),       /* LINK */
+       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),       /* FCNTL */
+       A(1,1,1),       /* SYSIOCTL */
+       A(1,1,0),       /* FLOCK */
+       A(0,3,0),       /* UNSHIFT */
+       A(1,0,0),       /* REQUIRE */
+       A(1,0,0),       /* DOFILE */
+       A(1,0,0),       /* EVAL */
+       A(1,0,0),       /* FTRREAD */
+       A(1,0,0),       /* FTRWRITE */
+       A(1,0,0),       /* FTREXEC */
+       A(1,0,0),       /* FTEREAD */
+       A(1,0,0),       /* FTEWRITE */
+       A(1,0,0),       /* FTEEXEC */
+       A(1,0,0),       /* FTIS */
+       A(1,0,0),       /* FTEOWNED */
+       A(1,0,0),       /* FTROWNED */
+       A(1,0,0),       /* FTZERO */
+       A(1,0,0),       /* FTSIZE */
+       A(1,0,0),       /* FTMTIME */
+       A(1,0,0),       /* FTATIME */
+       A(1,0,0),       /* FTCTIME */
+       A(1,0,0),       /* FTSOCK */
+       A(1,0,0),       /* FTCHR */
+       A(1,0,0),       /* FTBLK */
+       A(1,0,0),       /* FTFILE */
+       A(1,0,0),       /* FTDIR */
+       A(1,0,0),       /* FTPIPE */
+       A(1,0,0),       /* FTLINK */
+       A(1,1,0),       /* SYMLINK */
+       A(1,0,0),       /* READLINK */
+       A(1,0,0),       /* FTSUID */
+       A(1,0,0),       /* FTSGID */
+       A(1,0,0),       /* FTSVTX */
+       A(1,0,0),       /* FTTTY */
+       A(1,0,0),       /* FTTEXT */
+       A(1,0,0),       /* FTBINARY */
+       A5(1,1,1,1,0),  /* SOCKET */
+       A(1,1,0),       /* BIND */
+       A(1,1,0),       /* CONNECT */
+       A(1,1,0),       /* LISTEN */
+       A(1,1,0),       /* ACCEPT */
+       A(1,0,0),       /* GHBYNAME */
+       A(1,1,0),       /* GHBYADDR */
+       A(0,0,0),       /* GHOSTENT */
+       A(1,0,0),       /* GNBYNAME */
+       A(1,1,0),       /* GNBYADDR */
+       A(0,0,0),       /* GNETENT */
+       A(1,0,0),       /* GPBYNAME */
+       A(1,0,0),       /* GPBYNUMBER */
+       A(0,0,0),       /* GPROTOENT */
+       A(1,1,0),       /* GSBYNAME */
+       A(1,1,0),       /* GSBYPORT */
+       A(0,0,0),       /* GSERVENT */
+       A(1,0,0),       /* SHOSTENT */
+       A(1,0,0),       /* SNETENT */
+       A(1,0,0),       /* SPROTOENT */
+       A(1,0,0),       /* SSERVENT */
+       A(0,0,0),       /* EHOSTENT */
+       A(0,0,0),       /* ENETENT */
+       A(0,0,0),       /* EPROTOENT */
+       A(0,0,0),       /* ESERVENT */
+       A5(1,1,1,1,1),  /* SOCKPAIR */
+       A(1,1,0),       /* SHUTDOWN */
+       A(1,1,1),       /* GSOCKOPT */
+       A5(1,1,1,1,0),  /* SSOCKOPT */
+       A(1,0,0),       /* GETSOCKNAME */
+       A(1,0,0),       /* GETPEERNAME */
+       A5(1,1,1,1,0),  /* SSELECT */
+       A(1,0,0),       /* FILENO */
+       A(1,0,0),       /* BINMODE */
+       A(1,1,1),       /* VEC */
+       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(0,0,0),       /* GETLOGIN */
+       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(1,3,0),       /* SYSCALL */
+       A(1,1,0),       /* PIPE */
+       0
+};
+#undef A
+#undef A5
+#endif
 
 int do_trans();
 int do_split();
@@ -312,3 +971,7 @@ bool do_seek();
 int do_tms();
 int do_time();
 int do_stat();
+STR *do_push();
+FILE *nextargv();
+STR *do_fttext();
+int do_slice();