1 /* $Header: arg.h,v 3.0 89/10/18 15:08:27 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 89/10/18 15:08:27 lwall
29 #define O_LEFT_SHIFT 15
30 #define O_RIGHT_SHIFT 16
42 #define O_COND_EXPR 28
46 #define O_COMPLEMENT 32
88 #define O_LOCALTIME 74
116 #define O_UNSHIFT 102
120 #define O_FTEREAD 106
121 #define O_FTEWRITE 107
122 #define O_FTEEXEC 108
123 #define O_FTEOWNED 109
124 #define O_FTRREAD 110
125 #define O_FTRWRITE 111
126 #define O_FTREXEC 112
127 #define O_FTROWNED 113
134 #define O_SYMLINK 120
145 #define O_FTBINARY 131
161 #define O_GETPPID 147
162 #define O_GETPGRP 148
163 #define O_SETPGRP 149
164 #define O_GETPRIORITY 150
165 #define O_SETPRIORITY 151
175 #define O_DBMOPEN 161
176 #define O_DBMCLOSE 162
179 #define O_LASLICE 165
180 #define O_LHSLICE 166
184 #define O_AASSIGN 170
185 #define O_SASSIGN 171
187 #define O_REVERSE 173
191 #define O_CONNECT 177
196 #define O_SSELECT 182
197 #define O_SOCKETPAIR 183
199 #define O_DEFINED 185
201 #define O_READLINK 187
210 #define O_GHBYNAME 196
211 #define O_GHBYADDR 197
212 #define O_GHOSTENT 198
213 #define O_SHOSTENT 199
214 #define O_EHOSTENT 200
215 #define O_GSBYNAME 201
216 #define O_GSBYPORT 202
217 #define O_GSERVENT 203
218 #define O_SSERVENT 204
219 #define O_ESERVENT 205
220 #define O_GPBYNAME 206
221 #define O_GPBYNUMBER 207
222 #define O_GPROTOENT 208
223 #define O_SPROTOENT 209
224 #define O_EPROTOENT 210
225 #define O_GNBYNAME 211
226 #define O_GNBYADDR 212
227 #define O_GNETENT 213
228 #define O_SNETENT 214
229 #define O_ENETENT 215
242 #define O_SHUTDOWN 228
243 #define O_OPENDIR 229
244 #define O_READDIR 230
245 #define O_TELLDIR 231
246 #define O_SEEKDIR 232
247 #define O_REWINDDIR 233
248 #define O_CLOSEDIR 234
249 #define O_GETLOGIN 235
250 #define O_SYSCALL 236
251 #define O_GSOCKOPT 237
252 #define O_SSOCKOPT 238
253 #define O_GETSOCKNAME 239
254 #define O_GETPEERNAME 240
258 extern char *opname[];
523 #define A_LARYSTAB 17
526 #define A_WANTARRAY 20
529 #define A_DONT 32 /* or this into type to suppress evaluation */
532 extern char *argname[];
561 extern bool hoistable[];
600 union argptr arg_ptr;
605 unsigned char arg_type;
606 unsigned char arg_flags;
609 #define AF_ARYOK 1 /* op can handle multiple values here */
610 #define AF_POST 2 /* post *crement this item */
611 #define AF_PRE 4 /* pre *crement this item */
612 #define AF_UP 8 /* increment rather than decrement */
613 #define AF_COMMON 16 /* left and right have symbols in common */
614 #define AF_UNUSED 32 /* */
615 #define AF_LISTISH 64 /* turn into list if important */
616 #define AF_LOCAL 128 /* list of local variables */
619 * Most of the ARG pointers are used as pointers to arrays of ARG. When
620 * so used, the 0th element is special, and represents the operator to
621 * use on the list of arguments following. The arg_len in the 0th element
622 * gives the maximum argument number, and the arg_str is used to store
623 * the return value in a more-or-less static location. Sorry it's not
624 * re-entrant (yet), but it sure makes it efficient. The arg_type of the
625 * 0th element is an operator (O_*) rather than an argument type (A_*).
628 #define Nullarg Null(ARG*)
631 EXT char opargs[MAXO+1];
633 #define A(e1,e2,e3) (e1+(e2<<2)+(e3<<4))
634 char opargs[MAXO+1] = {
637 A(0,0,0), /* ITEM2 */
638 A(0,0,0), /* ITEM3 */
639 A(1,1,0), /* CONCAT */
640 A(1,0,0), /* MATCH */
641 A(1,0,0), /* NMATCH */
642 A(1,0,0), /* SUBST */
643 A(1,0,0), /* NSUBST */
644 A(1,1,0), /* ASSIGN */
645 A(1,1,0), /* MULTIPLY */
646 A(1,1,0), /* DIVIDE */
647 A(1,1,0), /* MODULO */
649 A(1,1,0), /* SUBTRACT */
650 A(1,1,0), /* LEFT_SHIFT */
651 A(1,1,0), /* RIGHT_SHIFT */
658 A(1,1,0), /* BIT_AND */
660 A(1,1,0), /* BIT_OR */
663 A(1,0,0), /* COND_EXPR */
664 A(1,1,0), /* COMMA */
665 A(1,0,0), /* NEGATE */
667 A(1,0,0), /* COMPLEMENT */
668 A(1,0,0), /* WRITE */
670 A(1,0,0), /* TRANS */
671 A(1,0,0), /* NTRANS */
672 A(1,0,0), /* CLOSE */
673 A(0,0,0), /* ARRAY */
675 A(0,0,0), /* LARRAY */
676 A(0,0,0), /* LHASH */
679 A(0,0,0), /* SHIFT */
680 A(1,0,1), /* SPLIT */
681 A(1,0,0), /* LENGTH */
682 A(3,0,0), /* SPRINTF */
683 A(1,1,1), /* SUBSTR */
692 A(1,3,0), /* PRINT */
693 A(1,0,0), /* CHDIR */
696 A(1,0,0), /* RESET */
698 A(1,0,0), /* SELECT */
706 A(1,1,0), /* INDEX */
708 A(0,0,0), /* TIMES */
709 A(1,0,0), /* LOCALTIME */
710 A(1,0,0), /* GMTIME */
712 A(1,1,0), /* CRYPT */
717 A(1,3,0), /* PRINTF */
719 A(1,0,0), /* SLEEP */
723 A(0,0,0), /* VALUES */
728 A(1,3,0), /* SYSTEM */
731 A(0,3,0), /* CHMOD */
732 A(0,3,0), /* CHOWN */
734 A(1,1,0), /* RENAME */
735 A(0,3,0), /* UNLINK */
736 A(1,0,0), /* UMASK */
737 A(0,3,0), /* UNSHIFT */
739 A(1,1,0), /* REPEAT */
741 A(1,0,0), /* FTEREAD */
742 A(1,0,0), /* FTEWRITE */
743 A(1,0,0), /* FTEEXEC */
744 A(1,0,0), /* FTEOWNED */
745 A(1,0,0), /* FTRREAD */
746 A(1,0,0), /* FTRWRITE */
747 A(1,0,0), /* FTREXEC */
748 A(1,0,0), /* FTROWNED */
750 A(1,0,0), /* FTZERO */
751 A(1,0,0), /* FTSIZE */
752 A(1,0,0), /* FTFILE */
753 A(1,0,0), /* FTDIR */
754 A(1,0,0), /* FTLINK */
755 A(1,1,0), /* SYMLINK */
756 A(1,0,0), /* FTPIPE */
757 A(1,0,0), /* FTSOCK */
758 A(1,0,0), /* FTBLK */
759 A(1,0,0), /* FTCHR */
760 A(1,0,0), /* FTSUID */
761 A(1,0,0), /* FTSGID */
762 A(1,0,0), /* FTSVTX */
763 A(1,0,0), /* FTTTY */
764 A(1,0,0), /* DOFILE */
765 A(1,0,0), /* FTTEXT */
766 A(1,0,0), /* FTBINARY */
767 A(0,3,0), /* UTIME */
770 A(0,1,0), /* DELETE */
771 A(1,0,0), /* STUDY */
772 A(1,1,0), /* ATAN2 */
776 A(1,0,0), /* SRAND */
778 A(0,3,0), /* RETURN */
780 A(1,1,0), /* MKDIR */
781 A(1,0,0), /* RMDIR */
782 A(0,0,0), /* GETPPID */
783 A(1,0,0), /* GETPGRP */
784 A(1,1,0), /* SETPGRP */
785 A(1,1,0), /* GETPRIORITY */
786 A(1,1,1), /* SETPRIORITY */
787 A(1,0,0), /* CHROOT */
788 A(1,1,1), /* IOCTL */
789 A(1,1,1), /* FCNTL */
790 A(1,1,0), /* FLOCK */
791 A(1,1,0), /* RINDEX */
793 A(1,1,0), /* UNPACK */
796 A(1,1,1), /* DBMOPEN */
797 A(1,0,0), /* DBMCLOSE */
798 A(0,3,0), /* ASLICE */
799 A(0,3,0), /* HSLICE */
800 A(0,3,0), /* LASLICE */
801 A(0,3,0), /* LHSLICE */
802 A(1,0,0), /* F_OR_R */
803 A(1,1,0), /* RANGE */
805 A(3,3,0), /* AASSIGN */
806 A(0,0,0), /* SASSIGN */
808 A(0,0,0), /* REVERSE */
809 A(1,0,0), /* ADDROF */
810 A(1,1,1), /* SOCKET */
812 A(1,1,0), /* CONNECT */
813 A(1,1,0), /* LISTEN */
814 A(1,1,0), /* ACCEPT */
817 A(1,1,1), /* SSELECT */
818 A(1,1,1), /* SOCKETPAIR */
819 A(0,3,0), /* DBSUBR */
820 A(1,0,0), /* DEFINED */
821 A(1,0,0), /* UNDEF */
822 A(1,0,0), /* READLINK */
823 A(1,0,0), /* LSTAT */
824 A(0,1,0), /* AELEM */
825 A(0,1,0), /* HELEM */
826 A(0,1,0), /* LAELEM */
827 A(0,1,0), /* LHELEM */
828 A(1,0,0), /* LOCAL */
829 A(0,0,0), /* UNUSED */
830 A(1,0,0), /* FILENO */
831 A(1,0,0), /* GHBYNAME */
832 A(1,1,0), /* GHBYADDR */
833 A(0,0,0), /* GHOSTENT */
834 A(1,0,0), /* SHOSTENT */
835 A(0,0,0), /* EHOSTENT */
836 A(1,1,0), /* GSBYNAME */
837 A(1,1,0), /* GSBYPORT */
838 A(0,0,0), /* GSERVENT */
839 A(1,0,0), /* SSERVENT */
840 A(0,0,0), /* ESERVENT */
841 A(1,0,0), /* GPBYNAME */
842 A(1,0,0), /* GPBYNUMBER */
843 A(0,0,0), /* GPROTOENT */
844 A(1,0,0), /* SPROTOENT */
845 A(0,0,0), /* EPROTOENT */
846 A(1,0,0), /* GNBYNAME */
847 A(1,1,0), /* GNBYADDR */
848 A(0,0,0), /* GNETENT */
849 A(1,0,0), /* SNETENT */
850 A(0,0,0), /* ENETENT */
853 A(1,0,0), /* GPWNAM */
854 A(1,0,0), /* GPWUID */
855 A(0,0,0), /* GPWENT */
856 A(0,0,0), /* SPWENT */
857 A(0,0,0), /* EPWENT */
858 A(1,0,0), /* GGRNAM */
859 A(1,0,0), /* GGRGID */
860 A(0,0,0), /* GGRENT */
861 A(0,0,0), /* SGRENT */
862 A(0,0,0), /* EGRENT */
863 A(1,1,0), /* SHUTDOWN */
864 A(1,1,0), /* OPENDIR */
865 A(1,0,0), /* READDIR */
866 A(1,0,0), /* TELLDIR */
867 A(1,1,0), /* SEEKDIR */
868 A(1,0,0), /* REWINDDIR */
869 A(1,0,0), /* CLOSEDIR */
870 A(0,0,0), /* GETLOGIN */
871 A(1,3,0), /* SYSCALL */
872 A(1,1,1), /* GSOCKOPT */
873 A(1,1,1), /* SSOCKOPT */
874 A(1,0,0), /* GETSOCKNAME */
875 A(1,0,0), /* GETPEERNAME */