1 /* $RCSfile: arg.h,v $$Revision: 4.0.1.3 $$Date: 92/06/08 11:44:06 $
3 * Copyright (c) 1991, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
9 * Revision 4.0.1.3 92/06/08 11:44:06 lwall
10 * patch20: O_PIPE conflicted with Atari
11 * patch20: clarified debugging output for literals and double-quoted strings
13 * Revision 4.0.1.2 91/11/05 15:51:05 lwall
14 * patch11: added eval {}
15 * patch11: added sort {} LIST
17 * Revision 4.0.1.1 91/06/07 10:18:30 lwall
18 * patch4: length($`), length($&), length($') now optimized to avoid string copy
19 * patch4: new copyright notice
20 * patch4: many, many itty-bitty portability fixes
22 * Revision 4.0 91/03/20 01:03:09 lwall
53 #define O_LEFT_SHIFT 26
54 #define O_RIGHT_SHIFT 27
67 #define O_COND_EXPR 40
71 #define O_COMPLEMENT 44
134 #define O_SYSREAD 107
135 #define O_SYSWRITE 108
148 #define O_LOCALTIME 121
150 #define O_TRUNCATE 123
172 #define O_WAITPID 145
174 #define O_EXEC_OP 147
192 #define O_SHMREAD 165
193 #define O_SHMWRITE 166
198 #define O_GETPPID 171
199 #define O_GETPGRP 172
200 #define O_SETPGRP 173
201 #define O_GETPRIORITY 174
202 #define O_SETPRIORITY 175
207 #define O_UNSHIFT 180
208 #define O_REQUIRE 181
211 #define O_FTRREAD 184
212 #define O_FTRWRITE 185
213 #define O_FTREXEC 186
214 #define O_FTEREAD 187
215 #define O_FTEWRITE 188
216 #define O_FTEEXEC 189
218 #define O_FTEOWNED 191
219 #define O_FTROWNED 192
222 #define O_FTMTIME 195
223 #define O_FTATIME 196
224 #define O_FTCTIME 197
232 #define O_SYMLINK 205
233 #define O_READLINK 206
239 #define O_FTBINARY 212
242 #define O_CONNECT 215
245 #define O_GHBYNAME 218
246 #define O_GHBYADDR 219
247 #define O_GHOSTENT 220
248 #define O_GNBYNAME 221
249 #define O_GNBYADDR 222
250 #define O_GNETENT 223
251 #define O_GPBYNAME 224
252 #define O_GPBYNUMBER 225
253 #define O_GPROTOENT 226
254 #define O_GSBYNAME 227
255 #define O_GSBYPORT 228
256 #define O_GSERVENT 229
257 #define O_SHOSTENT 230
258 #define O_SNETENT 231
259 #define O_SPROTOENT 232
260 #define O_SSERVENT 233
261 #define O_EHOSTENT 234
262 #define O_ENETENT 235
263 #define O_EPROTOENT 236
264 #define O_ESERVENT 237
265 #define O_SOCKPAIR 238
266 #define O_SHUTDOWN 239
267 #define O_GSOCKOPT 240
268 #define O_SSOCKOPT 241
269 #define O_GETSOCKNAME 242
270 #define O_GETPEERNAME 243
271 #define O_SSELECT 244
273 #define O_BINMODE 246
285 #define O_GETLOGIN 258
286 #define O_OPEN_DIR 259
287 #define O_READDIR 260
288 #define O_TELLDIR 261
289 #define O_SEEKDIR 262
290 #define O_REWINDDIR 263
291 #define O_CLOSEDIR 264
292 #define O_SYSCALL 265
293 #define O_PIPE_OP 266
295 #define O_EVALONCE 268
299 extern char *opname[];
592 #define A_LARYSTAB 17
595 #define A_WANTARRAY 20
599 #define A_DONT 32 /* or this into type to suppress evaluation */
602 extern char *argname[];
632 extern bool hoistable[];
672 union argptr arg_ptr;
674 unsigned short arg_type;
675 unsigned short arg_flags;
678 #define AF_ARYOK 1 /* op can handle multiple values here */
679 #define AF_POST 2 /* post *crement this item */
680 #define AF_PRE 4 /* pre *crement this item */
681 #define AF_UP 8 /* increment rather than decrement */
682 #define AF_COMMON 16 /* left and right have symbols in common */
683 #define AF_DEPR 32 /* an older form of the construct */
684 #define AF_LISTISH 64 /* turn into list if important */
685 #define AF_LOCAL 128 /* list of local variables */
688 * Most of the ARG pointers are used as pointers to arrays of ARG. When
689 * so used, the 0th element is special, and represents the operator to
690 * use on the list of arguments following. The arg_len in the 0th element
691 * gives the maximum argument number, and the arg_str is used to store
692 * the return value in a more-or-less static location. Sorry it's not
693 * re-entrant (yet), but it sure makes it efficient. The arg_type of the
694 * 0th element is an operator (O_*) rather than an argument type (A_*).
697 #define Nullarg Null(ARG*)
700 EXT unsigned short opargs[MAXO+1];
702 #define A(e1,e2,e3) (e1+(e2<<2)+(e3<<4))
703 #define A5(e1,e2,e3,e4,e5) (e1+(e2<<2)+(e3<<4)+(e4<<6)+(e5<<8))
704 unsigned short opargs[MAXO+1] = {
708 A(1,0,0), /* SCALAR */
709 A(0,0,0), /* ITEM2 */
710 A(0,0,0), /* ITEM3 */
711 A(1,1,0), /* CONCAT */
712 A(3,1,0), /* REPEAT */
713 A(1,0,0), /* MATCH */
714 A(1,0,0), /* NMATCH */
715 A(1,0,0), /* SUBST */
716 A(1,0,0), /* NSUBST */
717 A(1,1,0), /* ASSIGN */
718 A(1,0,0), /* LOCAL */
719 A(3,3,0), /* AASSIGN */
720 A(0,0,0), /* SASSIGN */
722 A(1,0,0), /* DEFINED */
723 A(1,0,0), /* UNDEF */
724 A(1,0,0), /* STUDY */
726 A(1,1,0), /* MULTIPLY */
727 A(1,1,0), /* DIVIDE */
728 A(1,1,0), /* MODULO */
730 A(1,1,0), /* SUBTRACT */
731 A(1,1,0), /* LEFT_SHIFT */
732 A(1,1,0), /* RIGHT_SHIFT */
740 A(1,1,0), /* BIT_AND */
742 A(1,1,0), /* BIT_OR */
745 A(1,0,0), /* COND_EXPR */
746 A(1,1,0), /* COMMA */
747 A(1,0,0), /* NEGATE */
749 A(1,0,0), /* COMPLEMENT */
750 A(1,0,0), /* SELECT */
751 A(1,0,0), /* WRITE */
752 A(1,1,1), /* DBMOPEN */
753 A(1,0,0), /* DBMCLOSE */
755 A(1,0,0), /* TRANS */
756 A(1,0,0), /* NTRANS */
757 A(1,0,0), /* CLOSE */
759 A(0,0,0), /* VALUES */
761 A(0,0,0), /* LARRAY */
762 A(0,0,0), /* ARRAY */
763 A(0,1,0), /* AELEM */
764 A(0,1,0), /* DELETE */
765 A(0,0,0), /* LHASH */
767 A(0,1,0), /* HELEM */
768 A(0,1,0), /* LAELEM */
769 A(0,1,0), /* LHELEM */
770 A(0,3,3), /* LSLICE */
771 A(0,3,0), /* ASLICE */
772 A(0,3,0), /* HSLICE */
773 A(0,3,0), /* LASLICE */
774 A(0,3,0), /* LHSLICE */
775 A(0,3,1), /* SPLICE */
778 A(0,0,0), /* SHIFT */
779 A(1,1,0), /* UNPACK */
780 A(1,0,1), /* SPLIT */
781 A(1,0,0), /* LENGTH */
782 A(3,0,0), /* SPRINTF */
783 A(1,1,1), /* SUBSTR */
795 A(0,3,0), /* DBSUBR */
796 A(1,0,0), /* CALLER */
798 A(0,3,0), /* REVERSE */
801 A(1,3,0), /* PRINTF */
802 A(1,3,0), /* PRINT */
803 A(1,0,0), /* CHDIR */
805 A(1,0,0), /* RESET */
810 A5(1,1,1,1,0), /* RECV */
812 A(1,1,3), /* SYSREAD */
813 A(1,1,3), /* SYSWRITE */
816 A(0,3,0), /* RETURN */
822 A(1,1,1), /* INDEX */
823 A(1,1,1), /* RINDEX */
825 A(0,0,0), /* TIMES */
826 A(1,0,0), /* LOCALTIME */
827 A(1,0,0), /* GMTIME */
828 A(1,1,0), /* TRUNCATE */
829 A(1,0,0), /* LSTAT */
831 A(1,1,0), /* CRYPT */
832 A(1,1,0), /* ATAN2 */
836 A(1,0,0), /* SRAND */
842 A(1,0,0), /* ALARM */
843 A(1,0,0), /* SLEEP */
844 A(1,1,0), /* RANGE */
845 A(1,0,0), /* F_OR_R */
850 A(1,1,0), /* WAITPID */
851 A(1,3,0), /* SYSTEM */
855 A(0,3,0), /* CHOWN */
857 A(0,3,0), /* UNLINK */
858 A(0,3,0), /* CHMOD */
859 A(0,3,0), /* UTIME */
860 A(1,0,0), /* UMASK */
861 A(1,1,0), /* MSGGET */
862 A(1,1,1), /* SHMGET */
863 A(1,1,1), /* SEMGET */
864 A(1,1,1), /* MSGCTL */
865 A(1,1,1), /* SHMCTL */
866 A5(1,1,1,1,0), /* SEMCTL */
867 A(1,1,1), /* MSGSND */
868 A5(1,1,1,1,1), /* MSGRCV */
869 A(1,1,1), /* SEMOP */
870 A5(1,1,1,1,0), /* SHMREAD */
871 A5(1,1,1,1,0), /* SHMWRITE */
872 A(1,1,0), /* RENAME */
874 A(1,1,0), /* MKDIR */
875 A(1,0,0), /* RMDIR */
876 A(0,0,0), /* GETPPID */
877 A(1,0,0), /* GETPGRP */
878 A(1,1,0), /* SETPGRP */
879 A(1,1,0), /* GETPRIORITY */
880 A(1,1,1), /* SETPRIORITY */
881 A(1,0,0), /* CHROOT */
882 A(1,1,1), /* FCNTL */
883 A(1,1,1), /* SYSIOCTL */
884 A(1,1,0), /* FLOCK */
885 A(0,3,0), /* UNSHIFT */
886 A(1,0,0), /* REQUIRE */
887 A(1,0,0), /* DOFILE */
889 A(1,0,0), /* FTRREAD */
890 A(1,0,0), /* FTRWRITE */
891 A(1,0,0), /* FTREXEC */
892 A(1,0,0), /* FTEREAD */
893 A(1,0,0), /* FTEWRITE */
894 A(1,0,0), /* FTEEXEC */
896 A(1,0,0), /* FTEOWNED */
897 A(1,0,0), /* FTROWNED */
898 A(1,0,0), /* FTZERO */
899 A(1,0,0), /* FTSIZE */
900 A(1,0,0), /* FTMTIME */
901 A(1,0,0), /* FTATIME */
902 A(1,0,0), /* FTCTIME */
903 A(1,0,0), /* FTSOCK */
904 A(1,0,0), /* FTCHR */
905 A(1,0,0), /* FTBLK */
906 A(1,0,0), /* FTFILE */
907 A(1,0,0), /* FTDIR */
908 A(1,0,0), /* FTPIPE */
909 A(1,0,0), /* FTLINK */
910 A(1,1,0), /* SYMLINK */
911 A(1,0,0), /* READLINK */
912 A(1,0,0), /* FTSUID */
913 A(1,0,0), /* FTSGID */
914 A(1,0,0), /* FTSVTX */
915 A(1,0,0), /* FTTTY */
916 A(1,0,0), /* FTTEXT */
917 A(1,0,0), /* FTBINARY */
918 A5(1,1,1,1,0), /* SOCKET */
920 A(1,1,0), /* CONNECT */
921 A(1,1,0), /* LISTEN */
922 A(1,1,0), /* ACCEPT */
923 A(1,0,0), /* GHBYNAME */
924 A(1,1,0), /* GHBYADDR */
925 A(0,0,0), /* GHOSTENT */
926 A(1,0,0), /* GNBYNAME */
927 A(1,1,0), /* GNBYADDR */
928 A(0,0,0), /* GNETENT */
929 A(1,0,0), /* GPBYNAME */
930 A(1,0,0), /* GPBYNUMBER */
931 A(0,0,0), /* GPROTOENT */
932 A(1,1,0), /* GSBYNAME */
933 A(1,1,0), /* GSBYPORT */
934 A(0,0,0), /* GSERVENT */
935 A(1,0,0), /* SHOSTENT */
936 A(1,0,0), /* SNETENT */
937 A(1,0,0), /* SPROTOENT */
938 A(1,0,0), /* SSERVENT */
939 A(0,0,0), /* EHOSTENT */
940 A(0,0,0), /* ENETENT */
941 A(0,0,0), /* EPROTOENT */
942 A(0,0,0), /* ESERVENT */
943 A5(1,1,1,1,1), /* SOCKPAIR */
944 A(1,1,0), /* SHUTDOWN */
945 A(1,1,1), /* GSOCKOPT */
946 A5(1,1,1,1,0), /* SSOCKOPT */
947 A(1,0,0), /* GETSOCKNAME */
948 A(1,0,0), /* GETPEERNAME */
949 A5(1,1,1,1,0), /* SSELECT */
950 A(1,0,0), /* FILENO */
951 A(1,0,0), /* BINMODE */
953 A(1,0,0), /* GPWNAM */
954 A(1,0,0), /* GPWUID */
955 A(0,0,0), /* GPWENT */
956 A(0,0,0), /* SPWENT */
957 A(0,0,0), /* EPWENT */
958 A(1,0,0), /* GGRNAM */
959 A(1,0,0), /* GGRGID */
960 A(0,0,0), /* GGRENT */
961 A(0,0,0), /* SGRENT */
962 A(0,0,0), /* EGRENT */
963 A(0,0,0), /* GETLOGIN */
964 A(1,1,0), /* OPENDIR */
965 A(1,0,0), /* READDIR */
966 A(1,0,0), /* TELLDIR */
967 A(1,1,0), /* SEEKDIR */
968 A(1,0,0), /* REWINDDIR */
969 A(1,0,0), /* CLOSEDIR */
970 A(1,3,0), /* SYSCALL */
973 A(1,0,0), /* EVALONCE */