1 /* $Header: arg.h,v 3.0.1.8 90/11/10 01:04:36 lwall Locked $
3 * Copyright (c) 1989, Larry Wall
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.
9 * Revision 3.0.1.8 90/11/10 01:04:36 lwall
10 * patch38: added alarm function
11 * patch38: socket, recv, select, socketpair, setsockopt didn't eval all args
13 * Revision 3.0.1.7 90/10/15 14:53:59 lwall
14 * patch29: added SysV IPC
15 * patch29: added waitpid
16 * patch29: added cmp and <=>
17 * patch29: added caller
18 * patch29: added scalar
19 * patch29: added sysread and syswrite
20 * patch29: added -M, -A and -C
21 * patch29: index and substr now have optional 3rd args
22 * patch29: you can now read into the middle string
23 * patch29: various portability fixes
25 * Revision 3.0.1.6 90/08/09 02:25:14 lwall
26 * patch19: added require operator
27 * patch19: added truncate operator
29 * Revision 3.0.1.5 90/03/27 15:29:41 lwall
30 * patch16: MSDOS support
32 * Revision 3.0.1.4 90/03/12 16:18:21 lwall
33 * patch13: added list slice operator (LIST)[LIST]
34 * patch13: added splice operator: @oldelems = splice(@array,$offset,$len,LIST)
36 * Revision 3.0.1.3 90/02/28 16:21:55 lwall
37 * patch9: added pipe function
39 * Revision 3.0.1.2 89/12/21 19:13:14 lwall
40 * patch7: send() didn't allow a TO argument
42 * Revision 3.0.1.1 89/10/26 23:02:35 lwall
43 * patch1: reverse didn't work
45 * Revision 3.0 89/10/18 15:08:27 lwall
65 #define O_LEFT_SHIFT 15
66 #define O_RIGHT_SHIFT 16
78 #define O_COND_EXPR 28
82 #define O_COMPLEMENT 32
124 #define O_LOCALTIME 74
152 #define O_UNSHIFT 102
156 #define O_FTEREAD 106
157 #define O_FTEWRITE 107
158 #define O_FTEEXEC 108
159 #define O_FTEOWNED 109
160 #define O_FTRREAD 110
161 #define O_FTRWRITE 111
162 #define O_FTREXEC 112
163 #define O_FTROWNED 113
170 #define O_SYMLINK 120
181 #define O_FTBINARY 131
197 #define O_GETPPID 147
198 #define O_GETPGRP 148
199 #define O_SETPGRP 149
200 #define O_GETPRIORITY 150
201 #define O_SETPRIORITY 151
211 #define O_DBMOPEN 161
212 #define O_DBMCLOSE 162
215 #define O_LASLICE 165
216 #define O_LHSLICE 166
220 #define O_AASSIGN 170
221 #define O_SASSIGN 171
223 #define O_REVERSE 173
227 #define O_CONNECT 177
232 #define O_SSELECT 182
233 #define O_SOCKPAIR 183
235 #define O_DEFINED 185
237 #define O_READLINK 187
246 #define O_GHBYNAME 196
247 #define O_GHBYADDR 197
248 #define O_GHOSTENT 198
249 #define O_SHOSTENT 199
250 #define O_EHOSTENT 200
251 #define O_GSBYNAME 201
252 #define O_GSBYPORT 202
253 #define O_GSERVENT 203
254 #define O_SSERVENT 204
255 #define O_ESERVENT 205
256 #define O_GPBYNAME 206
257 #define O_GPBYNUMBER 207
258 #define O_GPROTOENT 208
259 #define O_SPROTOENT 209
260 #define O_EPROTOENT 210
261 #define O_GNBYNAME 211
262 #define O_GNBYADDR 212
263 #define O_GNETENT 213
264 #define O_SNETENT 214
265 #define O_ENETENT 215
278 #define O_SHUTDOWN 228
279 #define O_OPENDIR 229
280 #define O_READDIR 230
281 #define O_TELLDIR 231
282 #define O_SEEKDIR 232
283 #define O_REWINDDIR 233
284 #define O_CLOSEDIR 234
285 #define O_GETLOGIN 235
286 #define O_SYSCALL 236
287 #define O_GSOCKOPT 237
288 #define O_SSOCKOPT 238
289 #define O_GETSOCKNAME 239
290 #define O_GETPEERNAME 240
293 #define O_BINMODE 243
294 #define O_REQUIRE 244
295 #define O_TRUNCATE 245
305 #define O_SHMREAD 255
306 #define O_SHMWRITE 256
311 #define O_SYSREAD 261
312 #define O_SYSWRITE 262
313 #define O_FTMTIME 263
314 #define O_FTATIME 264
315 #define O_FTCTIME 265
316 #define O_WAITPID 266
321 extern char *opname[];
613 #define A_LARYSTAB 17
616 #define A_WANTARRAY 20
619 #define A_DONT 32 /* or this into type to suppress evaluation */
622 extern char *argname[];
651 extern bool hoistable[];
690 union argptr arg_ptr;
692 unsigned short arg_type;
693 unsigned short arg_flags;
696 #define AF_ARYOK 1 /* op can handle multiple values here */
697 #define AF_POST 2 /* post *crement this item */
698 #define AF_PRE 4 /* pre *crement this item */
699 #define AF_UP 8 /* increment rather than decrement */
700 #define AF_COMMON 16 /* left and right have symbols in common */
701 #define AF_UNUSED 32 /* */
702 #define AF_LISTISH 64 /* turn into list if important */
703 #define AF_LOCAL 128 /* list of local variables */
706 * Most of the ARG pointers are used as pointers to arrays of ARG. When
707 * so used, the 0th element is special, and represents the operator to
708 * use on the list of arguments following. The arg_len in the 0th element
709 * gives the maximum argument number, and the arg_str is used to store
710 * the return value in a more-or-less static location. Sorry it's not
711 * re-entrant (yet), but it sure makes it efficient. The arg_type of the
712 * 0th element is an operator (O_*) rather than an argument type (A_*).
715 #define Nullarg Null(ARG*)
718 EXT unsigned short opargs[MAXO+1];
720 #define A(e1,e2,e3) (e1+(e2<<2)+(e3<<4))
721 #define A5(e1,e2,e3,e4,e5) (e1+(e2<<2)+(e3<<4)+(e4<<6)+(e5<<8))
722 unsigned short opargs[MAXO+1] = {
725 A(0,0,0), /* ITEM2 */
726 A(0,0,0), /* ITEM3 */
727 A(1,1,0), /* CONCAT */
728 A(1,0,0), /* MATCH */
729 A(1,0,0), /* NMATCH */
730 A(1,0,0), /* SUBST */
731 A(1,0,0), /* NSUBST */
732 A(1,1,0), /* ASSIGN */
733 A(1,1,0), /* MULTIPLY */
734 A(1,1,0), /* DIVIDE */
735 A(1,1,0), /* MODULO */
737 A(1,1,0), /* SUBTRACT */
738 A(1,1,0), /* LEFT_SHIFT */
739 A(1,1,0), /* RIGHT_SHIFT */
746 A(1,1,0), /* BIT_AND */
748 A(1,1,0), /* BIT_OR */
751 A(1,0,0), /* COND_EXPR */
752 A(1,1,0), /* COMMA */
753 A(1,0,0), /* NEGATE */
755 A(1,0,0), /* COMPLEMENT */
756 A(1,0,0), /* WRITE */
758 A(1,0,0), /* TRANS */
759 A(1,0,0), /* NTRANS */
760 A(1,0,0), /* CLOSE */
761 A(0,0,0), /* ARRAY */
763 A(0,0,0), /* LARRAY */
764 A(0,0,0), /* LHASH */
767 A(0,0,0), /* SHIFT */
768 A(1,0,1), /* SPLIT */
769 A(1,0,0), /* LENGTH */
770 A(3,0,0), /* SPRINTF */
771 A(1,1,1), /* SUBSTR */
780 A(1,3,0), /* PRINT */
781 A(1,0,0), /* CHDIR */
784 A(1,0,0), /* RESET */
786 A(1,0,0), /* SELECT */
794 A(1,1,1), /* INDEX */
796 A(0,0,0), /* TIMES */
797 A(1,0,0), /* LOCALTIME */
798 A(1,0,0), /* GMTIME */
800 A(1,1,0), /* CRYPT */
805 A(1,3,0), /* PRINTF */
807 A(1,0,0), /* SLEEP */
811 A(0,0,0), /* VALUES */
816 A(1,3,0), /* SYSTEM */
819 A(0,3,0), /* CHMOD */
820 A(0,3,0), /* CHOWN */
822 A(1,1,0), /* RENAME */
823 A(0,3,0), /* UNLINK */
824 A(1,0,0), /* UMASK */
825 A(0,3,0), /* UNSHIFT */
827 A(1,1,0), /* REPEAT */
829 A(1,0,0), /* FTEREAD */
830 A(1,0,0), /* FTEWRITE */
831 A(1,0,0), /* FTEEXEC */
832 A(1,0,0), /* FTEOWNED */
833 A(1,0,0), /* FTRREAD */
834 A(1,0,0), /* FTRWRITE */
835 A(1,0,0), /* FTREXEC */
836 A(1,0,0), /* FTROWNED */
838 A(1,0,0), /* FTZERO */
839 A(1,0,0), /* FTSIZE */
840 A(1,0,0), /* FTFILE */
841 A(1,0,0), /* FTDIR */
842 A(1,0,0), /* FTLINK */
843 A(1,1,0), /* SYMLINK */
844 A(1,0,0), /* FTPIPE */
845 A(1,0,0), /* FTSOCK */
846 A(1,0,0), /* FTBLK */
847 A(1,0,0), /* FTCHR */
848 A(1,0,0), /* FTSUID */
849 A(1,0,0), /* FTSGID */
850 A(1,0,0), /* FTSVTX */
851 A(1,0,0), /* FTTTY */
852 A(1,0,0), /* DOFILE */
853 A(1,0,0), /* FTTEXT */
854 A(1,0,0), /* FTBINARY */
855 A(0,3,0), /* UTIME */
858 A(0,1,0), /* DELETE */
859 A(1,0,0), /* STUDY */
860 A(1,1,0), /* ATAN2 */
864 A(1,0,0), /* SRAND */
866 A(0,3,0), /* RETURN */
868 A(1,1,0), /* MKDIR */
869 A(1,0,0), /* RMDIR */
870 A(0,0,0), /* GETPPID */
871 A(1,0,0), /* GETPGRP */
872 A(1,1,0), /* SETPGRP */
873 A(1,1,0), /* GETPRIORITY */
874 A(1,1,1), /* SETPRIORITY */
875 A(1,0,0), /* CHROOT */
876 A(1,1,1), /* IOCTL */
877 A(1,1,1), /* FCNTL */
878 A(1,1,0), /* FLOCK */
879 A(1,1,1), /* RINDEX */
881 A(1,1,0), /* UNPACK */
884 A(1,1,1), /* DBMOPEN */
885 A(1,0,0), /* DBMCLOSE */
886 A(0,3,0), /* ASLICE */
887 A(0,3,0), /* HSLICE */
888 A(0,3,0), /* LASLICE */
889 A(0,3,0), /* LHSLICE */
890 A(1,0,0), /* F_OR_R */
891 A(1,1,0), /* RANGE */
893 A(3,3,0), /* AASSIGN */
894 A(0,0,0), /* SASSIGN */
896 A(0,3,0), /* REVERSE */
897 A(1,0,0), /* ADDROF */
898 A5(1,1,1,1,0), /* SOCKET */
900 A(1,1,0), /* CONNECT */
901 A(1,1,0), /* LISTEN */
902 A(1,1,0), /* ACCEPT */
904 A5(1,1,1,1,0), /* RECV */
905 A5(1,1,1,1,0), /* SSELECT */
906 A5(1,1,1,1,1), /* SOCKPAIR */
907 A(0,3,0), /* DBSUBR */
908 A(1,0,0), /* DEFINED */
909 A(1,0,0), /* UNDEF */
910 A(1,0,0), /* READLINK */
911 A(1,0,0), /* LSTAT */
912 A(0,1,0), /* AELEM */
913 A(0,1,0), /* HELEM */
914 A(0,1,0), /* LAELEM */
915 A(0,1,0), /* LHELEM */
916 A(1,0,0), /* LOCAL */
918 A(1,0,0), /* FILENO */
919 A(1,0,0), /* GHBYNAME */
920 A(1,1,0), /* GHBYADDR */
921 A(0,0,0), /* GHOSTENT */
922 A(1,0,0), /* SHOSTENT */
923 A(0,0,0), /* EHOSTENT */
924 A(1,1,0), /* GSBYNAME */
925 A(1,1,0), /* GSBYPORT */
926 A(0,0,0), /* GSERVENT */
927 A(1,0,0), /* SSERVENT */
928 A(0,0,0), /* ESERVENT */
929 A(1,0,0), /* GPBYNAME */
930 A(1,0,0), /* GPBYNUMBER */
931 A(0,0,0), /* GPROTOENT */
932 A(1,0,0), /* SPROTOENT */
933 A(0,0,0), /* EPROTOENT */
934 A(1,0,0), /* GNBYNAME */
935 A(1,1,0), /* GNBYADDR */
936 A(0,0,0), /* GNETENT */
937 A(1,0,0), /* SNETENT */
938 A(0,0,0), /* ENETENT */
941 A(1,0,0), /* GPWNAM */
942 A(1,0,0), /* GPWUID */
943 A(0,0,0), /* GPWENT */
944 A(0,0,0), /* SPWENT */
945 A(0,0,0), /* EPWENT */
946 A(1,0,0), /* GGRNAM */
947 A(1,0,0), /* GGRGID */
948 A(0,0,0), /* GGRENT */
949 A(0,0,0), /* SGRENT */
950 A(0,0,0), /* EGRENT */
951 A(1,1,0), /* SHUTDOWN */
952 A(1,1,0), /* OPENDIR */
953 A(1,0,0), /* READDIR */
954 A(1,0,0), /* TELLDIR */
955 A(1,1,0), /* SEEKDIR */
956 A(1,0,0), /* REWINDDIR */
957 A(1,0,0), /* CLOSEDIR */
958 A(0,0,0), /* GETLOGIN */
959 A(1,3,0), /* SYSCALL */
960 A(1,1,1), /* GSOCKOPT */
961 A5(1,1,1,1,0), /* SSOCKOPT */
962 A(1,0,0), /* GETSOCKNAME */
963 A(1,0,0), /* GETPEERNAME */
964 A(0,3,3), /* LSLICE */
965 A(0,3,1), /* SPLICE */
966 A(1,0,0), /* BINMODE */
967 A(1,0,0), /* REQUIRE */
968 A(1,1,0), /* TRUNCATE */
969 A(1,1,0), /* MSGGET */
970 A(1,1,1), /* MSGCTL */
971 A(1,1,1), /* MSGSND */
972 A5(1,1,1,1,1), /* MSGRCV */
973 A(1,1,1), /* SEMGET */
974 A5(1,1,1,1,0), /* SEMCTL */
975 A(1,1,1), /* SEMOP */
976 A(1,1,1), /* SHMGET */
977 A(1,1,1), /* SHMCTL */
978 A5(1,1,1,1,0), /* SHMREAD */
979 A5(1,1,1,1,0), /* SHMWRITE */
982 A(1,0,0), /* CALLER */
983 A(1,0,0), /* SCALAR */
984 A(1,1,3), /* SYSREAD */
985 A(1,1,3), /* SYSWRITE */
986 A(1,0,0), /* FTMTIME */
987 A(1,0,0), /* FTATIME */
988 A(1,0,0), /* FTCTIME */
989 A(1,1,0), /* WAITPID */
990 A(1,0,0), /* ALARM */