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 (do_split && split_to_array)
88 set_array_base = TRUE;
90 str_cat(str,"$[ = 1;\t\t\t# set array base to 1\n");
92 if (fswitch && !const_FS)
94 if (saw_FS > 1 || saw_RS)
96 if (saw_ORS && need_entire)
99 str_cat(str,"$FS = '");
100 if (strchr("*+?.[]()|^$\\",fswitch))
102 sprintf(tokenbuf,"%c",fswitch);
103 str_cat(str,tokenbuf);
104 str_cat(str,"';\t\t# field separator from -F switch\n");
106 else if (saw_FS && !const_FS) {
107 str_cat(str,"$FS = ' ';\t\t# set field separator\n");
110 str_cat(str,"$, = ' ';\t\t# set output field separator\n");
113 str_cat(str,"$\\ = \"\\n\";\t\t# set output record separator\n");
116 str_cat(str,"$ARGV0 = $0;\t\t# remember what we ran as\n");
118 if (str->str_cur > 20)
120 if (ops[node+2].ival) {
121 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
125 fstr = walk(0,level+1,ops[node+3].ival,&numarg,P_MIN);
126 if (*fstr->str_ptr) {
128 str_cat(str,"line: ");
129 str_cat(str,"while (<>) {\n");
131 if (saw_FS && !const_FS)
134 str_cat(str,"chomp;\t# strip record separator\n");
138 emit_split(str,level);
144 str_cat(str,"continue {\n $FNRbase = $. if eof;\n}\n");
147 str_cat(str,"while (<>) { } # (no line actions)\n");
148 if (ops[node+4].ival) {
152 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
157 str_cat(str,"exit $ExitValue;\n");
163 for (len = 0; len < 4; len++) {
164 if (saw_getline & (1 << len)) {
165 sprintf(tokenbuf,"\nsub Getline%d {\n",len);
166 str_cat(str, tokenbuf);
169 str_cat(str," &Pick('',@_);\n");
171 str_cat(str," ($fh) = @_;\n");
175 str_cat(str," $FNRbase = $. if eof;\n");
178 str_cat(str," local($_);\n");
181 " if ($getline_ok = (($_ = <$fh>) ne ''))");
184 " if ($getline_ok = (($_ = <>) ne ''))");
185 str_cat(str, " {\n");
191 str_cat(str,"chomp;\t# strip record separator\n");
194 if (do_split && !(len & 1)) {
196 emit_split(str,level);
201 str_cat(str,"}\n $_;\n}\n");
206 if (do_fancy_opens) {
209 local($mode,$name,$pipe) = @_;\n\
211 open($name,$mode.$name.$pipe) unless $opened{$name}++;\n\
217 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
218 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
221 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
229 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
231 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
239 tmpstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN);
240 /* translate \nnn to [\nnn] */
241 for (s = tmpstr->str_ptr, d = tokenbuf; *s; s++, d++) {
242 if (*s == '\\' && isDIGIT(s[1]) && isDIGIT(s[2]) && isDIGIT(s[3])){
254 for (d=tokenbuf; *d; d++)
256 str_cat(str,tokenbuf);
263 str = walk(0,level,oper1(OPRINT,0),&numarg,P_MIN);
265 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
270 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
271 if (*tmpstr->str_ptr) {
274 str_scat(str,tmpstr);
275 str_cat(str,") {\n");
277 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
284 str = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
291 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
297 str = walk(1,level,ops[node+1].ival,&numarg,prec);
299 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
301 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
306 str = walk(1,level,ops[node+1].ival,&numarg,prec);
308 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
310 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
317 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
322 str = walk(1,level,ops[node+1].ival,&numarg,prec);
324 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
327 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
333 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
340 str = walk(1,level,ops[node+1].ival,&numarg,prec);
343 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
345 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
350 str = walk(1,level,ops[node+1].ival,&numarg,prec);
353 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
355 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
362 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
368 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
370 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
371 tmp2str = walk(1,level,ops[node+3].ival,&numarg,prec+1);
374 (!numarg && (*tmp2str->str_ptr == '"' || *tmp2str->str_ptr == '\''))) {
377 str_set(tmpstr,"eq");
378 else if (strEQ(t,"!="))
379 str_set(tmpstr,"ne");
380 else if (strEQ(t,"<"))
381 str_set(tmpstr,"lt");
382 else if (strEQ(t,"<="))
383 str_set(tmpstr,"le");
384 else if (strEQ(t,">"))
385 str_set(tmpstr,"gt");
386 else if (strEQ(t,">="))
387 str_set(tmpstr,"ge");
388 if (!strchr(tmpstr->str_ptr,'\'') && !strchr(tmpstr->str_ptr,'"') &&
389 !strchr(tmp2str->str_ptr,'\'') && !strchr(tmp2str->str_ptr,'"') )
393 if (numeric & 1) /* numeric is very good guess */
401 str_scat(str,tmpstr);
404 str_scat(str,tmp2str);
411 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
418 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
420 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
421 if (strEQ(tmpstr->str_ptr,"~"))
424 str_scat(str,tmpstr);
428 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
436 fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
443 type = ops[ops[node+1].ival].ival & 255;
444 str = walk(1,level,ops[node+1].ival,&numarg,prec+(type != OCONCAT));
446 type = ops[ops[node+2].ival].ival & 255;
448 fstr=walk(1,level,ops[node+2].ival,&numarg,prec+(type != OCONCAT)));
453 str = walk(0,level,ops[node+2].ival,&numarg,prec+1);
455 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
456 str_scat(str,tmpstr);
457 if (str_len(tmpstr) > 1)
461 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec));
464 if (strEQ(str->str_ptr,"$/ = ''"))
465 str_set(str, "$/ = \"\\n\\n\"");
469 str = walk(1,level,ops[node+1].ival,&numarg,prec);
471 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
477 str = walk(1,level,ops[node+1].ival,&numarg,prec);
479 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
485 str = walk(1,level,ops[node+1].ival,&numarg,prec);
487 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
493 str = walk(1,level,ops[node+1].ival,&numarg,prec);
495 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
501 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
503 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec));
509 str = walk(1,level,ops[node+1].ival,&numarg,prec);
511 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
517 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
523 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
531 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
539 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
547 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
558 fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
568 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
569 if (!*fstr->str_ptr) {
571 len = 2; /* a legal fiction */
578 tmpstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN);
579 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
580 if (!do_fancy_opens) {
582 if (*t == '"' || *t == '\'')
583 t = cpytill(tokenbuf,t+1,*t);
585 fatal("Internal error: OGETLINE %s", t);
587 s = savestr(tokenbuf);
588 for (t = tokenbuf; *t; t++) {
592 if (!isALPHA(*t) && !isDIGIT(*t))
595 if (!strchr(tokenbuf,'_'))
597 tmp3str = hfetch(symtab,tokenbuf);
600 str_cat(opens,"open(");
601 str_cat(opens,tokenbuf);
605 str_cat(opens,tmpstr->str_ptr+1);
607 if (*fstr->str_ptr == '|')
610 if (*fstr->str_ptr == '|')
611 str_cat(opens,") || die 'Cannot pipe from \"");
613 str_cat(opens,") || die 'Cannot open file \"");
615 str_cat(opens,"'.\"");
618 str_cat(opens,"\".'");
619 str_cat(opens,"\".';\n");
620 hstore(symtab,tokenbuf,str_make("x"));
625 str_cat(tmpstr,tokenbuf);
628 if (*fstr->str_ptr == '|')
629 str_cat(tmpstr,", '|'");
633 tmpstr = str_make("");
634 sprintf(tokenbuf," = &Getline%d(%s)",len,tmpstr->str_ptr);
635 str_cat(str,tokenbuf);
638 str_cat(str,",$getline_ok)");
639 saw_getline |= 1 << len;
643 str_set(str,"sprintf(");
644 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
650 str_set(str,"substr(");
651 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
654 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
658 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1));
665 str_set(str,ops[node+1].cval);
671 tmpstr = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
676 str_scat(str,tmpstr);
677 str_cat(str," = split(");
679 fstr = walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1);
680 if (str_len(fstr) == 3 && *fstr->str_ptr == '\'') {
681 i = fstr->str_ptr[1] & 127;
682 if (strchr("*+?.[]()|^$\\",i))
683 sprintf(tokenbuf,"/\\%c/",i);
685 sprintf(tokenbuf,"' '");
687 sprintf(tokenbuf,"/%c/",i);
688 str_cat(str,tokenbuf);
695 sprintf(tokenbuf,"/[%c\\n]/",const_FS);
696 str_cat(str,tokenbuf);
705 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
715 str_set(str,"index(");
716 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
719 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
727 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MATCH+1));
730 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MATCH+1));
732 str_cat(str," && ($RLENGTH = length($&), $RSTART = length($`)+1)");
738 fstr=walk(1,level-1,ops[node+2].ival,&numarg,P_MIN);
739 curargs = str_new(0);
740 str_sset(curargs,fstr);
741 str_cat(curargs,",");
742 tmp2str=walk(1,level,ops[node+5].ival,&numarg,P_MIN);
748 t = tmp2str->str_ptr;
749 while ((t = instr(t,"return ")))
753 for (t = s+7; *t; t++) {
754 if (*t == ';' || *t == '}')
759 tmp2str->str_cur -= 7;
765 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
769 str_cat(str,"local(");
771 str_cat(str,") = @_;");
774 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
777 str_scat(str,fstr=walk(1,level,ops[node+4].ival,&numarg,P_MIN));
780 str_scat(str,tmp2str);
788 tmp2str = str_new(0);
790 str_set(tmp2str,"1");
791 hstore(symtab,tmpstr->str_ptr,tmp2str);
798 str_cat(str,"return ");
799 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_UNI+1));
805 str_cat(str,"return");
810 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
813 tmpstr = hfetch(symtab,str->str_ptr+3);
814 if (tmpstr && tmpstr->str_ptr)
815 numeric |= atoi(tmpstr->str_ptr);
816 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
822 int gsub = type == OGSUB ? 1 : 0;
827 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MATCH+1);
828 if (strNE(tmpstr->str_ptr,"$_")) {
829 str_cat(tmpstr, " =~ s");
833 str_set(tmpstr, "s");
836 str_set(tmpstr, "s");
837 type = ops[ops[node+2].ival].ival;
840 tmp3str = str_new(0);
844 tmp2str=walk(1,level,ops[ops[node+2].ival+1].ival,&numarg,P_MIN);
845 for (t = tmp2str->str_ptr, d=tokenbuf; *t; d++,t++) {
847 *d++ = '$' + (char)128;
849 *d++ = '\\' + (char)128;
853 str_set(tmp2str,tokenbuf);
854 s = (gsub ? "/g" : "/");
857 tmp2str=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
858 str_set(tmp3str,"($s_ = '\"'.(");
859 str_scat(tmp3str,tmp2str);
860 str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, ");
861 str_set(tmp2str,"eval $s_");
862 s = (gsub ? "/ge" : "/e");
867 type = ops[ops[node+1].ival].ival;
870 fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN);
871 if (type == OREGEX) {
874 str_scat(str,tmp3str);
875 str_scat(str,tmpstr);
877 str_scat(str,tmp2str);
879 else if ((type == OFLD && !split_to_array) || (type == OVAR && len == 1)) {
882 str_scat(str,tmp3str);
883 str_scat(str,tmpstr);
887 str_scat(str,tmp2str);
893 str_cat(str,"$s = ");
896 str_scat(str,tmp3str);
897 str_scat(str,tmpstr);
899 str_scat(str,tmp2str);
910 str = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
914 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
917 for (t = tmpstr->str_ptr, d=tokenbuf; *t; d++,t++) {
920 else if (*t == '\\') {
924 case '\\': case '"': case 'n': case 't': case '$':
926 default: /* hide this from perl */
927 *d++ = '\\' + (char)128;
935 str_cat(str,tokenbuf);
943 str_set(str,"defined $");
947 str_set(str,"delete $");
957 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
959 tmp2str = hfetch(symtab,tmpstr->str_ptr);
960 if (tmp2str && atoi(tmp2str->str_ptr))
962 if (strEQ(str->str_ptr,"$FNR")) {
965 str_set(str,"($.-$FNRbase)");
967 else if (strEQ(str->str_ptr,"$NR")) {
971 else if (strEQ(str->str_ptr,"$NF")) {
973 str_set(str,"$#Fld");
975 else if (strEQ(str->str_ptr,"$0"))
977 else if (strEQ(str->str_ptr,"$ARGC"))
978 str_set(str,"($#ARGV+1)");
983 sprintf(tokenbuf,"$%s,",tmpstr->str_ptr);
984 ??? if (instr(curargs->str_ptr,tokenbuf))
985 str_cat(str,"\377"); /* can't translate yet */
988 str_cat(tmpstr,"[]");
989 tmp2str = hfetch(symtab,tmpstr->str_ptr);
990 if (tmp2str && atoi(tmp2str->str_ptr))
994 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
996 if (strEQ(str->str_ptr,"$ARGV[0")) {
997 str_set(str,"$ARGV0");
1001 if (tmp2str && atoi(tmp2str->str_ptr))
1002 strcpy(tokenbuf,"]");
1004 strcpy(tokenbuf,"}");
1005 *tokenbuf += (char)128;
1006 str_cat(str,tokenbuf);
1013 if (split_to_array) {
1014 str_set(str,"$Fld");
1016 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1021 i = atoi(walk(1,level,ops[node+1].ival,&numarg,P_MIN)->str_ptr);
1023 sprintf(tokenbuf,"$%s",nameary[i]);
1025 sprintf(tokenbuf,"$Fld%d",i);
1026 str_set(str,tokenbuf);
1031 str_set(str,"$Fld[");
1032 i = ops[node+1].ival;
1033 if ((ops[i].ival & 255) == OPAREN)
1035 tmpstr=walk(1,level,i,&numarg,P_MIN);
1036 str_scat(str,tmpstr);
1055 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1056 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1058 str_scat(str,tmpstr);
1064 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1065 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1067 str_scat(str,tmpstr);
1073 str = walk(1,level,ops[node+1].ival,&numarg,prec);
1075 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
1077 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
1086 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1087 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1093 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1096 tmpstr = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
1097 if (*tmpstr->str_ptr == ';') {
1099 str_cat(str,tmpstr->str_ptr+1);
1106 str = str_make("close(");
1107 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1108 if (!do_fancy_opens) {
1109 t = tmpstr->str_ptr;
1110 if (*t == '"' || *t == '\'')
1111 t = cpytill(tokenbuf,t+1,*t);
1113 fatal("Internal error: OCLOSE %s",t);
1114 s = savestr(tokenbuf);
1115 for (t = tokenbuf; *t; t++) {
1119 if (!isALPHA(*t) && !isDIGIT(*t))
1122 if (!strchr(tokenbuf,'_'))
1126 str_set(str,"close ");
1127 str_cat(str,tokenbuf);
1130 sprintf(tokenbuf,"delete $opened{%s} && close(%s)",
1131 tmpstr->str_ptr, tmpstr->str_ptr);
1133 str_set(str,tokenbuf);
1138 lparen = ""; /* set to parens if necessary */
1141 if (len == 3) { /* output redirection */
1142 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MIN);
1143 tmp2str = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1144 if (!do_fancy_opens) {
1145 t = tmpstr->str_ptr;
1146 if (*t == '"' || *t == '\'')
1147 t = cpytill(tokenbuf,t+1,*t);
1149 fatal("Internal error: OPRINT");
1151 s = savestr(tokenbuf);
1152 for (t = tokenbuf; *t; t++) {
1156 if (!isALPHA(*t) && !isDIGIT(*t))
1159 if (!strchr(tokenbuf,'_'))
1161 tmp3str = hfetch(symtab,tokenbuf);
1163 str_cat(opens,"open(");
1164 str_cat(opens,tokenbuf);
1165 str_cat(opens,", ");
1168 str_scat(opens,tmp2str);
1169 str_cat(opens,tmpstr->str_ptr+1);
1170 if (*tmp2str->str_ptr == '|')
1171 str_cat(opens,") || die 'Cannot pipe to \"");
1173 str_cat(opens,") || die 'Cannot create file \"");
1175 str_cat(opens,"'.\"");
1178 str_cat(opens,"\".'");
1179 str_cat(opens,"\".';\n");
1180 hstore(symtab,tokenbuf,str_make("x"));
1188 sprintf(tokenbuf,"&Pick('%s', %s) &&\n",
1189 tmp2str->str_ptr, tmpstr->str_ptr);
1190 str_cat(str,tokenbuf);
1192 strcpy(tokenbuf,"$fh");
1200 strcpy(tokenbuf,"");
1201 str_cat(str,lparen); /* may be null */
1202 if (type == OPRINTF)
1203 str_cat(str,"printf");
1205 str_cat(str,"print");
1207 if (len == 3 || do_fancy_opens) {
1212 str_cat(str,tokenbuf);
1214 tmpstr = walk(1+(type==OPRINT),level,ops[node+1].ival,&numarg,P_MIN);
1215 if (!*tmpstr->str_ptr && lval_field) {
1216 const char *t = (saw_OFS ? "$," : "' '");
1217 if (split_to_array) {
1218 sprintf(tokenbuf,"join(%s,@Fld)",t);
1219 str_cat(tmpstr,tokenbuf);
1222 for (i = 1; i < maxfld; i++) {
1224 sprintf(tokenbuf,"$%s, ",nameary[i]);
1226 sprintf(tokenbuf,"$Fld%d, ",i);
1227 str_cat(tmpstr,tokenbuf);
1229 if (maxfld <= arymax)
1230 sprintf(tokenbuf,"$%s",nameary[maxfld]);
1232 sprintf(tokenbuf,"$Fld%d",maxfld);
1233 str_cat(tmpstr,tokenbuf);
1236 if (*tmpstr->str_ptr) {
1238 if (!saw_fh && *tmpstr->str_ptr == '(') {
1240 str_scat(str,tmpstr);
1244 str_scat(str,tmpstr);
1249 str_cat(str,rparen); /* may be null */
1253 str = str_make("rand(1)");
1256 str = str_make("srand(");
1259 str = str_make("atan2(");
1262 str = str_make("sin(");
1265 str = str_make("cos(");
1268 str = str_make("system(");
1271 str = str_make("length(");
1274 str = str_make("log(");
1277 str = str_make("exp(");
1280 str = str_make("sqrt(");
1283 str = str_make("int(");
1287 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1289 tmpstr = str_new(0);
1290 if (!tmpstr->str_ptr || !*tmpstr->str_ptr) {
1292 const char *t = (saw_OFS ? "$," : "' '");
1293 if (split_to_array) {
1294 sprintf(tokenbuf,"join(%s,@Fld)",t);
1295 str_cat(tmpstr,tokenbuf);
1298 sprintf(tokenbuf,"join(%s, ",t);
1299 str_cat(tmpstr,tokenbuf);
1300 for (i = 1; i < maxfld; i++) {
1302 sprintf(tokenbuf,"$%s,",nameary[i]);
1304 sprintf(tokenbuf,"$Fld%d,",i);
1305 str_cat(tmpstr,tokenbuf);
1307 if (maxfld <= arymax)
1308 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1310 sprintf(tokenbuf,"$Fld%d)",maxfld);
1311 str_cat(tmpstr,tokenbuf);
1315 str_cat(tmpstr,"$_");
1317 if (strEQ(tmpstr->str_ptr,"$_")) {
1318 if (type == OLENGTH && !do_chop) {
1319 str = str_make("(length(");
1320 str_cat(tmpstr,") - 1");
1323 str_scat(str,tmpstr);
1329 str_set(str,"last");
1333 str_set(str,"next line");
1339 str_set(str,"exit");
1344 fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
1350 str_set(str,"$ExitValue = ");
1353 fstr=walk(1,level,ops[node+1].ival,&numarg,P_ASSIGN));
1357 str_cat(str,"last line");
1362 str_set(str,"next");
1368 str_set(str,"if (");
1369 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1372 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1375 i = ops[node+3].ival;
1377 if ((ops[i].ival & 255) == OBLOCK) {
1380 if ((ops[i].ival & 255) != OIF)
1389 str_scat(str,fstr=walk(0,level,i,&numarg,P_MIN));
1393 str_cat(str,"else ");
1394 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1401 str_set(str,"while (");
1402 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1405 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1411 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1413 if (str->str_ptr[str->str_cur - 1] == '\n')
1415 str_cat(str," while (");
1416 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1422 str_set(str,"for (");
1423 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1426 t = s = tmpstr->str_ptr;
1427 while (isALPHA(*t) || isDIGIT(*t) || *t == '$' || *t == '_')
1434 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1435 if (i && (t = strchr(fstr->str_ptr,0377))) {
1436 if (strnEQ(fstr->str_ptr,s,i))
1443 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
1446 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
1450 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1451 d = strchr(tmpstr->str_ptr,'$');
1453 fatal("Illegal for loop: %s",tmpstr->str_ptr);
1458 fatal("Illegal for loop: %s",d);
1460 for (t = s; (i = *t); t++) {
1462 if (i == '}' || i == ']')
1470 tmp2str = hfetch(symtab,str->str_ptr);
1471 if (tmp2str && atoi(tmp2str->str_ptr)) {
1473 "foreach %s ($[ .. $#%s) ",
1479 "foreach %s (keys %%%s) ",
1483 str_set(str,tokenbuf);
1484 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1491 if (len >= 2 && ops[node+2].ival) {
1492 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1495 fixtab(str,++level);
1496 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1499 fixtab(str,--level);
1503 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1511 fatal("Garbage length in walk");
1512 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1513 for (i = 2; i<= len; i++) {
1514 str_scat(str,fstr=walk(0,level,ops[node+i].ival,&numarg,P_MIN));
1526 if (useval && prec < minprec) { /* need parens? */
1527 fstr = str_new(str->str_cur+2);
1528 str_nset(fstr,"(",1);
1530 str_ncat(fstr,")",1);
1535 *numericptr = numeric;
1538 printf("%3d %5d %15s %d %4d ",level,node,opname[type],len,str->str_cur);
1539 for (t = str->str_ptr; *t && t - str->str_ptr < 40; t++)
1542 else if (*t == '\t')
1553 tab(register STR *str, register int lvl)
1564 fixtab(register STR *str, register int lvl)
1568 /* strip trailing white space */
1570 s = str->str_ptr+str->str_cur - 1;
1571 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1574 str->str_cur = s + 1 - str->str_ptr;
1575 if (s >= str->str_ptr && *s != '\n')
1582 addsemi(register STR *str)
1586 s = str->str_ptr+str->str_cur - 1;
1587 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1589 if (s >= str->str_ptr && *s != ';' && *s != '}')
1594 emit_split(register STR *str, int level)
1599 str_cat(str,"@Fld");
1602 for (i = 1; i < maxfld; i++) {
1604 sprintf(tokenbuf,"$%s,",nameary[i]);
1606 sprintf(tokenbuf,"$Fld%d,",i);
1607 str_cat(str,tokenbuf);
1609 if (maxfld <= arymax)
1610 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1612 sprintf(tokenbuf,"$Fld%d)",maxfld);
1613 str_cat(str,tokenbuf);
1616 sprintf(tokenbuf," = split(/[%c\\n]/, $_, -1);\n",const_FS);
1617 str_cat(str,tokenbuf);
1620 str_cat(str," = split($FS, $_, -1);\n");
1622 str_cat(str," = split(' ', $_, -1);\n");
1627 prewalk(int numit, int level, register int node, int *numericptr)
1633 int numeric = FALSE;
1641 type = ops[node].ival;
1646 prewalk(0,level,ops[node+1].ival,&numarg);
1647 if (ops[node+2].ival) {
1648 prewalk(0,level,ops[node+2].ival,&numarg);
1651 prewalk(0,level,ops[node+3].ival,&numarg);
1653 if (ops[node+3].ival) {
1654 prewalk(0,level,ops[node+4].ival,&numarg);
1658 prewalk(0,level,ops[node+1].ival,&numarg);
1659 prewalk(0,level,ops[node+2].ival,&numarg);
1661 prewalk(0,level,ops[node+3].ival,&numarg);
1665 prewalk(1,level,ops[node+1].ival,&numarg);
1666 prewalk(1,level,ops[node+2].ival,&numarg);
1671 prewalk(0,level,ops[node+1].ival,&numarg);
1675 prewalk(0,level,ops[node+1].ival,&numarg);
1678 i = prewalk(0,level,ops[node+1].ival,&numarg);
1681 prewalk(0,level,ops[node+2].ival,&numarg);
1685 prewalk(0,level,ops[node+2].ival,&numarg);
1690 prewalk(0,level,ops[node+1].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);
1698 prewalk(0,level,ops[node+2].ival,&numarg);
1701 prewalk(0,level,ops[node+1].ival,&numarg);
1704 prewalk(0,level,ops[node+1].ival,&numarg);
1708 prewalk(0,level,ops[node+1].ival,&numarg);
1710 prewalk(0,level,ops[node+2].ival,&numarg);
1713 prewalk(0,level,ops[node+1].ival,&numarg);
1715 prewalk(0,level,ops[node+2].ival,&numarg);
1718 prewalk(0,level,ops[node+1].ival,&numarg);
1722 prewalk(0,level,ops[node+2].ival,&numarg);
1724 prewalk(0,level,ops[node+1].ival,&numarg);
1725 prewalk(0,level,ops[node+3].ival,&numarg);
1730 prewalk(0,level,ops[node+1].ival,&numarg);
1734 prewalk(0,level,ops[node+2].ival,&numarg);
1735 prewalk(0,level,ops[node+1].ival,&numarg);
1736 prewalk(0,level,ops[node+3].ival,&numarg);
1740 prewalk(0,level,ops[node+1].ival,&numarg);
1744 prewalk(0,level,ops[node+1].ival,&numarg);
1745 prewalk(0,level,ops[node+2].ival,&numarg);
1748 prewalk(0,level,ops[node+2].ival,&numarg);
1749 prewalk(0,level,ops[node+1].ival,&numarg);
1750 prewalk(0,level,ops[node+3].ival,&numarg);
1751 if (numarg || strlen(ops[ops[node+1].ival+1].cval) > (Size_t)1) {
1752 numericize(ops[node+2].ival);
1754 numericize(ops[node+3].ival);
1759 prewalk(1,level,ops[node+1].ival,&numarg);
1760 prewalk(1,level,ops[node+2].ival,&numarg);
1764 prewalk(1,level,ops[node+1].ival,&numarg);
1765 prewalk(1,level,ops[node+2].ival,&numarg);
1769 prewalk(1,level,ops[node+1].ival,&numarg);
1770 prewalk(1,level,ops[node+2].ival,&numarg);
1774 prewalk(1,level,ops[node+1].ival,&numarg);
1775 prewalk(1,level,ops[node+2].ival,&numarg);
1779 prewalk(1,level,ops[node+1].ival,&numarg);
1780 prewalk(1,level,ops[node+2].ival,&numarg);
1784 prewalk(1,level,ops[node+1].ival,&numarg);
1785 prewalk(1,level,ops[node+2].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(1,level,ops[node+1].ival,&numarg);
1813 prewalk(0,level,ops[node+1].ival,&numarg);
1819 prewalk(0,level,ops[node+1].ival,&numarg);
1822 prewalk(0,level,ops[node+1].ival,&numarg);
1823 prewalk(1,level,ops[node+2].ival,&numarg);
1825 prewalk(1,level,ops[node+3].ival,&numarg);
1832 prewalk(0,level,ops[node+2].ival,&numarg);
1834 prewalk(0,level,ops[node+3].ival,&numarg);
1835 prewalk(0,level,ops[node+1].ival,&numarg);
1838 prewalk(0,level,ops[node+1].ival,&numarg);
1839 prewalk(0,level,ops[node+2].ival,&numarg);
1843 prewalk(0,level,ops[node+1].ival,&numarg);
1844 prewalk(0,level,ops[node+2].ival,&numarg);
1850 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1852 prewalk(0,level,ops[node+2].ival,&numarg);
1853 prewalk(0,level,ops[node+4].ival,&numarg);
1854 prewalk(0,level,ops[node+5].ival,&numarg);
1856 str_cat(tmpstr,"(");
1857 tmp2str = str_new(0);
1858 if (subretnum || numarg)
1859 str_set(tmp2str,"1");
1860 hstore(symtab,tmpstr->str_ptr,tmp2str);
1866 prewalk(0,level,ops[node+1].ival,&numarg);
1872 tmp2str = str_new(0);
1873 str_scat(tmp2str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1874 fixrargs(tmpstr->str_ptr,ops[node+2].ival,0);
1876 str_cat(tmp2str,"(");
1877 tmpstr = hfetch(symtab,tmp2str->str_ptr);
1878 if (tmpstr && tmpstr->str_ptr)
1879 numeric |= atoi(tmpstr->str_ptr);
1880 prewalk(0,level,ops[node+2].ival,&numarg);
1886 prewalk(0,level,ops[node+3].ival,&numarg);
1887 prewalk(0,level,ops[ops[node+2].ival+1].ival,&numarg);
1888 prewalk(0,level,ops[node+1].ival,&numarg);
1892 prewalk(0,level,ops[node+1].ival,&numarg);
1896 prewalk(0,level,ops[node+1].ival,&numarg);
1902 prewalk(0,level,ops[node+1].ival,&numarg);
1908 prewalk(0,level,ops[node+2].ival,&numarg);
1912 prewalk(0,level,ops[node+1].ival,&numarg);
1915 i = ops[node+1].ival;
1916 prewalk(0,level,i,&numarg);
1929 prewalk(0,level,ops[node+1].ival,&numarg);
1930 prewalk(0,level,ops[node+2].ival,&numarg);
1931 prewalk(0,level,ops[node+3].ival,&numarg);
1936 prewalk(0,level,ops[node+1].ival,&numarg);
1937 prewalk(0,level,ops[node+2].ival,&numarg);
1941 prewalk(0,level,ops[node+1].ival,&numarg);
1943 prewalk(0,level,ops[node+2].ival,&numarg);
1948 prewalk(0,level,ops[node+1].ival,&numarg);
1952 if (len == 3) { /* output redirection */
1953 prewalk(0,level,ops[node+3].ival,&numarg);
1954 prewalk(0,level,ops[node+2].ival,&numarg);
1956 prewalk(0+(type==OPRINT),level,ops[node+1].ival,&numarg);
1982 prewalk(type != OLENGTH && type != OSYSTEM,
1983 level,ops[node+1].ival,&numarg);
1991 prewalk(1,level,ops[node+1].ival,&numarg);
1999 prewalk(0,level,ops[node+1].ival,&numarg);
2000 prewalk(0,level,ops[node+2].ival,&numarg);
2002 prewalk(0,level,ops[node+3].ival,&numarg);
2006 prewalk(0,level,ops[node+1].ival,&numarg);
2007 prewalk(0,level,ops[node+2].ival,&numarg);
2010 prewalk(0,level,ops[node+1].ival,&numarg);
2011 prewalk(0,level,ops[node+2].ival,&numarg);
2012 prewalk(0,level,ops[node+3].ival,&numarg);
2013 prewalk(0,level,ops[node+4].ival,&numarg);
2016 prewalk(0,level,ops[node+2].ival,&numarg);
2017 prewalk(0,level,ops[node+1].ival,&numarg);
2021 prewalk(0,level,ops[node+2].ival,&numarg);
2024 prewalk(0,level,ops[node+1].ival,&numarg);
2031 fatal("Garbage length in prewalk");
2032 prewalk(0,level,ops[node+1].ival,&numarg);
2033 for (i = 2; i<= len; i++) {
2034 prewalk(0,level,ops[node+i].ival,&numarg);
2039 *numericptr = numeric;
2044 numericize(register int node)
2052 type = ops[node].ival;
2055 if (type == OVAR && len == 1) {
2056 tmpstr=walk(0,0,ops[node+1].ival,&numarg,P_MIN);
2057 tmp2str = str_make("1");
2058 hstore(symtab,tmpstr->str_ptr,tmp2str);