1 /* $Header: arg.h,v 3.0.1.6 90/08/09 02:25:14 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.6 90/08/09 02:25:14 lwall
10 * patch19: added require operator
11 * patch19: added truncate operator
13 * Revision 3.0.1.5 90/03/27 15:29:41 lwall
14 * patch16: MSDOS support
16 * Revision 3.0.1.4 90/03/12 16:18:21 lwall
17 * patch13: added list slice operator (LIST)[LIST]
18 * patch13: added splice operator: @oldelems = splice(@array,$offset,$len,LIST)
20 * Revision 3.0.1.3 90/02/28 16:21:55 lwall
21 * patch9: added pipe function
23 * Revision 3.0.1.2 89/12/21 19:13:14 lwall
24 * patch7: send() didn't allow a TO argument
26 * Revision 3.0.1.1 89/10/26 23:02:35 lwall
27 * patch1: reverse didn't work
29 * Revision 3.0 89/10/18 15:08:27 lwall
49 #define O_LEFT_SHIFT 15
50 #define O_RIGHT_SHIFT 16
62 #define O_COND_EXPR 28
66 #define O_COMPLEMENT 32
108 #define O_LOCALTIME 74
136 #define O_UNSHIFT 102
140 #define O_FTEREAD 106
141 #define O_FTEWRITE 107
142 #define O_FTEEXEC 108
143 #define O_FTEOWNED 109
144 #define O_FTRREAD 110
145 #define O_FTRWRITE 111
146 #define O_FTREXEC 112
147 #define O_FTROWNED 113
154 #define O_SYMLINK 120
165 #define O_FTBINARY 131
181 #define O_GETPPID 147
182 #define O_GETPGRP 148
183 #define O_SETPGRP 149
184 #define O_GETPRIORITY 150
185 #define O_SETPRIORITY 151
195 #define O_DBMOPEN 161
196 #define O_DBMCLOSE 162
199 #define O_LASLICE 165
200 #define O_LHSLICE 166
204 #define O_AASSIGN 170
205 #define O_SASSIGN 171
207 #define O_REVERSE 173
211 #define O_CONNECT 177
216 #define O_SSELECT 182
217 #define O_SOCKPAIR 183
219 #define O_DEFINED 185
221 #define O_READLINK 187
230 #define O_GHBYNAME 196
231 #define O_GHBYADDR 197
232 #define O_GHOSTENT 198
233 #define O_SHOSTENT 199
234 #define O_EHOSTENT 200
235 #define O_GSBYNAME 201
236 #define O_GSBYPORT 202
237 #define O_GSERVENT 203
238 #define O_SSERVENT 204
239 #define O_ESERVENT 205
240 #define O_GPBYNAME 206
241 #define O_GPBYNUMBER 207
242 #define O_GPROTOENT 208
243 #define O_SPROTOENT 209
244 #define O_EPROTOENT 210
245 #define O_GNBYNAME 211
246 #define O_GNBYADDR 212
247 #define O_GNETENT 213
248 #define O_SNETENT 214
249 #define O_ENETENT 215
262 #define O_SHUTDOWN 228
263 #define O_OPENDIR 229
264 #define O_READDIR 230
265 #define O_TELLDIR 231
266 #define O_SEEKDIR 232
267 #define O_REWINDDIR 233
268 #define O_CLOSEDIR 234
269 #define O_GETLOGIN 235
270 #define O_SYSCALL 236
271 #define O_GSOCKOPT 237
272 #define O_SSOCKOPT 238
273 #define O_GETSOCKNAME 239
274 #define O_GETPEERNAME 240
277 #define O_BINMODE 243
278 #define O_REQUIRE 244
279 #define O_TRUNCATE 245
283 extern char *opname[];
553 #define A_LARYSTAB 17
556 #define A_WANTARRAY 20
559 #define A_DONT 32 /* or this into type to suppress evaluation */
562 extern char *argname[];
591 extern bool hoistable[];
630 union argptr arg_ptr;
635 unsigned char arg_type;
636 unsigned char arg_flags;
639 #define AF_ARYOK 1 /* op can handle multiple values here */
640 #define AF_POST 2 /* post *crement this item */
641 #define AF_PRE 4 /* pre *crement this item */
642 #define AF_UP 8 /* increment rather than decrement */
643 #define AF_COMMON 16 /* left and right have symbols in common */
644 #define AF_UNUSED 32 /* */
645 #define AF_LISTISH 64 /* turn into list if important */
646 #define AF_LOCAL 128 /* list of local variables */
649 * Most of the ARG pointers are used as pointers to arrays of ARG. When
650 * so used, the 0th element is special, and represents the operator to
651 * use on the list of arguments following. The arg_len in the 0th element
652 * gives the maximum argument number, and the arg_str is used to store
653 * the return value in a more-or-less static location. Sorry it's not
654 * re-entrant (yet), but it sure makes it efficient. The arg_type of the
655 * 0th element is an operator (O_*) rather than an argument type (A_*).
658 #define Nullarg Null(ARG*)
661 EXT char opargs[MAXO+1];
663 #define A(e1,e2,e3) (e1+(e2<<2)+(e3<<4))
664 char opargs[MAXO+1] = {
667 A(0,0,0), /* ITEM2 */
668 A(0,0,0), /* ITEM3 */
669 A(1,1,0), /* CONCAT */
670 A(1,0,0), /* MATCH */
671 A(1,0,0), /* NMATCH */
672 A(1,0,0), /* SUBST */
673 A(1,0,0), /* NSUBST */
674 A(1,1,0), /* ASSIGN */
675 A(1,1,0), /* MULTIPLY */
676 A(1,1,0), /* DIVIDE */
677 A(1,1,0), /* MODULO */
679 A(1,1,0), /* SUBTRACT */
680 A(1,1,0), /* LEFT_SHIFT */
681 A(1,1,0), /* RIGHT_SHIFT */
688 A(1,1,0), /* BIT_AND */
690 A(1,1,0), /* BIT_OR */
693 A(1,0,0), /* COND_EXPR */
694 A(1,1,0), /* COMMA */
695 A(1,0,0), /* NEGATE */
697 A(1,0,0), /* COMPLEMENT */
698 A(1,0,0), /* WRITE */
700 A(1,0,0), /* TRANS */
701 A(1,0,0), /* NTRANS */
702 A(1,0,0), /* CLOSE */
703 A(0,0,0), /* ARRAY */
705 A(0,0,0), /* LARRAY */
706 A(0,0,0), /* LHASH */
709 A(0,0,0), /* SHIFT */
710 A(1,0,1), /* SPLIT */
711 A(1,0,0), /* LENGTH */
712 A(3,0,0), /* SPRINTF */
713 A(1,1,1), /* SUBSTR */
722 A(1,3,0), /* PRINT */
723 A(1,0,0), /* CHDIR */
726 A(1,0,0), /* RESET */
728 A(1,0,0), /* SELECT */
736 A(1,1,0), /* INDEX */
738 A(0,0,0), /* TIMES */
739 A(1,0,0), /* LOCALTIME */
740 A(1,0,0), /* GMTIME */
742 A(1,1,0), /* CRYPT */
747 A(1,3,0), /* PRINTF */
749 A(1,0,0), /* SLEEP */
753 A(0,0,0), /* VALUES */
758 A(1,3,0), /* SYSTEM */
761 A(0,3,0), /* CHMOD */
762 A(0,3,0), /* CHOWN */
764 A(1,1,0), /* RENAME */
765 A(0,3,0), /* UNLINK */
766 A(1,0,0), /* UMASK */
767 A(0,3,0), /* UNSHIFT */
769 A(1,1,0), /* REPEAT */
771 A(1,0,0), /* FTEREAD */
772 A(1,0,0), /* FTEWRITE */
773 A(1,0,0), /* FTEEXEC */
774 A(1,0,0), /* FTEOWNED */
775 A(1,0,0), /* FTRREAD */
776 A(1,0,0), /* FTRWRITE */
777 A(1,0,0), /* FTREXEC */
778 A(1,0,0), /* FTROWNED */
780 A(1,0,0), /* FTZERO */
781 A(1,0,0), /* FTSIZE */
782 A(1,0,0), /* FTFILE */
783 A(1,0,0), /* FTDIR */
784 A(1,0,0), /* FTLINK */
785 A(1,1,0), /* SYMLINK */
786 A(1,0,0), /* FTPIPE */
787 A(1,0,0), /* FTSOCK */
788 A(1,0,0), /* FTBLK */
789 A(1,0,0), /* FTCHR */
790 A(1,0,0), /* FTSUID */
791 A(1,0,0), /* FTSGID */
792 A(1,0,0), /* FTSVTX */
793 A(1,0,0), /* FTTTY */
794 A(1,0,0), /* DOFILE */
795 A(1,0,0), /* FTTEXT */
796 A(1,0,0), /* FTBINARY */
797 A(0,3,0), /* UTIME */
800 A(0,1,0), /* DELETE */
801 A(1,0,0), /* STUDY */
802 A(1,1,0), /* ATAN2 */
806 A(1,0,0), /* SRAND */
808 A(0,3,0), /* RETURN */
810 A(1,1,0), /* MKDIR */
811 A(1,0,0), /* RMDIR */
812 A(0,0,0), /* GETPPID */
813 A(1,0,0), /* GETPGRP */
814 A(1,1,0), /* SETPGRP */
815 A(1,1,0), /* GETPRIORITY */
816 A(1,1,1), /* SETPRIORITY */
817 A(1,0,0), /* CHROOT */
818 A(1,1,1), /* IOCTL */
819 A(1,1,1), /* FCNTL */
820 A(1,1,0), /* FLOCK */
821 A(1,1,0), /* RINDEX */
823 A(1,1,0), /* UNPACK */
826 A(1,1,1), /* DBMOPEN */
827 A(1,0,0), /* DBMCLOSE */
828 A(0,3,0), /* ASLICE */
829 A(0,3,0), /* HSLICE */
830 A(0,3,0), /* LASLICE */
831 A(0,3,0), /* LHSLICE */
832 A(1,0,0), /* F_OR_R */
833 A(1,1,0), /* RANGE */
835 A(3,3,0), /* AASSIGN */
836 A(0,0,0), /* SASSIGN */
838 A(0,3,0), /* REVERSE */
839 A(1,0,0), /* ADDROF */
840 A(1,1,1), /* SOCKET */
842 A(1,1,0), /* CONNECT */
843 A(1,1,0), /* LISTEN */
844 A(1,1,0), /* ACCEPT */
847 A(1,1,1), /* SSELECT */
848 A(1,1,1), /* SOCKPAIR */
849 A(0,3,0), /* DBSUBR */
850 A(1,0,0), /* DEFINED */
851 A(1,0,0), /* UNDEF */
852 A(1,0,0), /* READLINK */
853 A(1,0,0), /* LSTAT */
854 A(0,1,0), /* AELEM */
855 A(0,1,0), /* HELEM */
856 A(0,1,0), /* LAELEM */
857 A(0,1,0), /* LHELEM */
858 A(1,0,0), /* LOCAL */
860 A(1,0,0), /* FILENO */
861 A(1,0,0), /* GHBYNAME */
862 A(1,1,0), /* GHBYADDR */
863 A(0,0,0), /* GHOSTENT */
864 A(1,0,0), /* SHOSTENT */
865 A(0,0,0), /* EHOSTENT */
866 A(1,1,0), /* GSBYNAME */
867 A(1,1,0), /* GSBYPORT */
868 A(0,0,0), /* GSERVENT */
869 A(1,0,0), /* SSERVENT */
870 A(0,0,0), /* ESERVENT */
871 A(1,0,0), /* GPBYNAME */
872 A(1,0,0), /* GPBYNUMBER */
873 A(0,0,0), /* GPROTOENT */
874 A(1,0,0), /* SPROTOENT */
875 A(0,0,0), /* EPROTOENT */
876 A(1,0,0), /* GNBYNAME */
877 A(1,1,0), /* GNBYADDR */
878 A(0,0,0), /* GNETENT */
879 A(1,0,0), /* SNETENT */
880 A(0,0,0), /* ENETENT */
883 A(1,0,0), /* GPWNAM */
884 A(1,0,0), /* GPWUID */
885 A(0,0,0), /* GPWENT */
886 A(0,0,0), /* SPWENT */
887 A(0,0,0), /* EPWENT */
888 A(1,0,0), /* GGRNAM */
889 A(1,0,0), /* GGRGID */
890 A(0,0,0), /* GGRENT */
891 A(0,0,0), /* SGRENT */
892 A(0,0,0), /* EGRENT */
893 A(1,1,0), /* SHUTDOWN */
894 A(1,1,0), /* OPENDIR */
895 A(1,0,0), /* READDIR */
896 A(1,0,0), /* TELLDIR */
897 A(1,1,0), /* SEEKDIR */
898 A(1,0,0), /* REWINDDIR */
899 A(1,0,0), /* CLOSEDIR */
900 A(0,0,0), /* GETLOGIN */
901 A(1,3,0), /* SYSCALL */
902 A(1,1,1), /* GSOCKOPT */
903 A(1,1,1), /* SSOCKOPT */
904 A(1,0,0), /* GETSOCKNAME */
905 A(1,0,0), /* GETPEERNAME */
906 A(0,3,3), /* LSLICE */
907 A(0,3,1), /* SPLICE */
908 A(1,0,0), /* BINMODE */
909 A(1,0,0), /* REQUIRE */
910 A(1,1,0), /* TRUNCATE */