1 /* $Header: arg.h,v 3.0.1.4 90/03/12 16:18:21 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.4 90/03/12 16:18:21 lwall
10 * patch13: added list slice operator (LIST)[LIST]
11 * patch13: added splice operator: @oldelems = splice(@array,$offset,$len,LIST)
13 * Revision 3.0.1.3 90/02/28 16:21:55 lwall
14 * patch9: added pipe function
16 * Revision 3.0.1.2 89/12/21 19:13:14 lwall
17 * patch7: send() didn't allow a TO argument
19 * Revision 3.0.1.1 89/10/26 23:02:35 lwall
20 * patch1: reverse didn't work
22 * Revision 3.0 89/10/18 15:08:27 lwall
42 #define O_LEFT_SHIFT 15
43 #define O_RIGHT_SHIFT 16
55 #define O_COND_EXPR 28
59 #define O_COMPLEMENT 32
101 #define O_LOCALTIME 74
129 #define O_UNSHIFT 102
133 #define O_FTEREAD 106
134 #define O_FTEWRITE 107
135 #define O_FTEEXEC 108
136 #define O_FTEOWNED 109
137 #define O_FTRREAD 110
138 #define O_FTRWRITE 111
139 #define O_FTREXEC 112
140 #define O_FTROWNED 113
147 #define O_SYMLINK 120
158 #define O_FTBINARY 131
174 #define O_GETPPID 147
175 #define O_GETPGRP 148
176 #define O_SETPGRP 149
177 #define O_GETPRIORITY 150
178 #define O_SETPRIORITY 151
188 #define O_DBMOPEN 161
189 #define O_DBMCLOSE 162
192 #define O_LASLICE 165
193 #define O_LHSLICE 166
197 #define O_AASSIGN 170
198 #define O_SASSIGN 171
200 #define O_REVERSE 173
204 #define O_CONNECT 177
209 #define O_SSELECT 182
210 #define O_SOCKETPAIR 183
212 #define O_DEFINED 185
214 #define O_READLINK 187
223 #define O_GHBYNAME 196
224 #define O_GHBYADDR 197
225 #define O_GHOSTENT 198
226 #define O_SHOSTENT 199
227 #define O_EHOSTENT 200
228 #define O_GSBYNAME 201
229 #define O_GSBYPORT 202
230 #define O_GSERVENT 203
231 #define O_SSERVENT 204
232 #define O_ESERVENT 205
233 #define O_GPBYNAME 206
234 #define O_GPBYNUMBER 207
235 #define O_GPROTOENT 208
236 #define O_SPROTOENT 209
237 #define O_EPROTOENT 210
238 #define O_GNBYNAME 211
239 #define O_GNBYADDR 212
240 #define O_GNETENT 213
241 #define O_SNETENT 214
242 #define O_ENETENT 215
255 #define O_SHUTDOWN 228
256 #define O_OPENDIR 229
257 #define O_READDIR 230
258 #define O_TELLDIR 231
259 #define O_SEEKDIR 232
260 #define O_REWINDDIR 233
261 #define O_CLOSEDIR 234
262 #define O_GETLOGIN 235
263 #define O_SYSCALL 236
264 #define O_GSOCKOPT 237
265 #define O_SSOCKOPT 238
266 #define O_GETSOCKNAME 239
267 #define O_GETPEERNAME 240
273 extern char *opname[];
540 #define A_LARYSTAB 17
543 #define A_WANTARRAY 20
546 #define A_DONT 32 /* or this into type to suppress evaluation */
549 extern char *argname[];
578 extern bool hoistable[];
617 union argptr arg_ptr;
622 unsigned char arg_type;
623 unsigned char arg_flags;
626 #define AF_ARYOK 1 /* op can handle multiple values here */
627 #define AF_POST 2 /* post *crement this item */
628 #define AF_PRE 4 /* pre *crement this item */
629 #define AF_UP 8 /* increment rather than decrement */
630 #define AF_COMMON 16 /* left and right have symbols in common */
631 #define AF_UNUSED 32 /* */
632 #define AF_LISTISH 64 /* turn into list if important */
633 #define AF_LOCAL 128 /* list of local variables */
636 * Most of the ARG pointers are used as pointers to arrays of ARG. When
637 * so used, the 0th element is special, and represents the operator to
638 * use on the list of arguments following. The arg_len in the 0th element
639 * gives the maximum argument number, and the arg_str is used to store
640 * the return value in a more-or-less static location. Sorry it's not
641 * re-entrant (yet), but it sure makes it efficient. The arg_type of the
642 * 0th element is an operator (O_*) rather than an argument type (A_*).
645 #define Nullarg Null(ARG*)
648 EXT char opargs[MAXO+1];
650 #define A(e1,e2,e3) (e1+(e2<<2)+(e3<<4))
651 char opargs[MAXO+1] = {
654 A(0,0,0), /* ITEM2 */
655 A(0,0,0), /* ITEM3 */
656 A(1,1,0), /* CONCAT */
657 A(1,0,0), /* MATCH */
658 A(1,0,0), /* NMATCH */
659 A(1,0,0), /* SUBST */
660 A(1,0,0), /* NSUBST */
661 A(1,1,0), /* ASSIGN */
662 A(1,1,0), /* MULTIPLY */
663 A(1,1,0), /* DIVIDE */
664 A(1,1,0), /* MODULO */
666 A(1,1,0), /* SUBTRACT */
667 A(1,1,0), /* LEFT_SHIFT */
668 A(1,1,0), /* RIGHT_SHIFT */
675 A(1,1,0), /* BIT_AND */
677 A(1,1,0), /* BIT_OR */
680 A(1,0,0), /* COND_EXPR */
681 A(1,1,0), /* COMMA */
682 A(1,0,0), /* NEGATE */
684 A(1,0,0), /* COMPLEMENT */
685 A(1,0,0), /* WRITE */
687 A(1,0,0), /* TRANS */
688 A(1,0,0), /* NTRANS */
689 A(1,0,0), /* CLOSE */
690 A(0,0,0), /* ARRAY */
692 A(0,0,0), /* LARRAY */
693 A(0,0,0), /* LHASH */
696 A(0,0,0), /* SHIFT */
697 A(1,0,1), /* SPLIT */
698 A(1,0,0), /* LENGTH */
699 A(3,0,0), /* SPRINTF */
700 A(1,1,1), /* SUBSTR */
709 A(1,3,0), /* PRINT */
710 A(1,0,0), /* CHDIR */
713 A(1,0,0), /* RESET */
715 A(1,0,0), /* SELECT */
723 A(1,1,0), /* INDEX */
725 A(0,0,0), /* TIMES */
726 A(1,0,0), /* LOCALTIME */
727 A(1,0,0), /* GMTIME */
729 A(1,1,0), /* CRYPT */
734 A(1,3,0), /* PRINTF */
736 A(1,0,0), /* SLEEP */
740 A(0,0,0), /* VALUES */
745 A(1,3,0), /* SYSTEM */
748 A(0,3,0), /* CHMOD */
749 A(0,3,0), /* CHOWN */
751 A(1,1,0), /* RENAME */
752 A(0,3,0), /* UNLINK */
753 A(1,0,0), /* UMASK */
754 A(0,3,0), /* UNSHIFT */
756 A(1,1,0), /* REPEAT */
758 A(1,0,0), /* FTEREAD */
759 A(1,0,0), /* FTEWRITE */
760 A(1,0,0), /* FTEEXEC */
761 A(1,0,0), /* FTEOWNED */
762 A(1,0,0), /* FTRREAD */
763 A(1,0,0), /* FTRWRITE */
764 A(1,0,0), /* FTREXEC */
765 A(1,0,0), /* FTROWNED */
767 A(1,0,0), /* FTZERO */
768 A(1,0,0), /* FTSIZE */
769 A(1,0,0), /* FTFILE */
770 A(1,0,0), /* FTDIR */
771 A(1,0,0), /* FTLINK */
772 A(1,1,0), /* SYMLINK */
773 A(1,0,0), /* FTPIPE */
774 A(1,0,0), /* FTSOCK */
775 A(1,0,0), /* FTBLK */
776 A(1,0,0), /* FTCHR */
777 A(1,0,0), /* FTSUID */
778 A(1,0,0), /* FTSGID */
779 A(1,0,0), /* FTSVTX */
780 A(1,0,0), /* FTTTY */
781 A(1,0,0), /* DOFILE */
782 A(1,0,0), /* FTTEXT */
783 A(1,0,0), /* FTBINARY */
784 A(0,3,0), /* UTIME */
787 A(0,1,0), /* DELETE */
788 A(1,0,0), /* STUDY */
789 A(1,1,0), /* ATAN2 */
793 A(1,0,0), /* SRAND */
795 A(0,3,0), /* RETURN */
797 A(1,1,0), /* MKDIR */
798 A(1,0,0), /* RMDIR */
799 A(0,0,0), /* GETPPID */
800 A(1,0,0), /* GETPGRP */
801 A(1,1,0), /* SETPGRP */
802 A(1,1,0), /* GETPRIORITY */
803 A(1,1,1), /* SETPRIORITY */
804 A(1,0,0), /* CHROOT */
805 A(1,1,1), /* IOCTL */
806 A(1,1,1), /* FCNTL */
807 A(1,1,0), /* FLOCK */
808 A(1,1,0), /* RINDEX */
810 A(1,1,0), /* UNPACK */
813 A(1,1,1), /* DBMOPEN */
814 A(1,0,0), /* DBMCLOSE */
815 A(0,3,0), /* ASLICE */
816 A(0,3,0), /* HSLICE */
817 A(0,3,0), /* LASLICE */
818 A(0,3,0), /* LHSLICE */
819 A(1,0,0), /* F_OR_R */
820 A(1,1,0), /* RANGE */
822 A(3,3,0), /* AASSIGN */
823 A(0,0,0), /* SASSIGN */
825 A(0,3,0), /* REVERSE */
826 A(1,0,0), /* ADDROF */
827 A(1,1,1), /* SOCKET */
829 A(1,1,0), /* CONNECT */
830 A(1,1,0), /* LISTEN */
831 A(1,1,0), /* ACCEPT */
834 A(1,1,1), /* SSELECT */
835 A(1,1,1), /* SOCKETPAIR */
836 A(0,3,0), /* DBSUBR */
837 A(1,0,0), /* DEFINED */
838 A(1,0,0), /* UNDEF */
839 A(1,0,0), /* READLINK */
840 A(1,0,0), /* LSTAT */
841 A(0,1,0), /* AELEM */
842 A(0,1,0), /* HELEM */
843 A(0,1,0), /* LAELEM */
844 A(0,1,0), /* LHELEM */
845 A(1,0,0), /* LOCAL */
847 A(1,0,0), /* FILENO */
848 A(1,0,0), /* GHBYNAME */
849 A(1,1,0), /* GHBYADDR */
850 A(0,0,0), /* GHOSTENT */
851 A(1,0,0), /* SHOSTENT */
852 A(0,0,0), /* EHOSTENT */
853 A(1,1,0), /* GSBYNAME */
854 A(1,1,0), /* GSBYPORT */
855 A(0,0,0), /* GSERVENT */
856 A(1,0,0), /* SSERVENT */
857 A(0,0,0), /* ESERVENT */
858 A(1,0,0), /* GPBYNAME */
859 A(1,0,0), /* GPBYNUMBER */
860 A(0,0,0), /* GPROTOENT */
861 A(1,0,0), /* SPROTOENT */
862 A(0,0,0), /* EPROTOENT */
863 A(1,0,0), /* GNBYNAME */
864 A(1,1,0), /* GNBYADDR */
865 A(0,0,0), /* GNETENT */
866 A(1,0,0), /* SNETENT */
867 A(0,0,0), /* ENETENT */
870 A(1,0,0), /* GPWNAM */
871 A(1,0,0), /* GPWUID */
872 A(0,0,0), /* GPWENT */
873 A(0,0,0), /* SPWENT */
874 A(0,0,0), /* EPWENT */
875 A(1,0,0), /* GGRNAM */
876 A(1,0,0), /* GGRGID */
877 A(0,0,0), /* GGRENT */
878 A(0,0,0), /* SGRENT */
879 A(0,0,0), /* EGRENT */
880 A(1,1,0), /* SHUTDOWN */
881 A(1,1,0), /* OPENDIR */
882 A(1,0,0), /* READDIR */
883 A(1,0,0), /* TELLDIR */
884 A(1,1,0), /* SEEKDIR */
885 A(1,0,0), /* REWINDDIR */
886 A(1,0,0), /* CLOSEDIR */
887 A(0,0,0), /* GETLOGIN */
888 A(1,3,0), /* SYSCALL */
889 A(1,1,1), /* GSOCKOPT */
890 A(1,1,1), /* SSOCKOPT */
891 A(1,0,0), /* GETSOCKNAME */
892 A(1,0,0), /* GETPEERNAME */
893 A(0,3,3), /* LSLICE */
894 A(0,3,1), /* SPLICE */