3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2005 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
15 bool realexit = FALSE;
16 bool saw_getline = FALSE;
17 bool subretnum = FALSE;
19 bool saw_argv0 = FALSE;
28 static void addsemi ( STR *str );
29 static void emit_split ( STR *str, int level );
30 static void fixtab ( STR *str, int lvl );
31 static void numericize ( int node );
32 static void tab ( STR *str, int lvl );
34 int prewalk ( int numit, int level, int node, int *numericptr );
35 STR * walk ( int useval, int level, int node, int *numericptr, int minprec );
37 char *savestr(char *str);
38 char *cpytill(register char *to, register char *from, register int delim);
39 char *instr(char *big, const char *little);
43 walk(int useval, int level, register int node, int *numericptr, int minprec)
57 int prec = P_MAX; /* assume no parens needed */
63 type = ops[node].ival;
70 while (isALPHA(*namelist)) {
71 for (d = tokenbuf,s=namelist;
72 isALPHA(*s) || isDIGIT(*s) || *s == '_';
75 while (*s && !isALPHA(*s)) s++;
77 nameary[++arymax] = savestr(tokenbuf);
84 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
85 if (do_split && need_entire && !absmaxfld)
86 split_to_array = TRUE;
87 if (fswitch && !const_FS)
89 if (saw_FS > 1 || saw_RS)
91 if (saw_ORS && need_entire)
94 str_cat(str,"$FS = '");
95 if (strchr("*+?.[]()|^$\\",fswitch))
97 sprintf(tokenbuf,"%c",fswitch);
98 str_cat(str,tokenbuf);
99 str_cat(str,"';\t\t# field separator from -F switch\n");
101 else if (saw_FS && !const_FS) {
102 str_cat(str,"$FS = ' ';\t\t# set field separator\n");
105 str_cat(str,"$, = ' ';\t\t# set output field separator\n");
108 str_cat(str,"$\\ = \"\\n\";\t\t# set output record separator\n");
111 str_cat(str,"$ARGV0 = $0;\t\t# remember what we ran as\n");
113 if (str->str_cur > 20)
115 if (ops[node+2].ival) {
116 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
120 fstr = walk(0,level+1,ops[node+3].ival,&numarg,P_MIN);
121 if (*fstr->str_ptr) {
123 str_cat(str,"line: ");
124 str_cat(str,"while (<>) {\n");
126 if (saw_FS && !const_FS)
129 str_cat(str,"chomp;\t# strip record separator\n");
133 emit_split(str,level);
139 str_cat(str,"continue {\n $FNRbase = $. if eof;\n}\n");
142 str_cat(str,"while (<>) { } # (no line actions)\n");
143 if (ops[node+4].ival) {
147 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
152 str_cat(str,"exit $ExitValue;\n");
158 for (len = 0; len < 4; len++) {
159 if (saw_getline & (1 << len)) {
160 sprintf(tokenbuf,"\nsub Getline%d {\n",len);
161 str_cat(str, tokenbuf);
164 str_cat(str," &Pick('',@_);\n");
166 str_cat(str," ($fh) = @_;\n");
170 str_cat(str," $FNRbase = $. if eof;\n");
173 str_cat(str," local($_);\n");
176 " if ($getline_ok = (($_ = <$fh>) ne ''))");
179 " if ($getline_ok = (($_ = <>) ne ''))");
180 str_cat(str, " {\n");
186 str_cat(str,"chomp;\t# strip record separator\n");
189 if (do_split && !(len & 1)) {
191 emit_split(str,level);
196 str_cat(str,"}\n $_;\n}\n");
201 if (do_fancy_opens) {
204 local($mode,$name,$pipe) = @_;\n\
206 open($name,$mode.$name.$pipe) unless $opened{$name}++;\n\
212 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
213 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
216 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
224 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
226 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
234 tmpstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN);
235 /* translate \nnn to [\nnn] */
236 for (s = tmpstr->str_ptr, d = tokenbuf; *s; s++, d++) {
237 if (*s == '\\' && isDIGIT(s[1]) && isDIGIT(s[2]) && isDIGIT(s[3])){
249 for (d=tokenbuf; *d; d++)
251 str_cat(str,tokenbuf);
258 str = walk(0,level,oper1(OPRINT,0),&numarg,P_MIN);
260 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
265 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
266 if (*tmpstr->str_ptr) {
269 str_scat(str,tmpstr);
270 str_cat(str,") {\n");
272 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
279 str = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
286 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
292 str = walk(1,level,ops[node+1].ival,&numarg,prec);
294 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
296 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
301 str = walk(1,level,ops[node+1].ival,&numarg,prec);
303 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
305 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
312 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
317 str = walk(1,level,ops[node+1].ival,&numarg,prec);
319 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
322 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
328 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
335 str = walk(1,level,ops[node+1].ival,&numarg,prec);
338 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
340 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
345 str = walk(1,level,ops[node+1].ival,&numarg,prec);
348 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
350 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
357 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
363 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
365 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
366 tmp2str = walk(1,level,ops[node+3].ival,&numarg,prec+1);
369 (!numarg && (*tmp2str->str_ptr == '"' || *tmp2str->str_ptr == '\''))) {
372 str_set(tmpstr,"eq");
373 else if (strEQ(t,"!="))
374 str_set(tmpstr,"ne");
375 else if (strEQ(t,"<"))
376 str_set(tmpstr,"lt");
377 else if (strEQ(t,"<="))
378 str_set(tmpstr,"le");
379 else if (strEQ(t,">"))
380 str_set(tmpstr,"gt");
381 else if (strEQ(t,">="))
382 str_set(tmpstr,"ge");
383 if (!strchr(tmpstr->str_ptr,'\'') && !strchr(tmpstr->str_ptr,'"') &&
384 !strchr(tmp2str->str_ptr,'\'') && !strchr(tmp2str->str_ptr,'"') )
388 if (numeric & 1) /* numeric is very good guess */
396 str_scat(str,tmpstr);
399 str_scat(str,tmp2str);
406 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
413 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
415 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
416 if (strEQ(tmpstr->str_ptr,"~"))
419 str_scat(str,tmpstr);
423 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
431 fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
438 type = ops[ops[node+1].ival].ival & 255;
439 str = walk(1,level,ops[node+1].ival,&numarg,prec+(type != OCONCAT));
441 type = ops[ops[node+2].ival].ival & 255;
443 fstr=walk(1,level,ops[node+2].ival,&numarg,prec+(type != OCONCAT)));
448 str = walk(0,level,ops[node+2].ival,&numarg,prec+1);
450 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
451 str_scat(str,tmpstr);
452 if (str_len(tmpstr) > 1)
456 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec));
459 if (strEQ(str->str_ptr,"$/ = ''"))
460 str_set(str, "$/ = \"\\n\\n\"");
464 str = walk(1,level,ops[node+1].ival,&numarg,prec);
466 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
472 str = walk(1,level,ops[node+1].ival,&numarg,prec);
474 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
480 str = walk(1,level,ops[node+1].ival,&numarg,prec);
482 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
488 str = walk(1,level,ops[node+1].ival,&numarg,prec);
490 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
496 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
498 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec));
504 str = walk(1,level,ops[node+1].ival,&numarg,prec);
506 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
512 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
518 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
526 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
534 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
542 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
553 fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
563 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
564 if (!*fstr->str_ptr) {
566 len = 2; /* a legal fiction */
573 tmpstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN);
574 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
575 if (!do_fancy_opens) {
577 if (*t == '"' || *t == '\'')
578 t = cpytill(tokenbuf,t+1,*t);
580 fatal("Internal error: OGETLINE %s", t);
582 s = savestr(tokenbuf);
583 for (t = tokenbuf; *t; t++) {
587 if (!isALPHA(*t) && !isDIGIT(*t))
590 if (!strchr(tokenbuf,'_'))
592 tmp3str = hfetch(symtab,tokenbuf);
595 str_cat(opens,"open(");
596 str_cat(opens,tokenbuf);
600 str_cat(opens,tmpstr->str_ptr+1);
602 if (*fstr->str_ptr == '|')
605 if (*fstr->str_ptr == '|')
606 str_cat(opens,") || die 'Cannot pipe from \"");
608 str_cat(opens,") || die 'Cannot open file \"");
610 str_cat(opens,"'.\"");
613 str_cat(opens,"\".'");
614 str_cat(opens,"\".';\n");
615 hstore(symtab,tokenbuf,str_make("x"));
620 str_cat(tmpstr,tokenbuf);
623 if (*fstr->str_ptr == '|')
624 str_cat(tmpstr,", '|'");
628 tmpstr = str_make("");
629 sprintf(tokenbuf," = &Getline%d(%s)",len,tmpstr->str_ptr);
630 str_cat(str,tokenbuf);
633 str_cat(str,",$getline_ok)");
634 saw_getline |= 1 << len;
638 str_set(str,"sprintf(");
639 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
645 str_set(str,"substr(");
646 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
649 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
654 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1));
661 str_set(str,ops[node+1].cval);
667 tmpstr = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
672 str_scat(str,tmpstr);
673 str_cat(str," = split(");
675 fstr = walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1);
676 if (str_len(fstr) == 3 && *fstr->str_ptr == '\'') {
677 i = fstr->str_ptr[1] & 127;
678 if (strchr("*+?.[]()|^$\\",i))
679 sprintf(tokenbuf,"/\\%c/",i);
681 sprintf(tokenbuf,"' '");
683 sprintf(tokenbuf,"/%c/",i);
684 str_cat(str,tokenbuf);
691 sprintf(tokenbuf,"/[%c\\n]/",const_FS);
692 str_cat(str,tokenbuf);
701 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
711 str_set(str,"(1+index(");
712 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
715 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
723 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MATCH+1));
726 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MATCH+1));
728 str_cat(str," ? scalar($RLENGTH = length($&), $RSTART = length($`)+1) : 0");
734 fstr=walk(1,level-1,ops[node+2].ival,&numarg,P_MIN);
735 curargs = str_new(0);
736 str_sset(curargs,fstr);
737 str_cat(curargs,",");
738 tmp2str=walk(1,level,ops[node+5].ival,&numarg,P_MIN);
744 t = tmp2str->str_ptr;
745 while ((t = instr(t,"return ")))
749 for (t = s+7; *t; t++) {
750 if (*t == ';' || *t == '}')
755 tmp2str->str_cur -= 7;
761 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
765 str_cat(str,"local(");
767 str_cat(str,") = @_;");
770 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
773 str_scat(str,fstr=walk(1,level,ops[node+4].ival,&numarg,P_MIN));
776 str_scat(str,tmp2str);
784 tmp2str = str_new(0);
786 str_set(tmp2str,"1");
787 hstore(symtab,tmpstr->str_ptr,tmp2str);
794 str_cat(str,"return ");
795 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_UNI+1));
801 str_cat(str,"return");
806 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
809 tmpstr = hfetch(symtab,str->str_ptr+3);
810 if (tmpstr && tmpstr->str_ptr)
811 numeric |= atoi(tmpstr->str_ptr);
812 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
818 int gsub = type == OGSUB ? 1 : 0;
823 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MATCH+1);
824 if (strNE(tmpstr->str_ptr,"$_")) {
825 str_cat(tmpstr, " =~ s");
829 str_set(tmpstr, "s");
832 str_set(tmpstr, "s");
833 type = ops[ops[node+2].ival].ival;
836 tmp3str = str_new(0);
840 tmp2str=walk(1,level,ops[ops[node+2].ival+1].ival,&numarg,P_MIN);
841 for (t = tmp2str->str_ptr, d=tokenbuf; *t; d++,t++) {
843 *d++ = '$' + (char)128;
844 else if (*t == '$' || *t == '/')
845 *d++ = '\\' + (char)128;
849 str_set(tmp2str,tokenbuf);
850 s = (gsub ? "/g" : "/");
853 tmp2str=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
854 str_set(tmp3str,"($s_ = '\"'.(");
855 str_scat(tmp3str,tmp2str);
856 str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, ");
857 str_set(tmp2str,"eval $s_");
858 s = (gsub ? "/ge" : "/e");
863 type = ops[ops[node+1].ival].ival;
866 fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN);
867 if (type == OREGEX) {
870 str_scat(str,tmp3str);
871 str_scat(str,tmpstr);
873 str_scat(str,tmp2str);
875 else if ((type == OFLD && !split_to_array) || (type == OVAR && len == 1)) {
878 str_scat(str,tmp3str);
879 str_scat(str,tmpstr);
883 str_scat(str,tmp2str);
889 str_cat(str,"$s = ");
892 str_scat(str,tmp3str);
893 str_scat(str,tmpstr);
895 str_scat(str,tmp2str);
906 str = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
910 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
913 for (t = tmpstr->str_ptr, d=tokenbuf; *t; d++,t++) {
916 else if (*t == '\\') {
920 case '\\': case '"': case 'n': case 't': case '$':
922 default: /* hide this from perl */
923 *d++ = '\\' + (char)128;
931 str_cat(str,tokenbuf);
939 str_set(str,"defined $");
943 str_set(str,"delete $");
953 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
955 tmp2str = hfetch(symtab,tmpstr->str_ptr);
956 if (tmp2str && atoi(tmp2str->str_ptr))
958 if (strEQ(str->str_ptr,"$FNR")) {
961 str_set(str,"($.-$FNRbase)");
963 else if (strEQ(str->str_ptr,"$NR")) {
967 else if (strEQ(str->str_ptr,"$NF")) {
969 str_set(str,"($#Fld+1)");
971 else if (strEQ(str->str_ptr,"$0"))
973 else if (strEQ(str->str_ptr,"$ARGC"))
974 str_set(str,"($#ARGV+2)");
979 sprintf(tokenbuf,"$%s,",tmpstr->str_ptr);
980 ??? if (instr(curargs->str_ptr,tokenbuf))
981 str_cat(str,"\377"); /* can't translate yet */
984 str_cat(tmpstr,"[]");
985 tmp2str = hfetch(symtab,tmpstr->str_ptr);
986 if (tmp2str && atoi(tmp2str->str_ptr))
990 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
992 if (strEQ(str->str_ptr,"$ARGV[0")) {
993 str_set(str,"$ARGV0");
997 if (tmp2str && atoi(tmp2str->str_ptr))
998 strcpy(tokenbuf,")-1]");
1000 strcpy(tokenbuf,"}");
1001 *tokenbuf += (char)128;
1002 str_cat(str,tokenbuf);
1009 if (split_to_array) {
1010 str_set(str,"$Fld");
1012 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1014 str_cat(str,")-1]");
1017 i = atoi(walk(1,level,ops[node+1].ival,&numarg,P_MIN)->str_ptr);
1019 sprintf(tokenbuf,"$%s",nameary[i]);
1021 sprintf(tokenbuf,"$Fld%d",i);
1022 str_set(str,tokenbuf);
1027 str_set(str,"$Fld[");
1028 i = ops[node+1].ival;
1029 if ((ops[i].ival & 255) == OPAREN)
1031 tmpstr=walk(1,level,i,&numarg,P_MIN);
1032 str_scat(str,tmpstr);
1051 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1052 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1054 str_scat(str,tmpstr);
1060 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1061 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1063 str_scat(str,tmpstr);
1069 str = walk(1,level,ops[node+1].ival,&numarg,prec);
1071 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
1073 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
1082 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1083 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1089 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1092 tmpstr = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
1093 if (*tmpstr->str_ptr == ';') {
1095 str_cat(str,tmpstr->str_ptr+1);
1102 str = str_make("close(");
1103 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1104 if (!do_fancy_opens) {
1105 t = tmpstr->str_ptr;
1106 if (*t == '"' || *t == '\'')
1107 t = cpytill(tokenbuf,t+1,*t);
1109 fatal("Internal error: OCLOSE %s",t);
1110 s = savestr(tokenbuf);
1111 for (t = tokenbuf; *t; t++) {
1115 if (!isALPHA(*t) && !isDIGIT(*t))
1118 if (!strchr(tokenbuf,'_'))
1122 str_set(str,"close ");
1123 str_cat(str,tokenbuf);
1126 sprintf(tokenbuf,"delete $opened{%s} && close(%s)",
1127 tmpstr->str_ptr, tmpstr->str_ptr);
1129 str_set(str,tokenbuf);
1134 lparen = ""; /* set to parens if necessary */
1137 if (len == 3) { /* output redirection */
1138 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MIN);
1139 tmp2str = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1140 if (!do_fancy_opens) {
1141 t = tmpstr->str_ptr;
1142 if (*t == '"' || *t == '\'')
1143 t = cpytill(tokenbuf,t+1,*t);
1145 fatal("Internal error: OPRINT");
1147 s = savestr(tokenbuf);
1148 for (t = tokenbuf; *t; t++) {
1152 if (!isALPHA(*t) && !isDIGIT(*t))
1155 if (!strchr(tokenbuf,'_'))
1157 tmp3str = hfetch(symtab,tokenbuf);
1159 str_cat(opens,"open(");
1160 str_cat(opens,tokenbuf);
1161 str_cat(opens,", ");
1164 str_scat(opens,tmp2str);
1165 str_cat(opens,tmpstr->str_ptr+1);
1166 if (*tmp2str->str_ptr == '|')
1167 str_cat(opens,") || die 'Cannot pipe to \"");
1169 str_cat(opens,") || die 'Cannot create file \"");
1171 str_cat(opens,"'.\"");
1174 str_cat(opens,"\".'");
1175 str_cat(opens,"\".';\n");
1176 hstore(symtab,tokenbuf,str_make("x"));
1184 sprintf(tokenbuf,"&Pick('%s', %s) &&\n",
1185 tmp2str->str_ptr, tmpstr->str_ptr);
1186 str_cat(str,tokenbuf);
1188 strcpy(tokenbuf,"$fh");
1196 strcpy(tokenbuf,"");
1197 str_cat(str,lparen); /* may be null */
1198 if (type == OPRINTF)
1199 str_cat(str,"printf");
1201 str_cat(str,"print");
1203 if (len == 3 || do_fancy_opens) {
1208 str_cat(str,tokenbuf);
1210 tmpstr = walk(1+(type==OPRINT),level,ops[node+1].ival,&numarg,P_MIN);
1211 if (!*tmpstr->str_ptr && lval_field) {
1212 const char *t = (saw_OFS ? "$," : "' '");
1213 if (split_to_array) {
1214 sprintf(tokenbuf,"join(%s,@Fld)",t);
1215 str_cat(tmpstr,tokenbuf);
1218 for (i = 1; i < maxfld; i++) {
1220 sprintf(tokenbuf,"$%s, ",nameary[i]);
1222 sprintf(tokenbuf,"$Fld%d, ",i);
1223 str_cat(tmpstr,tokenbuf);
1225 if (maxfld <= arymax)
1226 sprintf(tokenbuf,"$%s",nameary[maxfld]);
1228 sprintf(tokenbuf,"$Fld%d",maxfld);
1229 str_cat(tmpstr,tokenbuf);
1232 if (*tmpstr->str_ptr) {
1234 if (!saw_fh && *tmpstr->str_ptr == '(') {
1236 str_scat(str,tmpstr);
1240 str_scat(str,tmpstr);
1245 str_cat(str,rparen); /* may be null */
1249 str = str_make("rand(1)");
1252 str = str_make("srand(");
1255 str = str_make("atan2(");
1258 str = str_make("sin(");
1261 str = str_make("cos(");
1264 str = str_make("system(");
1267 str = str_make("length(");
1270 str = str_make("log(");
1273 str = str_make("exp(");
1276 str = str_make("sqrt(");
1279 str = str_make("int(");
1283 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1285 tmpstr = str_new(0);
1286 if (!tmpstr->str_ptr || !*tmpstr->str_ptr) {
1288 const char *t = (saw_OFS ? "$," : "' '");
1289 if (split_to_array) {
1290 sprintf(tokenbuf,"join(%s,@Fld)",t);
1291 str_cat(tmpstr,tokenbuf);
1294 sprintf(tokenbuf,"join(%s, ",t);
1295 str_cat(tmpstr,tokenbuf);
1296 for (i = 1; i < maxfld; i++) {
1298 sprintf(tokenbuf,"$%s,",nameary[i]);
1300 sprintf(tokenbuf,"$Fld%d,",i);
1301 str_cat(tmpstr,tokenbuf);
1303 if (maxfld <= arymax)
1304 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1306 sprintf(tokenbuf,"$Fld%d)",maxfld);
1307 str_cat(tmpstr,tokenbuf);
1311 str_cat(tmpstr,"$_");
1313 if (strEQ(tmpstr->str_ptr,"$_")) {
1314 if (type == OLENGTH && !do_chop) {
1315 str = str_make("(length(");
1316 str_cat(tmpstr,") - 1");
1319 str_scat(str,tmpstr);
1325 str_set(str,"last");
1329 str_set(str,"next line");
1335 str_set(str,"exit");
1340 fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
1346 str_set(str,"$ExitValue = ");
1349 fstr=walk(1,level,ops[node+1].ival,&numarg,P_ASSIGN));
1353 str_cat(str,"last line");
1358 str_set(str,"next");
1364 str_set(str,"if (");
1365 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1368 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1371 i = ops[node+3].ival;
1373 if ((ops[i].ival & 255) == OBLOCK) {
1376 if ((ops[i].ival & 255) != OIF)
1385 str_scat(str,fstr=walk(0,level,i,&numarg,P_MIN));
1389 str_cat(str,"else ");
1390 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1397 str_set(str,"while (");
1398 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1401 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1407 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1409 if (str->str_ptr[str->str_cur - 1] == '\n')
1411 str_cat(str," while (");
1412 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1418 str_set(str,"for (");
1419 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1422 t = s = tmpstr->str_ptr;
1423 while (isALPHA(*t) || isDIGIT(*t) || *t == '$' || *t == '_')
1430 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1431 if (i && (t = strchr(fstr->str_ptr,0377))) {
1432 if (strnEQ(fstr->str_ptr,s,i))
1439 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
1442 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
1446 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1447 d = strchr(tmpstr->str_ptr,'$');
1449 fatal("Illegal for loop: %s",tmpstr->str_ptr);
1454 fatal("Illegal for loop: %s",d);
1456 for (t = s; (i = *t); t++) {
1458 if (i == '}' || i == ']')
1466 tmp2str = hfetch(symtab,str->str_ptr);
1467 if (tmp2str && atoi(tmp2str->str_ptr)) {
1469 "foreach %s (0 .. $#%s) ",
1475 "foreach %s (keys %%%s) ",
1479 str_set(str,tokenbuf);
1480 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1487 if (len >= 2 && ops[node+2].ival) {
1488 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1491 fixtab(str,++level);
1492 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1495 fixtab(str,--level);
1499 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1507 fatal("Garbage length in walk");
1508 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1509 for (i = 2; i<= len; i++) {
1510 str_scat(str,fstr=walk(0,level,ops[node+i].ival,&numarg,P_MIN));
1522 if (useval && prec < minprec) { /* need parens? */
1523 fstr = str_new(str->str_cur+2);
1524 str_nset(fstr,"(",1);
1526 str_ncat(fstr,")",1);
1531 *numericptr = numeric;
1534 printf("%3d %5d %15s %d %4d ",level,node,opname[type],len,str->str_cur);
1535 for (t = str->str_ptr; *t && t - str->str_ptr < 40; t++)
1538 else if (*t == '\t')
1549 tab(register STR *str, register int lvl)
1560 fixtab(register STR *str, register int lvl)
1564 /* strip trailing white space */
1566 s = str->str_ptr+str->str_cur - 1;
1567 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1570 str->str_cur = s + 1 - str->str_ptr;
1571 if (s >= str->str_ptr && *s != '\n')
1578 addsemi(register STR *str)
1582 s = str->str_ptr+str->str_cur - 1;
1583 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1585 if (s >= str->str_ptr && *s != ';' && *s != '}')
1590 emit_split(register STR *str, int level)
1595 str_cat(str,"@Fld");
1598 for (i = 1; i < maxfld; i++) {
1600 sprintf(tokenbuf,"$%s,",nameary[i]);
1602 sprintf(tokenbuf,"$Fld%d,",i);
1603 str_cat(str,tokenbuf);
1605 if (maxfld <= arymax)
1606 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1608 sprintf(tokenbuf,"$Fld%d)",maxfld);
1609 str_cat(str,tokenbuf);
1612 sprintf(tokenbuf," = split(/[%c\\n]/, $_, -1);\n",const_FS);
1613 str_cat(str,tokenbuf);
1616 str_cat(str," = split($FS, $_, -1);\n");
1618 str_cat(str," = split(' ', $_, -1);\n");
1623 prewalk(int numit, int level, register int node, int *numericptr)
1629 int numeric = FALSE;
1637 type = ops[node].ival;
1642 prewalk(0,level,ops[node+1].ival,&numarg);
1643 if (ops[node+2].ival) {
1644 prewalk(0,level,ops[node+2].ival,&numarg);
1647 prewalk(0,level,ops[node+3].ival,&numarg);
1649 if (ops[node+3].ival) {
1650 prewalk(0,level,ops[node+4].ival,&numarg);
1654 prewalk(0,level,ops[node+1].ival,&numarg);
1655 prewalk(0,level,ops[node+2].ival,&numarg);
1657 prewalk(0,level,ops[node+3].ival,&numarg);
1661 prewalk(1,level,ops[node+1].ival,&numarg);
1662 prewalk(1,level,ops[node+2].ival,&numarg);
1667 prewalk(0,level,ops[node+1].ival,&numarg);
1671 prewalk(0,level,ops[node+1].ival,&numarg);
1674 i = prewalk(0,level,ops[node+1].ival,&numarg);
1677 prewalk(0,level,ops[node+2].ival,&numarg);
1681 prewalk(0,level,ops[node+2].ival,&numarg);
1686 prewalk(0,level,ops[node+1].ival,&numarg);
1689 prewalk(0,level,ops[node+1].ival,&numarg);
1690 prewalk(0,level,ops[node+2].ival,&numarg);
1693 prewalk(0,level,ops[node+1].ival,&numarg);
1694 prewalk(0,level,ops[node+2].ival,&numarg);
1697 prewalk(0,level,ops[node+1].ival,&numarg);
1700 prewalk(0,level,ops[node+1].ival,&numarg);
1704 prewalk(0,level,ops[node+1].ival,&numarg);
1706 prewalk(0,level,ops[node+2].ival,&numarg);
1709 prewalk(0,level,ops[node+1].ival,&numarg);
1711 prewalk(0,level,ops[node+2].ival,&numarg);
1714 prewalk(0,level,ops[node+1].ival,&numarg);
1718 prewalk(0,level,ops[node+2].ival,&numarg);
1720 prewalk(0,level,ops[node+1].ival,&numarg);
1721 prewalk(0,level,ops[node+3].ival,&numarg);
1726 prewalk(0,level,ops[node+1].ival,&numarg);
1730 prewalk(0,level,ops[node+2].ival,&numarg);
1731 prewalk(0,level,ops[node+1].ival,&numarg);
1732 prewalk(0,level,ops[node+3].ival,&numarg);
1736 prewalk(0,level,ops[node+1].ival,&numarg);
1740 prewalk(0,level,ops[node+1].ival,&numarg);
1741 prewalk(0,level,ops[node+2].ival,&numarg);
1744 prewalk(0,level,ops[node+2].ival,&numarg);
1745 prewalk(0,level,ops[node+1].ival,&numarg);
1746 prewalk(0,level,ops[node+3].ival,&numarg);
1747 if (numarg || strlen(ops[ops[node+1].ival+1].cval) > (Size_t)1) {
1748 numericize(ops[node+2].ival);
1750 numericize(ops[node+3].ival);
1755 prewalk(1,level,ops[node+1].ival,&numarg);
1756 prewalk(1,level,ops[node+2].ival,&numarg);
1760 prewalk(1,level,ops[node+1].ival,&numarg);
1761 prewalk(1,level,ops[node+2].ival,&numarg);
1765 prewalk(1,level,ops[node+1].ival,&numarg);
1766 prewalk(1,level,ops[node+2].ival,&numarg);
1770 prewalk(1,level,ops[node+1].ival,&numarg);
1771 prewalk(1,level,ops[node+2].ival,&numarg);
1775 prewalk(1,level,ops[node+1].ival,&numarg);
1776 prewalk(1,level,ops[node+2].ival,&numarg);
1780 prewalk(1,level,ops[node+1].ival,&numarg);
1781 prewalk(1,level,ops[node+2].ival,&numarg);
1785 prewalk(1,level,ops[node+1].ival,&numarg);
1789 prewalk(1,level,ops[node+1].ival,&numarg);
1793 prewalk(1,level,ops[node+1].ival,&numarg);
1797 prewalk(1,level,ops[node+1].ival,&numarg);
1801 prewalk(1,level,ops[node+1].ival,&numarg);
1805 prewalk(1,level,ops[node+1].ival,&numarg);
1809 prewalk(0,level,ops[node+1].ival,&numarg);
1815 prewalk(0,level,ops[node+1].ival,&numarg);
1818 prewalk(0,level,ops[node+1].ival,&numarg);
1819 prewalk(1,level,ops[node+2].ival,&numarg);
1821 prewalk(1,level,ops[node+3].ival,&numarg);
1828 prewalk(0,level,ops[node+2].ival,&numarg);
1830 prewalk(0,level,ops[node+3].ival,&numarg);
1831 prewalk(0,level,ops[node+1].ival,&numarg);
1834 prewalk(0,level,ops[node+1].ival,&numarg);
1835 prewalk(0,level,ops[node+2].ival,&numarg);
1839 prewalk(0,level,ops[node+1].ival,&numarg);
1840 prewalk(0,level,ops[node+2].ival,&numarg);
1846 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1848 prewalk(0,level,ops[node+2].ival,&numarg);
1849 prewalk(0,level,ops[node+4].ival,&numarg);
1850 prewalk(0,level,ops[node+5].ival,&numarg);
1852 str_cat(tmpstr,"(");
1853 tmp2str = str_new(0);
1854 if (subretnum || numarg)
1855 str_set(tmp2str,"1");
1856 hstore(symtab,tmpstr->str_ptr,tmp2str);
1862 prewalk(0,level,ops[node+1].ival,&numarg);
1868 tmp2str = str_new(0);
1869 str_scat(tmp2str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1870 fixrargs(tmpstr->str_ptr,ops[node+2].ival,0);
1872 str_cat(tmp2str,"(");
1873 tmpstr = hfetch(symtab,tmp2str->str_ptr);
1874 if (tmpstr && tmpstr->str_ptr)
1875 numeric |= atoi(tmpstr->str_ptr);
1876 prewalk(0,level,ops[node+2].ival,&numarg);
1882 prewalk(0,level,ops[node+3].ival,&numarg);
1883 prewalk(0,level,ops[ops[node+2].ival+1].ival,&numarg);
1884 prewalk(0,level,ops[node+1].ival,&numarg);
1888 prewalk(0,level,ops[node+1].ival,&numarg);
1892 prewalk(0,level,ops[node+1].ival,&numarg);
1898 prewalk(0,level,ops[node+1].ival,&numarg);
1904 prewalk(0,level,ops[node+2].ival,&numarg);
1908 prewalk(0,level,ops[node+1].ival,&numarg);
1911 i = ops[node+1].ival;
1912 prewalk(0,level,i,&numarg);
1925 prewalk(0,level,ops[node+1].ival,&numarg);
1926 prewalk(0,level,ops[node+2].ival,&numarg);
1927 prewalk(0,level,ops[node+3].ival,&numarg);
1932 prewalk(0,level,ops[node+1].ival,&numarg);
1933 prewalk(0,level,ops[node+2].ival,&numarg);
1937 prewalk(0,level,ops[node+1].ival,&numarg);
1939 prewalk(0,level,ops[node+2].ival,&numarg);
1944 prewalk(0,level,ops[node+1].ival,&numarg);
1948 if (len == 3) { /* output redirection */
1949 prewalk(0,level,ops[node+3].ival,&numarg);
1950 prewalk(0,level,ops[node+2].ival,&numarg);
1952 prewalk(0+(type==OPRINT),level,ops[node+1].ival,&numarg);
1978 prewalk(type != OLENGTH && type != OSYSTEM,
1979 level,ops[node+1].ival,&numarg);
1987 prewalk(1,level,ops[node+1].ival,&numarg);
1995 prewalk(0,level,ops[node+1].ival,&numarg);
1996 prewalk(0,level,ops[node+2].ival,&numarg);
1998 prewalk(0,level,ops[node+3].ival,&numarg);
2002 prewalk(0,level,ops[node+1].ival,&numarg);
2003 prewalk(0,level,ops[node+2].ival,&numarg);
2006 prewalk(0,level,ops[node+1].ival,&numarg);
2007 prewalk(0,level,ops[node+2].ival,&numarg);
2008 prewalk(0,level,ops[node+3].ival,&numarg);
2009 prewalk(0,level,ops[node+4].ival,&numarg);
2012 prewalk(0,level,ops[node+2].ival,&numarg);
2013 prewalk(0,level,ops[node+1].ival,&numarg);
2017 prewalk(0,level,ops[node+2].ival,&numarg);
2020 prewalk(0,level,ops[node+1].ival,&numarg);
2027 fatal("Garbage length in prewalk");
2028 prewalk(0,level,ops[node+1].ival,&numarg);
2029 for (i = 2; i<= len; i++) {
2030 prewalk(0,level,ops[node+i].ival,&numarg);
2035 *numericptr = numeric;
2040 numericize(register int node)
2048 type = ops[node].ival;
2051 if (type == OVAR && len == 1) {
2052 tmpstr=walk(0,0,ops[node+1].ival,&numarg,P_MIN);
2053 tmp2str = str_make("1");
2054 hstore(symtab,tmpstr->str_ptr,tmp2str);