home *** CD-ROM | disk | FTP | other *** search
/ ftp.muug.mb.ca / 2014.06.ftp.muug.mb.ca.tar / ftp.muug.mb.ca / pub / src / perl / arg.h next >
C/C++ Source or Header  |  1992-04-11  |  19KB  |  988 lines

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