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;
26 STR *curargs = Nullstr;
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, 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);
842 tmp2str=walk(1,level,ops[ops[node+2].ival+1].ival,&numarg,P_MIN);
843 for (t = tmp2str->str_ptr, d=tokenbuf; *t; d++,t++) {
845 *d++ = '$' + (char)128;
847 *d++ = '\\' + (char)128;
851 str_set(tmp2str,tokenbuf);
852 s = (char *) (gsub ? "/g" : "/");
855 tmp2str=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
856 str_set(tmp3str,"($s_ = '\"'.(");
857 str_scat(tmp3str,tmp2str);
858 str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, ");
859 str_set(tmp2str,"eval $s_");
860 s = (char *) (gsub ? "/ge" : "/e");
864 type = ops[ops[node+1].ival].ival;
867 fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN);
868 if (type == OREGEX) {
871 str_scat(str,tmp3str);
872 str_scat(str,tmpstr);
874 str_scat(str,tmp2str);
876 else if ((type == OFLD && !split_to_array) || (type == OVAR && len == 1)) {
879 str_scat(str,tmp3str);
880 str_scat(str,tmpstr);
884 str_scat(str,tmp2str);
890 str_cat(str,"$s = ");
893 str_scat(str,tmp3str);
894 str_scat(str,tmpstr);
896 str_scat(str,tmp2str);
907 str = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
911 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);
938 str_set(str,"defined $");
942 str_set(str,"delete $");
952 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
954 tmp2str = hfetch(symtab,tmpstr->str_ptr);
955 if (tmp2str && atoi(tmp2str->str_ptr))
957 if (strEQ(str->str_ptr,"$FNR")) {
960 str_set(str,"($.-$FNRbase)");
962 else if (strEQ(str->str_ptr,"$NR")) {
966 else if (strEQ(str->str_ptr,"$NF")) {
968 str_set(str,"$#Fld");
970 else if (strEQ(str->str_ptr,"$0"))
972 else if (strEQ(str->str_ptr,"$ARGC"))
973 str_set(str,"($#ARGV+1)");
978 sprintf(tokenbuf,"$%s,",tmpstr->str_ptr);
979 ??? if (instr(curargs->str_ptr,tokenbuf))
980 str_cat(str,"\377"); /* can't translate yet */
983 str_cat(tmpstr,"[]");
984 tmp2str = hfetch(symtab,tmpstr->str_ptr);
985 if (tmp2str && atoi(tmp2str->str_ptr))
989 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
991 if (strEQ(str->str_ptr,"$ARGV[0")) {
992 str_set(str,"$ARGV0");
996 if (tmp2str && atoi(tmp2str->str_ptr))
997 strcpy(tokenbuf,"]");
999 strcpy(tokenbuf,"}");
1000 *tokenbuf += (char)128;
1001 str_cat(str,tokenbuf);
1008 if (split_to_array) {
1009 str_set(str,"$Fld");
1011 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1016 i = atoi(walk(1,level,ops[node+1].ival,&numarg,P_MIN)->str_ptr);
1018 sprintf(tokenbuf,"$%s",nameary[i]);
1020 sprintf(tokenbuf,"$Fld%d",i);
1021 str_set(str,tokenbuf);
1026 str_set(str,"$Fld[");
1027 i = ops[node+1].ival;
1028 if ((ops[i].ival & 255) == OPAREN)
1030 tmpstr=walk(1,level,i,&numarg,P_MIN);
1031 str_scat(str,tmpstr);
1050 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1051 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1053 str_scat(str,tmpstr);
1059 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1060 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1062 str_scat(str,tmpstr);
1068 str = walk(1,level,ops[node+1].ival,&numarg,prec);
1070 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
1072 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
1081 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1082 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1088 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1091 tmpstr = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
1092 if (*tmpstr->str_ptr == ';') {
1094 str_cat(str,tmpstr->str_ptr+1);
1101 str = str_make("close(");
1102 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1103 if (!do_fancy_opens) {
1104 t = tmpstr->str_ptr;
1105 if (*t == '"' || *t == '\'')
1106 t = cpytill(tokenbuf,t+1,*t);
1108 fatal("Internal error: OCLOSE %s",t);
1109 s = savestr(tokenbuf);
1110 for (t = tokenbuf; *t; t++) {
1114 if (!isALPHA(*t) && !isDIGIT(*t))
1117 if (!strchr(tokenbuf,'_'))
1121 str_set(str,"close ");
1122 str_cat(str,tokenbuf);
1125 sprintf(tokenbuf,"delete $opened{%s} && close(%s)",
1126 tmpstr->str_ptr, tmpstr->str_ptr);
1128 str_set(str,tokenbuf);
1133 lparen = ""; /* set to parens if necessary */
1136 if (len == 3) { /* output redirection */
1137 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MIN);
1138 tmp2str = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1139 if (!do_fancy_opens) {
1140 t = tmpstr->str_ptr;
1141 if (*t == '"' || *t == '\'')
1142 t = cpytill(tokenbuf,t+1,*t);
1144 fatal("Internal error: OPRINT");
1146 s = savestr(tokenbuf);
1147 for (t = tokenbuf; *t; t++) {
1151 if (!isALPHA(*t) && !isDIGIT(*t))
1154 if (!strchr(tokenbuf,'_'))
1156 tmp3str = hfetch(symtab,tokenbuf);
1158 str_cat(opens,"open(");
1159 str_cat(opens,tokenbuf);
1160 str_cat(opens,", ");
1163 str_scat(opens,tmp2str);
1164 str_cat(opens,tmpstr->str_ptr+1);
1165 if (*tmp2str->str_ptr == '|')
1166 str_cat(opens,") || die 'Cannot pipe to \"");
1168 str_cat(opens,") || die 'Cannot create file \"");
1170 str_cat(opens,"'.\"");
1173 str_cat(opens,"\".'");
1174 str_cat(opens,"\".';\n");
1175 hstore(symtab,tokenbuf,str_make("x"));
1183 sprintf(tokenbuf,"&Pick('%s', %s) &&\n",
1184 tmp2str->str_ptr, tmpstr->str_ptr);
1185 str_cat(str,tokenbuf);
1187 strcpy(tokenbuf,"$fh");
1195 strcpy(tokenbuf,"");
1196 str_cat(str,lparen); /* may be null */
1197 if (type == OPRINTF)
1198 str_cat(str,"printf");
1200 str_cat(str,"print");
1202 if (len == 3 || do_fancy_opens) {
1207 str_cat(str,tokenbuf);
1209 tmpstr = walk(1+(type==OPRINT),level,ops[node+1].ival,&numarg,P_MIN);
1210 if (!*tmpstr->str_ptr && lval_field) {
1211 t = (char*)(saw_OFS ? "$," : "' '");
1212 if (split_to_array) {
1213 sprintf(tokenbuf,"join(%s,@Fld)",t);
1214 str_cat(tmpstr,tokenbuf);
1217 for (i = 1; i < maxfld; i++) {
1219 sprintf(tokenbuf,"$%s, ",nameary[i]);
1221 sprintf(tokenbuf,"$Fld%d, ",i);
1222 str_cat(tmpstr,tokenbuf);
1224 if (maxfld <= arymax)
1225 sprintf(tokenbuf,"$%s",nameary[maxfld]);
1227 sprintf(tokenbuf,"$Fld%d",maxfld);
1228 str_cat(tmpstr,tokenbuf);
1231 if (*tmpstr->str_ptr) {
1233 if (!saw_fh && *tmpstr->str_ptr == '(') {
1235 str_scat(str,tmpstr);
1239 str_scat(str,tmpstr);
1244 str_cat(str,rparen); /* may be null */
1248 str = str_make("rand(1)");
1251 str = str_make("srand(");
1254 str = str_make("atan2(");
1257 str = str_make("sin(");
1260 str = str_make("cos(");
1263 str = str_make("system(");
1266 str = str_make("length(");
1269 str = str_make("log(");
1272 str = str_make("exp(");
1275 str = str_make("sqrt(");
1278 str = str_make("int(");
1282 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1284 tmpstr = str_new(0);
1285 if (!tmpstr->str_ptr || !*tmpstr->str_ptr) {
1287 t = (char*)(saw_OFS ? "$," : "' '");
1288 if (split_to_array) {
1289 sprintf(tokenbuf,"join(%s,@Fld)",t);
1290 str_cat(tmpstr,tokenbuf);
1293 sprintf(tokenbuf,"join(%s, ",t);
1294 str_cat(tmpstr,tokenbuf);
1295 for (i = 1; i < maxfld; i++) {
1297 sprintf(tokenbuf,"$%s,",nameary[i]);
1299 sprintf(tokenbuf,"$Fld%d,",i);
1300 str_cat(tmpstr,tokenbuf);
1302 if (maxfld <= arymax)
1303 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1305 sprintf(tokenbuf,"$Fld%d)",maxfld);
1306 str_cat(tmpstr,tokenbuf);
1310 str_cat(tmpstr,"$_");
1312 if (strEQ(tmpstr->str_ptr,"$_")) {
1313 if (type == OLENGTH && !do_chop) {
1314 str = str_make("(length(");
1315 str_cat(tmpstr,") - 1");
1318 str_scat(str,tmpstr);
1324 str_set(str,"last");
1328 str_set(str,"next line");
1334 str_set(str,"exit");
1339 fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
1345 str_set(str,"$ExitValue = ");
1348 fstr=walk(1,level,ops[node+1].ival,&numarg,P_ASSIGN));
1352 str_cat(str,"last line");
1357 str_set(str,"next");
1363 str_set(str,"if (");
1364 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1367 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1370 i = ops[node+3].ival;
1372 if ((ops[i].ival & 255) == OBLOCK) {
1375 if ((ops[i].ival & 255) != OIF)
1384 str_scat(str,fstr=walk(0,level,i,&numarg,P_MIN));
1388 str_cat(str,"else ");
1389 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1396 str_set(str,"while (");
1397 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1400 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1406 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1408 if (str->str_ptr[str->str_cur - 1] == '\n')
1410 str_cat(str," while (");
1411 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1417 str_set(str,"for (");
1418 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1421 t = s = tmpstr->str_ptr;
1422 while (isALPHA(*t) || isDIGIT(*t) || *t == '$' || *t == '_')
1429 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1430 if (i && (t = strchr(fstr->str_ptr,0377))) {
1431 if (strnEQ(fstr->str_ptr,s,i))
1438 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
1441 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
1445 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1446 d = strchr(tmpstr->str_ptr,'$');
1448 fatal("Illegal for loop: %s",tmpstr->str_ptr);
1453 fatal("Illegal for loop: %s",d);
1455 for (t = s; (i = *t); t++) {
1457 if (i == '}' || i == ']')
1465 tmp2str = hfetch(symtab,str->str_ptr);
1466 if (tmp2str && atoi(tmp2str->str_ptr)) {
1468 "foreach %s ($[ .. $#%s) ",
1474 "foreach %s (keys %%%s) ",
1478 str_set(str,tokenbuf);
1479 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1486 if (len >= 2 && ops[node+2].ival) {
1487 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1490 fixtab(str,++level);
1491 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1494 fixtab(str,--level);
1498 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1506 fatal("Garbage length in walk");
1507 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1508 for (i = 2; i<= len; i++) {
1509 str_scat(str,fstr=walk(0,level,ops[node+i].ival,&numarg,P_MIN));
1521 if (useval && prec < minprec) { /* need parens? */
1522 fstr = str_new(str->str_cur+2);
1523 str_nset(fstr,"(",1);
1525 str_ncat(fstr,")",1);
1530 *numericptr = numeric;
1533 printf("%3d %5d %15s %d %4d ",level,node,opname[type],len,str->str_cur);
1534 for (t = str->str_ptr; *t && t - str->str_ptr < 40; t++)
1537 else if (*t == '\t')
1548 tab(register STR *str, register int lvl)
1559 fixtab(register STR *str, register int lvl)
1563 /* strip trailing white space */
1565 s = str->str_ptr+str->str_cur - 1;
1566 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1569 str->str_cur = s + 1 - str->str_ptr;
1570 if (s >= str->str_ptr && *s != '\n')
1577 addsemi(register STR *str)
1581 s = str->str_ptr+str->str_cur - 1;
1582 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1584 if (s >= str->str_ptr && *s != ';' && *s != '}')
1589 emit_split(register STR *str, int level)
1594 str_cat(str,"@Fld");
1597 for (i = 1; i < maxfld; i++) {
1599 sprintf(tokenbuf,"$%s,",nameary[i]);
1601 sprintf(tokenbuf,"$Fld%d,",i);
1602 str_cat(str,tokenbuf);
1604 if (maxfld <= arymax)
1605 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1607 sprintf(tokenbuf,"$Fld%d)",maxfld);
1608 str_cat(str,tokenbuf);
1611 sprintf(tokenbuf," = split(/[%c\\n]/, $_, -1);\n",const_FS);
1612 str_cat(str,tokenbuf);
1615 str_cat(str," = split($FS, $_, -1);\n");
1617 str_cat(str," = split(' ', $_, -1);\n");
1622 prewalk(int numit, int level, register int node, int *numericptr)
1628 int numeric = FALSE;
1636 type = ops[node].ival;
1641 prewalk(0,level,ops[node+1].ival,&numarg);
1642 if (ops[node+2].ival) {
1643 prewalk(0,level,ops[node+2].ival,&numarg);
1646 prewalk(0,level,ops[node+3].ival,&numarg);
1648 if (ops[node+3].ival) {
1649 prewalk(0,level,ops[node+4].ival,&numarg);
1653 prewalk(0,level,ops[node+1].ival,&numarg);
1654 prewalk(0,level,ops[node+2].ival,&numarg);
1656 prewalk(0,level,ops[node+3].ival,&numarg);
1660 prewalk(1,level,ops[node+1].ival,&numarg);
1661 prewalk(1,level,ops[node+2].ival,&numarg);
1666 prewalk(0,level,ops[node+1].ival,&numarg);
1670 prewalk(0,level,ops[node+1].ival,&numarg);
1673 i = prewalk(0,level,ops[node+1].ival,&numarg);
1676 prewalk(0,level,ops[node+2].ival,&numarg);
1680 prewalk(0,level,ops[node+2].ival,&numarg);
1685 prewalk(0,level,ops[node+1].ival,&numarg);
1688 prewalk(0,level,ops[node+1].ival,&numarg);
1689 prewalk(0,level,ops[node+2].ival,&numarg);
1692 prewalk(0,level,ops[node+1].ival,&numarg);
1693 prewalk(0,level,ops[node+2].ival,&numarg);
1696 prewalk(0,level,ops[node+1].ival,&numarg);
1699 prewalk(0,level,ops[node+1].ival,&numarg);
1703 prewalk(0,level,ops[node+1].ival,&numarg);
1705 prewalk(0,level,ops[node+2].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);
1717 prewalk(0,level,ops[node+2].ival,&numarg);
1719 prewalk(0,level,ops[node+1].ival,&numarg);
1720 prewalk(0,level,ops[node+3].ival,&numarg);
1725 prewalk(0,level,ops[node+1].ival,&numarg);
1729 prewalk(0,level,ops[node+2].ival,&numarg);
1730 prewalk(0,level,ops[node+1].ival,&numarg);
1731 prewalk(0,level,ops[node+3].ival,&numarg);
1735 prewalk(0,level,ops[node+1].ival,&numarg);
1739 prewalk(0,level,ops[node+1].ival,&numarg);
1740 prewalk(0,level,ops[node+2].ival,&numarg);
1743 prewalk(0,level,ops[node+2].ival,&numarg);
1744 prewalk(0,level,ops[node+1].ival,&numarg);
1745 prewalk(0,level,ops[node+3].ival,&numarg);
1746 if (numarg || strlen(ops[ops[node+1].ival+1].cval) > (Size_t)1) {
1747 numericize(ops[node+2].ival);
1749 numericize(ops[node+3].ival);
1754 prewalk(1,level,ops[node+1].ival,&numarg);
1755 prewalk(1,level,ops[node+2].ival,&numarg);
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);
1788 prewalk(1,level,ops[node+1].ival,&numarg);
1792 prewalk(1,level,ops[node+1].ival,&numarg);
1796 prewalk(1,level,ops[node+1].ival,&numarg);
1800 prewalk(1,level,ops[node+1].ival,&numarg);
1804 prewalk(1,level,ops[node+1].ival,&numarg);
1808 prewalk(0,level,ops[node+1].ival,&numarg);
1814 prewalk(0,level,ops[node+1].ival,&numarg);
1817 prewalk(0,level,ops[node+1].ival,&numarg);
1818 prewalk(1,level,ops[node+2].ival,&numarg);
1820 prewalk(1,level,ops[node+3].ival,&numarg);
1827 prewalk(0,level,ops[node+2].ival,&numarg);
1829 prewalk(0,level,ops[node+3].ival,&numarg);
1830 prewalk(0,level,ops[node+1].ival,&numarg);
1833 prewalk(0,level,ops[node+1].ival,&numarg);
1834 prewalk(0,level,ops[node+2].ival,&numarg);
1838 prewalk(0,level,ops[node+1].ival,&numarg);
1839 prewalk(0,level,ops[node+2].ival,&numarg);
1845 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1847 prewalk(0,level,ops[node+2].ival,&numarg);
1848 prewalk(0,level,ops[node+4].ival,&numarg);
1849 prewalk(0,level,ops[node+5].ival,&numarg);
1851 str_cat(tmpstr,"(");
1852 tmp2str = str_new(0);
1853 if (subretnum || numarg)
1854 str_set(tmp2str,"1");
1855 hstore(symtab,tmpstr->str_ptr,tmp2str);
1861 prewalk(0,level,ops[node+1].ival,&numarg);
1867 tmp2str = str_new(0);
1868 str_scat(tmp2str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1869 fixrargs(tmpstr->str_ptr,ops[node+2].ival,0);
1871 str_cat(tmp2str,"(");
1872 tmpstr = hfetch(symtab,tmp2str->str_ptr);
1873 if (tmpstr && tmpstr->str_ptr)
1874 numeric |= atoi(tmpstr->str_ptr);
1875 prewalk(0,level,ops[node+2].ival,&numarg);
1881 prewalk(0,level,ops[node+3].ival,&numarg);
1882 prewalk(0,level,ops[ops[node+2].ival+1].ival,&numarg);
1883 prewalk(0,level,ops[node+1].ival,&numarg);
1887 prewalk(0,level,ops[node+1].ival,&numarg);
1891 prewalk(0,level,ops[node+1].ival,&numarg);
1897 prewalk(0,level,ops[node+1].ival,&numarg);
1903 prewalk(0,level,ops[node+2].ival,&numarg);
1907 prewalk(0,level,ops[node+1].ival,&numarg);
1910 i = ops[node+1].ival;
1911 prewalk(0,level,i,&numarg);
1924 prewalk(0,level,ops[node+1].ival,&numarg);
1925 prewalk(0,level,ops[node+2].ival,&numarg);
1926 prewalk(0,level,ops[node+3].ival,&numarg);
1931 prewalk(0,level,ops[node+1].ival,&numarg);
1932 prewalk(0,level,ops[node+2].ival,&numarg);
1936 prewalk(0,level,ops[node+1].ival,&numarg);
1938 prewalk(0,level,ops[node+2].ival,&numarg);
1943 prewalk(0,level,ops[node+1].ival,&numarg);
1947 if (len == 3) { /* output redirection */
1948 prewalk(0,level,ops[node+3].ival,&numarg);
1949 prewalk(0,level,ops[node+2].ival,&numarg);
1951 prewalk(0+(type==OPRINT),level,ops[node+1].ival,&numarg);
1977 prewalk(type != OLENGTH && type != OSYSTEM,
1978 level,ops[node+1].ival,&numarg);
1986 prewalk(1,level,ops[node+1].ival,&numarg);
1994 prewalk(0,level,ops[node+1].ival,&numarg);
1995 prewalk(0,level,ops[node+2].ival,&numarg);
1997 prewalk(0,level,ops[node+3].ival,&numarg);
2001 prewalk(0,level,ops[node+1].ival,&numarg);
2002 prewalk(0,level,ops[node+2].ival,&numarg);
2005 prewalk(0,level,ops[node+1].ival,&numarg);
2006 prewalk(0,level,ops[node+2].ival,&numarg);
2007 prewalk(0,level,ops[node+3].ival,&numarg);
2008 prewalk(0,level,ops[node+4].ival,&numarg);
2011 prewalk(0,level,ops[node+2].ival,&numarg);
2012 prewalk(0,level,ops[node+1].ival,&numarg);
2016 prewalk(0,level,ops[node+2].ival,&numarg);
2019 prewalk(0,level,ops[node+1].ival,&numarg);
2026 fatal("Garbage length in prewalk");
2027 prewalk(0,level,ops[node+1].ival,&numarg);
2028 for (i = 2; i<= len; i++) {
2029 prewalk(0,level,ops[node+i].ival,&numarg);
2034 *numericptr = numeric;
2039 numericize(register int node)
2047 type = ops[node].ival;
2050 if (type == OVAR && len == 1) {
2051 tmpstr=walk(0,0,ops[node+1].ival,&numarg,P_MIN);
2052 tmp2str = str_make("1");
2053 hstore(symtab,tmpstr->str_ptr,tmp2str);