1 /* $Header: arg.h,v 4.0 91/03/20 01:03:09 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 4.0 91/03/20 01:03:09 lwall
40 #define O_LEFT_SHIFT 26
41 #define O_RIGHT_SHIFT 27
54 #define O_COND_EXPR 40
58 #define O_COMPLEMENT 44
121 #define O_SYSREAD 107
122 #define O_SYSWRITE 108
135 #define O_LOCALTIME 121
137 #define O_TRUNCATE 123
159 #define O_WAITPID 145
161 #define O_EXEC_OP 147
179 #define O_SHMREAD 165
180 #define O_SHMWRITE 166
185 #define O_GETPPID 171
186 #define O_GETPGRP 172
187 #define O_SETPGRP 173
188 #define O_GETPRIORITY 174
189 #define O_SETPRIORITY 175
194 #define O_UNSHIFT 180
195 #define O_REQUIRE 181
198 #define O_FTRREAD 184
199 #define O_FTRWRITE 185
200 #define O_FTREXEC 186
201 #define O_FTEREAD 187
202 #define O_FTEWRITE 188
203 #define O_FTEEXEC 189
205 #define O_FTEOWNED 191
206 #define O_FTROWNED 192
209 #define O_FTMTIME 195
210 #define O_FTATIME 196
211 #define O_FTCTIME 197
219 #define O_SYMLINK 205
220 #define O_READLINK 206
226 #define O_FTBINARY 212
229 #define O_CONNECT 215
232 #define O_GHBYNAME 218
233 #define O_GHBYADDR 219
234 #define O_GHOSTENT 220
235 #define O_GNBYNAME 221
236 #define O_GNBYADDR 222
237 #define O_GNETENT 223
238 #define O_GPBYNAME 224
239 #define O_GPBYNUMBER 225
240 #define O_GPROTOENT 226
241 #define O_GSBYNAME 227
242 #define O_GSBYPORT 228
243 #define O_GSERVENT 229
244 #define O_SHOSTENT 230
245 #define O_SNETENT 231
246 #define O_SPROTOENT 232
247 #define O_SSERVENT 233
248 #define O_EHOSTENT 234
249 #define O_ENETENT 235
250 #define O_EPROTOENT 236
251 #define O_ESERVENT 237
252 #define O_SOCKPAIR 238
253 #define O_SHUTDOWN 239
254 #define O_GSOCKOPT 240
255 #define O_SSOCKOPT 241
256 #define O_GETSOCKNAME 242
257 #define O_GETPEERNAME 243
258 #define O_SSELECT 244
260 #define O_BINMODE 246
272 #define O_GETLOGIN 258
273 #define O_OPENDIR 259
274 #define O_READDIR 260
275 #define O_TELLDIR 261
276 #define O_SEEKDIR 262
277 #define O_REWINDDIR 263
278 #define O_CLOSEDIR 264
279 #define O_SYSCALL 265
284 extern char *opname[];
575 #define A_LARYSTAB 17
578 #define A_WANTARRAY 20
581 #define A_DONT 32 /* or this into type to suppress evaluation */
584 extern char *argname[];
613 extern bool hoistable[];
652 union argptr arg_ptr;
654 unsigned short arg_type;
655 unsigned short arg_flags;
658 #define AF_ARYOK 1 /* op can handle multiple values here */
659 #define AF_POST 2 /* post *crement this item */
660 #define AF_PRE 4 /* pre *crement this item */
661 #define AF_UP 8 /* increment rather than decrement */
662 #define AF_COMMON 16 /* left and right have symbols in common */
663 #define AF_DEPR 32 /* an older form of the construct */
664 #define AF_LISTISH 64 /* turn into list if important */
665 #define AF_LOCAL 128 /* list of local variables */
668 * Most of the ARG pointers are used as pointers to arrays of ARG. When
669 * so used, the 0th element is special, and represents the operator to
670 * use on the list of arguments following. The arg_len in the 0th element
671 * gives the maximum argument number, and the arg_str is used to store
672 * the return value in a more-or-less static location. Sorry it's not
673 * re-entrant (yet), but it sure makes it efficient. The arg_type of the
674 * 0th element is an operator (O_*) rather than an argument type (A_*).
677 #define Nullarg Null(ARG*)
680 EXT unsigned short opargs[MAXO+1];
682 #define A(e1,e2,e3) (e1+(e2<<2)+(e3<<4))
683 #define A5(e1,e2,e3,e4,e5) (e1+(e2<<2)+(e3<<4)+(e4<<6)+(e5<<8))
684 unsigned short opargs[MAXO+1] = {
688 A(1,0,0), /* SCALAR */
689 A(0,0,0), /* ITEM2 */
690 A(0,0,0), /* ITEM3 */
691 A(1,1,0), /* CONCAT */
692 A(3,1,0), /* REPEAT */
693 A(1,0,0), /* MATCH */
694 A(1,0,0), /* NMATCH */
695 A(1,0,0), /* SUBST */
696 A(1,0,0), /* NSUBST */
697 A(1,1,0), /* ASSIGN */
698 A(1,0,0), /* LOCAL */
699 A(3,3,0), /* AASSIGN */
700 A(0,0,0), /* SASSIGN */
702 A(1,0,0), /* DEFINED */
703 A(1,0,0), /* UNDEF */
704 A(1,0,0), /* STUDY */
706 A(1,1,0), /* MULTIPLY */
707 A(1,1,0), /* DIVIDE */
708 A(1,1,0), /* MODULO */
710 A(1,1,0), /* SUBTRACT */
711 A(1,1,0), /* LEFT_SHIFT */
712 A(1,1,0), /* RIGHT_SHIFT */
720 A(1,1,0), /* BIT_AND */
722 A(1,1,0), /* BIT_OR */
725 A(1,0,0), /* COND_EXPR */
726 A(1,1,0), /* COMMA */
727 A(1,0,0), /* NEGATE */
729 A(1,0,0), /* COMPLEMENT */
730 A(1,0,0), /* SELECT */
731 A(1,0,0), /* WRITE */
732 A(1,1,1), /* DBMOPEN */
733 A(1,0,0), /* DBMCLOSE */
735 A(1,0,0), /* TRANS */
736 A(1,0,0), /* NTRANS */
737 A(1,0,0), /* CLOSE */
739 A(0,0,0), /* VALUES */
741 A(0,0,0), /* LARRAY */
742 A(0,0,0), /* ARRAY */
743 A(0,1,0), /* AELEM */
744 A(0,1,0), /* DELETE */
745 A(0,0,0), /* LHASH */
747 A(0,1,0), /* HELEM */
748 A(0,1,0), /* LAELEM */
749 A(0,1,0), /* LHELEM */
750 A(0,3,3), /* LSLICE */
751 A(0,3,0), /* ASLICE */
752 A(0,3,0), /* HSLICE */
753 A(0,3,0), /* LASLICE */
754 A(0,3,0), /* LHSLICE */
755 A(0,3,1), /* SPLICE */
758 A(0,0,0), /* SHIFT */
759 A(1,1,0), /* UNPACK */
760 A(1,0,1), /* SPLIT */
761 A(1,0,0), /* LENGTH */
762 A(3,0,0), /* SPRINTF */
763 A(1,1,1), /* SUBSTR */
775 A(0,3,0), /* DBSUBR */
776 A(1,0,0), /* CALLER */
778 A(0,3,0), /* REVERSE */
781 A(1,3,0), /* PRINTF */
782 A(1,3,0), /* PRINT */
783 A(1,0,0), /* CHDIR */
785 A(1,0,0), /* RESET */
790 A5(1,1,1,1,0), /* RECV */
792 A(1,1,3), /* SYSREAD */
793 A(1,1,3), /* SYSWRITE */
796 A(0,3,0), /* RETURN */
802 A(1,1,1), /* INDEX */
803 A(1,1,1), /* RINDEX */
805 A(0,0,0), /* TIMES */
806 A(1,0,0), /* LOCALTIME */
807 A(1,0,0), /* GMTIME */
808 A(1,1,0), /* TRUNCATE */
809 A(1,0,0), /* LSTAT */
811 A(1,1,0), /* CRYPT */
812 A(1,1,0), /* ATAN2 */
816 A(1,0,0), /* SRAND */
822 A(1,0,0), /* ALARM */
823 A(1,0,0), /* SLEEP */
824 A(1,1,0), /* RANGE */
825 A(1,0,0), /* F_OR_R */
830 A(1,1,0), /* WAITPID */
831 A(1,3,0), /* SYSTEM */
835 A(0,3,0), /* CHOWN */
837 A(0,3,0), /* UNLINK */
838 A(0,3,0), /* CHMOD */
839 A(0,3,0), /* UTIME */
840 A(1,0,0), /* UMASK */
841 A(1,1,0), /* MSGGET */
842 A(1,1,1), /* SHMGET */
843 A(1,1,1), /* SEMGET */
844 A(1,1,1), /* MSGCTL */
845 A(1,1,1), /* SHMCTL */
846 A5(1,1,1,1,0), /* SEMCTL */
847 A(1,1,1), /* MSGSND */
848 A5(1,1,1,1,1), /* MSGRCV */
849 A(1,1,1), /* SEMOP */
850 A5(1,1,1,1,0), /* SHMREAD */
851 A5(1,1,1,1,0), /* SHMWRITE */
852 A(1,1,0), /* RENAME */
854 A(1,1,0), /* MKDIR */
855 A(1,0,0), /* RMDIR */
856 A(0,0,0), /* GETPPID */
857 A(1,0,0), /* GETPGRP */
858 A(1,1,0), /* SETPGRP */
859 A(1,1,0), /* GETPRIORITY */
860 A(1,1,1), /* SETPRIORITY */
861 A(1,0,0), /* CHROOT */
862 A(1,1,1), /* FCNTL */
863 A(1,1,1), /* SYSIOCTL */
864 A(1,1,0), /* FLOCK */
865 A(0,3,0), /* UNSHIFT */
866 A(1,0,0), /* REQUIRE */
867 A(1,0,0), /* DOFILE */
869 A(1,0,0), /* FTRREAD */
870 A(1,0,0), /* FTRWRITE */
871 A(1,0,0), /* FTREXEC */
872 A(1,0,0), /* FTEREAD */
873 A(1,0,0), /* FTEWRITE */
874 A(1,0,0), /* FTEEXEC */
876 A(1,0,0), /* FTEOWNED */
877 A(1,0,0), /* FTROWNED */
878 A(1,0,0), /* FTZERO */
879 A(1,0,0), /* FTSIZE */
880 A(1,0,0), /* FTMTIME */
881 A(1,0,0), /* FTATIME */
882 A(1,0,0), /* FTCTIME */
883 A(1,0,0), /* FTSOCK */
884 A(1,0,0), /* FTCHR */
885 A(1,0,0), /* FTBLK */
886 A(1,0,0), /* FTFILE */
887 A(1,0,0), /* FTDIR */
888 A(1,0,0), /* FTPIPE */
889 A(1,0,0), /* FTLINK */
890 A(1,1,0), /* SYMLINK */
891 A(1,0,0), /* READLINK */
892 A(1,0,0), /* FTSUID */
893 A(1,0,0), /* FTSGID */
894 A(1,0,0), /* FTSVTX */
895 A(1,0,0), /* FTTTY */
896 A(1,0,0), /* FTTEXT */
897 A(1,0,0), /* FTBINARY */
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 */
903 A(1,0,0), /* GHBYNAME */
904 A(1,1,0), /* GHBYADDR */
905 A(0,0,0), /* GHOSTENT */
906 A(1,0,0), /* GNBYNAME */
907 A(1,1,0), /* GNBYADDR */
908 A(0,0,0), /* GNETENT */
909 A(1,0,0), /* GPBYNAME */
910 A(1,0,0), /* GPBYNUMBER */
911 A(0,0,0), /* GPROTOENT */
912 A(1,1,0), /* GSBYNAME */
913 A(1,1,0), /* GSBYPORT */
914 A(0,0,0), /* GSERVENT */
915 A(1,0,0), /* SHOSTENT */
916 A(1,0,0), /* SNETENT */
917 A(1,0,0), /* SPROTOENT */
918 A(1,0,0), /* SSERVENT */
919 A(0,0,0), /* EHOSTENT */
920 A(0,0,0), /* ENETENT */
921 A(0,0,0), /* EPROTOENT */
922 A(0,0,0), /* ESERVENT */
923 A5(1,1,1,1,1), /* SOCKPAIR */
924 A(1,1,0), /* SHUTDOWN */
925 A(1,1,1), /* GSOCKOPT */
926 A5(1,1,1,1,0), /* SSOCKOPT */
927 A(1,0,0), /* GETSOCKNAME */
928 A(1,0,0), /* GETPEERNAME */
929 A5(1,1,1,1,0), /* SSELECT */
930 A(1,0,0), /* FILENO */
931 A(1,0,0), /* BINMODE */
933 A(1,0,0), /* GPWNAM */
934 A(1,0,0), /* GPWUID */
935 A(0,0,0), /* GPWENT */
936 A(0,0,0), /* SPWENT */
937 A(0,0,0), /* EPWENT */
938 A(1,0,0), /* GGRNAM */
939 A(1,0,0), /* GGRGID */
940 A(0,0,0), /* GGRENT */
941 A(0,0,0), /* SGRENT */
942 A(0,0,0), /* EGRENT */
943 A(0,0,0), /* GETLOGIN */
944 A(1,1,0), /* OPENDIR */
945 A(1,0,0), /* READDIR */
946 A(1,0,0), /* TELLDIR */
947 A(1,1,0), /* SEEKDIR */
948 A(1,0,0), /* REWINDDIR */
949 A(1,0,0), /* CLOSEDIR */
950 A(1,3,0), /* SYSCALL */