1 /* $Header: walk.c,v 3.0.1.3 89/12/21 20:32:35 lwall Locked $
3 * Copyright (c) 1989, Larry Wall
5 * You may distribute under the terms of the GNU General Public License
6 * as specified in the README file that comes with the perl 3.0 kit.
9 * Revision 3.0.1.3 89/12/21 20:32:35 lwall
10 * patch7: in a2p, user-defined functions didn't work on some machines
12 * Revision 3.0.1.2 89/11/17 15:53:00 lwall
13 * patch5: on Pyramids, index(s, '}' + 128) doesn't find meta-}
15 * Revision 3.0.1.1 89/11/11 05:09:33 lwall
16 * patch2: in a2p, awk script with no line actions still needs main loop
18 * Revision 3.0 89/10/18 15:35:48 lwall
29 bool realexit = FALSE;
30 bool saw_getline = FALSE;
31 bool subretnum = FALSE;
33 bool saw_argv0 = FALSE;
38 STR *curargs = Nullstr;
41 walk(useval,level,node,numericptr,minprec)
46 int minprec; /* minimum precedence without parens */
60 int prec = P_MAX; /* assume no parens needed */
67 type = ops[node].ival;
74 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
75 if (do_split && need_entire && !absmaxfld)
76 split_to_array = TRUE;
77 if (do_split && split_to_array)
78 set_array_base = TRUE;
80 str_cat(str,"$[ = 1;\t\t\t# set array base to 1\n");
82 if (fswitch && !const_FS)
84 if (saw_FS > 1 || saw_RS)
86 if (saw_ORS && need_entire)
89 str_cat(str,"$FS = '");
90 if (index("*+?.[]()|^$\\",fswitch))
92 sprintf(tokenbuf,"%c",fswitch);
93 str_cat(str,tokenbuf);
94 str_cat(str,"';\t\t# field separator from -F switch\n");
96 else if (saw_FS && !const_FS) {
97 str_cat(str,"$FS = ' ';\t\t# set field separator\n");
100 str_cat(str,"$, = ' ';\t\t# set output field separator\n");
103 str_cat(str,"$\\ = \"\\n\";\t\t# set output record separator\n");
106 str_cat(str,"$ARGV0 = $0;\t\t# remember what we ran as\n");
108 if (str->str_cur > 20)
110 if (ops[node+2].ival) {
111 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
115 fstr = walk(0,level+1,ops[node+3].ival,&numarg,P_MIN);
116 if (*fstr->str_ptr) {
118 str_cat(str,"line: ");
119 str_cat(str,"while (<>) {\n");
121 if (saw_FS && !const_FS)
124 str_cat(str,"chop;\t# strip record separator\n");
129 while (isalpha(*namelist)) {
130 for (d = tokenbuf,s=namelist;
131 isalpha(*s) || isdigit(*s) || *s == '_';
134 while (*s && !isalpha(*s)) s++;
136 nameary[++arymax] = savestr(tokenbuf);
142 emit_split(str,level);
148 str_cat(str,"continue {\n $FNRbase = $. if eof;\n}\n");
151 str_cat(str,"while (<>) { } # (no line actions)\n");
152 if (ops[node+4].ival) {
156 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
161 str_cat(str,"exit ExitValue;\n");
167 for (len = 0; len < 4; len++) {
168 if (saw_getline & (1 << len)) {
169 sprintf(tokenbuf,"\nsub Getline%d {\n",len);
170 str_cat(str, tokenbuf);
173 str_cat(str," &Pick('',@_);\n");
175 str_cat(str," ($fh) = @_;\n");
179 str_cat(str," $FNRbase = $. if eof;\n");
182 str_cat(str," local($_)\n");
185 " if ($getline_ok = (($_ = <$fh>) ne ''))");
188 " if ($getline_ok = (($_ = <>) ne ''))");
189 str_cat(str, " {\n");
195 str_cat(str,"chop;\t# strip record separator\n");
198 if (do_split && !(len & 1)) {
200 emit_split(str,level);
205 str_cat(str,"}\n $_;\n}\n");
210 if (do_fancy_opens) {
213 local($mode,$name,$pipe) = @_;\n\
214 $fh = $opened{$name};\n\
216 $fh = $opened{$name} = 'fh_' . ($nextfh++ + 0);\n\
217 open($fh,$mode.$name.$pipe);\n\
224 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
225 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
228 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
236 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
238 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
246 tmpstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN);
247 /* translate \nnn to [\nnn] */
248 for (s = tmpstr->str_ptr, d = tokenbuf; *s; s++, d++) {
249 if (*s == '\\' && isdigit(s[1]) && isdigit(s[2]) && isdigit(s[3])){
261 for (d=tokenbuf; *d; d++)
263 str_cat(str,tokenbuf);
270 str = walk(0,level,oper1(OPRINT,0),&numarg,P_MIN);
272 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
277 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
278 if (*tmpstr->str_ptr) {
281 str_scat(str,tmpstr);
282 str_cat(str,") {\n");
284 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
291 str = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
298 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
304 str = walk(1,level,ops[node+1].ival,&numarg,prec);
306 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
308 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
313 str = walk(1,level,ops[node+1].ival,&numarg,prec);
315 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
317 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
324 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
330 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
337 str = walk(1,level,ops[node+1].ival,&numarg,prec);
340 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
342 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
347 str = walk(1,level,ops[node+1].ival,&numarg,prec);
350 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
352 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
359 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
365 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
367 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
368 tmp2str = walk(1,level,ops[node+3].ival,&numarg,prec+1);
371 (!numarg && (*tmp2str->str_ptr == '"' || *tmp2str->str_ptr == '\''))) {
374 str_set(tmpstr,"eq");
375 else if (strEQ(t,"!="))
376 str_set(tmpstr,"ne");
377 else if (strEQ(t,"<"))
378 str_set(tmpstr,"lt");
379 else if (strEQ(t,"<="))
380 str_set(tmpstr,"le");
381 else if (strEQ(t,">"))
382 str_set(tmpstr,"gt");
383 else if (strEQ(t,">="))
384 str_set(tmpstr,"ge");
385 if (!index(tmpstr->str_ptr,'\'') && !index(tmpstr->str_ptr,'"') &&
386 !index(tmp2str->str_ptr,'\'') && !index(tmp2str->str_ptr,'"') )
390 if (numeric & 1) /* numeric is very good guess */
398 str_scat(str,tmpstr);
401 str_scat(str,tmp2str);
408 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
415 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
417 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
418 if (strEQ(tmpstr->str_ptr,"~"))
421 str_scat(str,tmpstr);
425 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
433 fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
440 type = ops[ops[node+1].ival].ival & 255;
441 str = walk(1,level,ops[node+1].ival,&numarg,prec+(type != OCONCAT));
443 type = ops[ops[node+2].ival].ival & 255;
445 fstr=walk(1,level,ops[node+2].ival,&numarg,prec+(type != OCONCAT)));
450 str = walk(0,level,ops[node+2].ival,&numarg,prec+1);
452 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
453 str_scat(str,tmpstr);
454 if (str_len(tmpstr) > 1)
458 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec));
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));
564 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
565 if (!*fstr->str_ptr) {
567 len = 2; /* a legal fiction */
574 tmpstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN);
575 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
576 if (!do_fancy_opens) {
578 if (*t == '"' || *t == '\'')
579 t = cpytill(tokenbuf,t+1,*t);
581 fatal("Internal error: OGETLINE %s", t);
583 s = savestr(tokenbuf);
584 for (t = tokenbuf; *t; t++) {
586 if (!isalpha(*t) && !isdigit(*t))
589 if (!index(tokenbuf,'_'))
591 tmp3str = hfetch(symtab,tokenbuf);
594 str_cat(opens,"open(");
595 str_cat(opens,tokenbuf);
599 str_cat(opens,tmpstr->str_ptr+1);
601 if (*fstr->str_ptr == '|')
604 if (*fstr->str_ptr == '|')
605 str_cat(opens,") || die 'Cannot pipe from \"");
607 str_cat(opens,") || die 'Cannot open file \"");
609 str_cat(opens,"'.\"");
612 str_cat(opens,"\".'");
613 str_cat(opens,"\".';\n");
614 hstore(symtab,tokenbuf,str_make("x"));
619 str_cat(tmpstr,tokenbuf);
622 if (*fstr->str_ptr == '|')
623 str_cat(tmpstr,", '|'");
627 tmpstr = str_make("");
628 sprintf(tokenbuf," = &Getline%d(%s)",len,tmpstr->str_ptr);
629 str_cat(str,tokenbuf);
632 str_cat(str,",$getline_ok)");
633 saw_getline |= 1 << len;
637 str_set(str,"sprintf(");
638 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
644 str_set(str,"substr(");
645 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
648 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
652 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1));
656 str_cat(str,"999999");
661 str_set(str,ops[node+1].cval);
666 tmpstr = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
671 str_scat(str,tmpstr);
672 str_cat(str," = split(");
674 fstr = walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1);
675 if (str_len(fstr) == 3 && *fstr->str_ptr == '\'') {
676 i = fstr->str_ptr[1] & 127;
677 if (index("*+?.[]()|^$\\",i))
678 sprintf(tokenbuf,"/\\%c/",i);
680 sprintf(tokenbuf,"/%c/",i);
681 str_cat(str,tokenbuf);
688 sprintf(tokenbuf,"/[%c\\n]/",const_FS);
689 str_cat(str,tokenbuf);
696 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
698 str_cat(str,", 999)");
706 str_set(str,"index(");
707 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
710 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
718 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MATCH+1));
721 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MATCH+1));
723 str_cat(str," && ($RLENGTH = length($&), $RSTART = length($`)+1)");
729 fstr=walk(1,level-1,ops[node+2].ival,&numarg,P_MIN);
730 curargs = str_new(0);
731 str_sset(curargs,fstr);
732 str_cat(curargs,",");
733 tmp2str=walk(1,level,ops[node+5].ival,&numarg,P_MIN);
739 t = tmp2str->str_ptr;
740 while (t = instr(t,"return "))
744 for (t = s+7; *t; t++) {
745 if (*t == ';' || *t == '}')
750 tmp2str->str_cur -= 7;
756 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
760 str_cat(str,"local(");
762 str_cat(str,") = @_;");
765 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
768 str_scat(str,fstr=walk(1,level,ops[node+4].ival,&numarg,P_MIN));
771 str_scat(str,tmp2str);
779 tmp2str = str_new(0);
781 str_set(tmp2str,"1");
782 hstore(symtab,tmpstr->str_ptr,tmp2str);
789 str_cat(str,"return ");
790 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_UNI+1));
796 str_cat(str,"return");
801 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
804 tmpstr = hfetch(symtab,str->str_ptr+3);
805 if (tmpstr && tmpstr->str_ptr)
806 numeric |= atoi(tmpstr->str_ptr);
807 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
821 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MATCH+1);
822 if (strNE(tmpstr->str_ptr,"$_")) {
823 str_cat(tmpstr, " =~ s");
827 str_set(tmpstr, "s");
830 str_set(tmpstr, "s");
831 type = ops[ops[node+2].ival].ival;
834 tmp3str = str_new(0);
836 tmp2str=walk(1,level,ops[ops[node+2].ival+1].ival,&numarg,P_MIN);
837 for (t = tmp2str->str_ptr, d=tokenbuf; *t; d++,t++) {
845 str_set(tmp2str,tokenbuf);
848 tmp2str=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
849 str_set(tmp3str,"($s_ = '\"'.(");
850 str_scat(tmp3str,tmp2str);
851 str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, ");
852 str_set(tmp2str,"eval $s_");
853 s = (*s == 'g' ? "ge" : "e");
856 type = ops[ops[node+1].ival].ival;
859 fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN);
860 if (type == OREGEX) {
863 str_scat(str,tmp3str);
864 str_scat(str,tmpstr);
866 str_scat(str,tmp2str);
870 else if ((type == OFLD && !split_to_array) || (type == OVAR && len == 1)) {
873 str_scat(str,tmp3str);
874 str_scat(str,tmpstr);
878 str_scat(str,tmp2str);
886 str_cat(str,"$s = ");
889 str_scat(str,tmp3str);
890 str_scat(str,tmpstr);
892 str_scat(str,tmp2str);
905 str = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
909 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
911 for (t = tmpstr->str_ptr, d=tokenbuf; *t; d++,t++) {
914 else if (*t == '\\') {
918 case '\\': case '"': case 'n': case 't':
920 default: /* hide this from perl */
929 str_cat(str,tokenbuf);
936 str_set(str,"defined $");
940 str_set(str,"delete $");
950 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
952 tmp2str = hfetch(symtab,tmpstr->str_ptr);
953 if (tmp2str && atoi(tmp2str->str_ptr))
955 if (strEQ(str->str_ptr,"$FNR")) {
958 str_set(str,"($.-$FNRbase)");
960 else if (strEQ(str->str_ptr,"$NR")) {
964 else if (strEQ(str->str_ptr,"$NF")) {
966 str_set(str,"$#Fld");
968 else if (strEQ(str->str_ptr,"$0"))
970 else if (strEQ(str->str_ptr,"$ARGC"))
971 str_set(str,"($#ARGV+1)");
976 sprintf(tokenbuf,"$%s,",tmpstr->str_ptr);
977 ??? if (instr(curargs->str_ptr,tokenbuf))
978 str_cat(str,"\377"); /* can't translate yet */
981 str_cat(tmpstr,"[]");
982 tmp2str = hfetch(symtab,tmpstr->str_ptr);
983 if (tmp2str && atoi(tmp2str->str_ptr))
987 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
989 if (strEQ(str->str_ptr,"$ARGV[0")) {
990 str_set(str,"$ARGV0");
994 if (tmp2str && atoi(tmp2str->str_ptr))
995 strcpy(tokenbuf,"]");
997 strcpy(tokenbuf,"}");
999 str_cat(str,tokenbuf);
1006 if (split_to_array) {
1007 str_set(str,"$Fld");
1009 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1014 i = atoi(walk(1,level,ops[node+1].ival,&numarg,P_MIN)->str_ptr);
1016 sprintf(tokenbuf,"$%s",nameary[i]);
1018 sprintf(tokenbuf,"$Fld%d",i);
1019 str_set(str,tokenbuf);
1024 str_set(str,"$Fld[");
1025 i = ops[node+1].ival;
1026 if ((ops[i].ival & 255) == OPAREN)
1028 tmpstr=walk(1,level,i,&numarg,P_MIN);
1029 str_scat(str,tmpstr);
1048 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1049 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1051 str_scat(str,tmpstr);
1057 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1058 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1060 str_scat(str,tmpstr);
1066 str = walk(1,level,ops[node+1].ival,&numarg,prec);
1068 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
1070 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
1079 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1080 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1086 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1089 tmpstr = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
1090 if (*tmpstr->str_ptr == ';') {
1092 str_cat(str,tmpstr->str_ptr+1);
1099 str = str_make("close(");
1100 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1101 if (!do_fancy_opens) {
1102 t = tmpstr->str_ptr;
1103 if (*t == '"' || *t == '\'')
1104 t = cpytill(tokenbuf,t+1,*t);
1106 fatal("Internal error: OCLOSE %s",t);
1107 s = savestr(tokenbuf);
1108 for (t = tokenbuf; *t; t++) {
1110 if (!isalpha(*t) && !isdigit(*t))
1113 if (!index(tokenbuf,'_'))
1117 str_set(str,"close ");
1118 str_cat(str,tokenbuf);
1121 sprintf(tokenbuf,"$fh = delete $opened{%s} && close($fh)",
1124 str_set(str,tokenbuf);
1129 lparen = ""; /* set to parens if necessary */
1132 if (len == 3) { /* output redirection */
1133 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MIN);
1134 tmp2str = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1135 if (!do_fancy_opens) {
1136 t = tmpstr->str_ptr;
1137 if (*t == '"' || *t == '\'')
1138 t = cpytill(tokenbuf,t+1,*t);
1140 fatal("Internal error: OPRINT");
1142 s = savestr(tokenbuf);
1143 for (t = tokenbuf; *t; t++) {
1145 if (!isalpha(*t) && !isdigit(*t))
1148 if (!index(tokenbuf,'_'))
1150 tmp3str = hfetch(symtab,tokenbuf);
1152 str_cat(opens,"open(");
1153 str_cat(opens,tokenbuf);
1154 str_cat(opens,", ");
1157 str_scat(opens,tmp2str);
1158 str_cat(opens,tmpstr->str_ptr+1);
1159 if (*tmp2str->str_ptr == '|')
1160 str_cat(opens,") || die 'Cannot pipe to \"");
1162 str_cat(opens,") || die 'Cannot create file \"");
1164 str_cat(opens,"'.\"");
1167 str_cat(opens,"\".'");
1168 str_cat(opens,"\".';\n");
1169 hstore(symtab,tokenbuf,str_make("x"));
1177 sprintf(tokenbuf,"&Pick('%s', %s) &&\n",
1178 tmp2str->str_ptr, tmpstr->str_ptr);
1179 str_cat(str,tokenbuf);
1181 strcpy(tokenbuf,"$fh");
1189 strcpy(tokenbuf,"");
1190 str_cat(str,lparen); /* may be null */
1191 if (type == OPRINTF)
1192 str_cat(str,"printf");
1194 str_cat(str,"print");
1195 if (len == 3 || do_fancy_opens) {
1198 str_cat(str,tokenbuf);
1200 tmpstr = walk(1+(type==OPRINT),level,ops[node+1].ival,&numarg,P_MIN);
1201 if (!*tmpstr->str_ptr && lval_field) {
1202 t = saw_OFS ? "$," : "' '";
1203 if (split_to_array) {
1204 sprintf(tokenbuf,"join(%s,@Fld)",t);
1205 str_cat(tmpstr,tokenbuf);
1208 for (i = 1; i < maxfld; i++) {
1210 sprintf(tokenbuf,"$%s, ",nameary[i]);
1212 sprintf(tokenbuf,"$Fld%d, ",i);
1213 str_cat(tmpstr,tokenbuf);
1215 if (maxfld <= arymax)
1216 sprintf(tokenbuf,"$%s",nameary[maxfld]);
1218 sprintf(tokenbuf,"$Fld%d",maxfld);
1219 str_cat(tmpstr,tokenbuf);
1222 if (*tmpstr->str_ptr) {
1224 str_scat(str,tmpstr);
1229 str_cat(str,rparen); /* may be null */
1233 str = str_make("rand(1)");
1236 str = str_make("srand(");
1239 str = str_make("atan2(");
1242 str = str_make("sin(");
1245 str = str_make("cos(");
1248 str = str_make("system(");
1251 str = str_make("length(");
1254 str = str_make("log(");
1257 str = str_make("exp(");
1260 str = str_make("sqrt(");
1263 str = str_make("int(");
1267 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1269 tmpstr = str_new(0);;
1270 if (!*tmpstr->str_ptr) {
1272 t = saw_OFS ? "$," : "' '";
1273 if (split_to_array) {
1274 sprintf(tokenbuf,"join(%s,@Fld)",t);
1275 str_cat(tmpstr,tokenbuf);
1278 sprintf(tokenbuf,"join(%s, ",t);
1279 str_cat(tmpstr,tokenbuf);
1280 for (i = 1; i < maxfld; i++) {
1282 sprintf(tokenbuf,"$%s,",nameary[i]);
1284 sprintf(tokenbuf,"$Fld%d,",i);
1285 str_cat(tmpstr,tokenbuf);
1287 if (maxfld <= arymax)
1288 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1290 sprintf(tokenbuf,"$Fld%d)",maxfld);
1291 str_cat(tmpstr,tokenbuf);
1295 str_cat(tmpstr,"$_");
1297 if (strEQ(tmpstr->str_ptr,"$_")) {
1298 if (type == OLENGTH && !do_chop) {
1299 str = str_make("(length(");
1300 str_cat(tmpstr,") - 1");
1303 str_scat(str,tmpstr);
1309 str_set(str,"last");
1313 str_set(str,"next line");
1319 str_set(str,"exit");
1324 fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
1330 str_set(str,"ExitValue = ");
1333 fstr=walk(1,level,ops[node+1].ival,&numarg,P_ASSIGN));
1337 str_cat(str,"last line");
1342 str_set(str,"next");
1348 str_set(str,"if (");
1349 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1352 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1355 i = ops[node+3].ival;
1357 if ((ops[i].ival & 255) == OBLOCK) {
1360 if ((ops[i].ival & 255) != OIF)
1369 str_scat(str,fstr=walk(0,level,i,&numarg,P_MIN));
1373 str_cat(str,"else ");
1374 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1381 str_set(str,"while (");
1382 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1385 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1390 str_set(str,"for (");
1391 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1394 t = s = tmpstr->str_ptr;
1395 while (isalpha(*t) || isdigit(*t) || *t == '$' || *t == '_')
1402 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1403 if (i && (t = index(fstr->str_ptr,0377))) {
1404 if (strnEQ(fstr->str_ptr,s,i))
1411 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
1414 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
1418 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1419 d = index(tmpstr->str_ptr,'$');
1421 fatal("Illegal for loop: %s",tmpstr->str_ptr);
1426 fatal("Illegal for loop: %s",d);
1428 for (t = s; i = *t; t++) {
1430 if (i == '}' || i == ']')
1438 tmp2str = hfetch(symtab,str->str_ptr);
1439 if (tmp2str && atoi(tmp2str->str_ptr)) {
1441 "foreach %s (@%s) ",
1447 "foreach %s (keys %%%s) ",
1451 str_set(str,tokenbuf);
1452 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1459 if (len >= 2 && ops[node+2].ival) {
1460 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1463 fixtab(str,++level);
1464 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1467 fixtab(str,--level);
1471 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1479 fatal("Garbage length in walk");
1480 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1481 for (i = 2; i<= len; i++) {
1482 str_scat(str,fstr=walk(0,level,ops[node+i].ival,&numarg,P_MIN));
1494 if (useval && prec < minprec) { /* need parens? */
1495 fstr = str_new(str->str_cur+2);
1496 str_nset(fstr,"(",1);
1498 str_ncat(fstr,")",1);
1503 *numericptr = numeric;
1506 printf("%3d %5d %15s %d %4d ",level,node,opname[type],len,str->str_cur);
1507 for (t = str->str_ptr; *t && t - str->str_ptr < 40; t++)
1510 else if (*t == '\t')
1538 /* strip trailing white space */
1540 s = str->str_ptr+str->str_cur - 1;
1541 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1544 str->str_cur = s + 1 - str->str_ptr;
1545 if (s >= str->str_ptr && *s != '\n')
1556 s = str->str_ptr+str->str_cur - 1;
1557 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1559 if (s >= str->str_ptr && *s != ';' && *s != '}')
1563 emit_split(str,level)
1570 str_cat(str,"@Fld");
1573 for (i = 1; i < maxfld; i++) {
1575 sprintf(tokenbuf,"$%s,",nameary[i]);
1577 sprintf(tokenbuf,"$Fld%d,",i);
1578 str_cat(str,tokenbuf);
1580 if (maxfld <= arymax)
1581 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1583 sprintf(tokenbuf,"$Fld%d)",maxfld);
1584 str_cat(str,tokenbuf);
1587 sprintf(tokenbuf," = split(/[%c\\n]/, $_, 999);\n",const_FS);
1588 str_cat(str,tokenbuf);
1591 str_cat(str," = split($FS, $_, 999);\n");
1593 str_cat(str," = split(' ', $_, 999);\n");
1597 prewalk(numit,level,node,numericptr)
1609 int numeric = FALSE;
1617 type = ops[node].ival;
1622 prewalk(0,level,ops[node+1].ival,&numarg);
1623 if (ops[node+2].ival) {
1624 prewalk(0,level,ops[node+2].ival,&numarg);
1627 prewalk(0,level,ops[node+3].ival,&numarg);
1629 if (ops[node+3].ival) {
1630 prewalk(0,level,ops[node+4].ival,&numarg);
1634 prewalk(0,level,ops[node+1].ival,&numarg);
1635 prewalk(0,level,ops[node+2].ival,&numarg);
1637 prewalk(0,level,ops[node+3].ival,&numarg);
1641 prewalk(1,level,ops[node+1].ival,&numarg);
1642 prewalk(1,level,ops[node+2].ival,&numarg);
1647 prewalk(0,level,ops[node+1].ival,&numarg);
1651 prewalk(0,level,ops[node+1].ival,&numarg);
1654 i = prewalk(0,level,ops[node+1].ival,&numarg);
1657 prewalk(0,level,ops[node+2].ival,&numarg);
1661 prewalk(0,level,ops[node+2].ival,&numarg);
1666 prewalk(0,level,ops[node+1].ival,&numarg);
1669 prewalk(0,level,ops[node+1].ival,&numarg);
1670 prewalk(0,level,ops[node+2].ival,&numarg);
1673 prewalk(0,level,ops[node+1].ival,&numarg);
1674 prewalk(0,level,ops[node+2].ival,&numarg);
1677 prewalk(0,level,ops[node+1].ival,&numarg);
1680 prewalk(0,level,ops[node+1].ival,&numarg);
1684 prewalk(0,level,ops[node+1].ival,&numarg);
1686 prewalk(0,level,ops[node+2].ival,&numarg);
1689 prewalk(0,level,ops[node+1].ival,&numarg);
1691 prewalk(0,level,ops[node+2].ival,&numarg);
1694 prewalk(0,level,ops[node+1].ival,&numarg);
1698 prewalk(0,level,ops[node+2].ival,&numarg);
1700 prewalk(0,level,ops[node+1].ival,&numarg);
1701 prewalk(0,level,ops[node+3].ival,&numarg);
1706 prewalk(0,level,ops[node+1].ival,&numarg);
1710 prewalk(0,level,ops[node+2].ival,&numarg);
1711 prewalk(0,level,ops[node+1].ival,&numarg);
1712 prewalk(0,level,ops[node+3].ival,&numarg);
1716 prewalk(0,level,ops[node+1].ival,&numarg);
1720 prewalk(0,level,ops[node+1].ival,&numarg);
1721 prewalk(0,level,ops[node+2].ival,&numarg);
1724 prewalk(0,level,ops[node+2].ival,&numarg);
1725 prewalk(0,level,ops[node+1].ival,&numarg);
1726 prewalk(0,level,ops[node+3].ival,&numarg);
1727 if (numarg || strlen(ops[ops[node+1].ival+1].cval) > 1) {
1728 numericize(ops[node+2].ival);
1730 numericize(ops[node+3].ival);
1735 prewalk(1,level,ops[node+1].ival,&numarg);
1736 prewalk(1,level,ops[node+2].ival,&numarg);
1740 prewalk(1,level,ops[node+1].ival,&numarg);
1741 prewalk(1,level,ops[node+2].ival,&numarg);
1745 prewalk(1,level,ops[node+1].ival,&numarg);
1746 prewalk(1,level,ops[node+2].ival,&numarg);
1750 prewalk(1,level,ops[node+1].ival,&numarg);
1751 prewalk(1,level,ops[node+2].ival,&numarg);
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);
1769 prewalk(1,level,ops[node+1].ival,&numarg);
1773 prewalk(1,level,ops[node+1].ival,&numarg);
1777 prewalk(1,level,ops[node+1].ival,&numarg);
1781 prewalk(1,level,ops[node+1].ival,&numarg);
1785 prewalk(1,level,ops[node+1].ival,&numarg);
1789 prewalk(0,level,ops[node+1].ival,&numarg);
1795 prewalk(0,level,ops[node+1].ival,&numarg);
1798 prewalk(0,level,ops[node+1].ival,&numarg);
1799 prewalk(1,level,ops[node+2].ival,&numarg);
1801 prewalk(1,level,ops[node+3].ival,&numarg);
1808 prewalk(0,level,ops[node+2].ival,&numarg);
1810 prewalk(0,level,ops[node+3].ival,&numarg);
1811 prewalk(0,level,ops[node+1].ival,&numarg);
1814 prewalk(0,level,ops[node+1].ival,&numarg);
1815 prewalk(0,level,ops[node+2].ival,&numarg);
1819 prewalk(0,level,ops[node+1].ival,&numarg);
1820 prewalk(0,level,ops[node+2].ival,&numarg);
1826 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1828 prewalk(0,level,ops[node+2].ival,&numarg);
1829 prewalk(0,level,ops[node+4].ival,&numarg);
1830 prewalk(0,level,ops[node+5].ival,&numarg);
1832 str_cat(tmpstr,"(");
1833 tmp2str = str_new(0);
1834 if (subretnum || numarg)
1835 str_set(tmp2str,"1");
1836 hstore(symtab,tmpstr->str_ptr,tmp2str);
1842 prewalk(0,level,ops[node+1].ival,&numarg);
1848 tmp2str = str_new(0);
1849 str_scat(tmp2str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1850 fixrargs(tmpstr->str_ptr,ops[node+2].ival,0);
1852 str_cat(tmp2str,"(");
1853 tmpstr = hfetch(symtab,tmp2str->str_ptr);
1854 if (tmpstr && tmpstr->str_ptr)
1855 numeric |= atoi(tmpstr->str_ptr);
1856 prewalk(0,level,ops[node+2].ival,&numarg);
1862 prewalk(0,level,ops[node+3].ival,&numarg);
1863 prewalk(0,level,ops[ops[node+2].ival+1].ival,&numarg);
1864 prewalk(0,level,ops[node+1].ival,&numarg);
1868 prewalk(0,level,ops[node+1].ival,&numarg);
1872 prewalk(0,level,ops[node+1].ival,&numarg);
1878 prewalk(0,level,ops[node+1].ival,&numarg);
1884 prewalk(0,level,ops[node+2].ival,&numarg);
1888 prewalk(0,level,ops[node+1].ival,&numarg);
1891 i = ops[node+1].ival;
1892 prewalk(0,level,i,&numarg);
1905 prewalk(0,level,ops[node+1].ival,&numarg);
1906 prewalk(0,level,ops[node+2].ival,&numarg);
1907 prewalk(0,level,ops[node+3].ival,&numarg);
1912 prewalk(0,level,ops[node+1].ival,&numarg);
1913 prewalk(0,level,ops[node+2].ival,&numarg);
1917 prewalk(0,level,ops[node+1].ival,&numarg);
1919 prewalk(0,level,ops[node+2].ival,&numarg);
1924 prewalk(0,level,ops[node+1].ival,&numarg);
1928 if (len == 3) { /* output redirection */
1929 prewalk(0,level,ops[node+3].ival,&numarg);
1930 prewalk(0,level,ops[node+2].ival,&numarg);
1932 prewalk(0+(type==OPRINT),level,ops[node+1].ival,&numarg);
1958 prewalk(type != OLENGTH && type != OSYSTEM,
1959 level,ops[node+1].ival,&numarg);
1967 prewalk(1,level,ops[node+1].ival,&numarg);
1975 prewalk(0,level,ops[node+1].ival,&numarg);
1976 prewalk(0,level,ops[node+2].ival,&numarg);
1978 prewalk(0,level,ops[node+3].ival,&numarg);
1982 prewalk(0,level,ops[node+1].ival,&numarg);
1983 prewalk(0,level,ops[node+2].ival,&numarg);
1986 prewalk(0,level,ops[node+1].ival,&numarg);
1987 prewalk(0,level,ops[node+2].ival,&numarg);
1988 prewalk(0,level,ops[node+3].ival,&numarg);
1989 prewalk(0,level,ops[node+4].ival,&numarg);
1992 prewalk(0,level,ops[node+2].ival,&numarg);
1993 prewalk(0,level,ops[node+1].ival,&numarg);
1997 prewalk(0,level,ops[node+2].ival,&numarg);
2000 prewalk(0,level,ops[node+1].ival,&numarg);
2007 fatal("Garbage length in prewalk");
2008 prewalk(0,level,ops[node+1].ival,&numarg);
2009 for (i = 2; i<= len; i++) {
2010 prewalk(0,level,ops[node+i].ival,&numarg);
2015 *numericptr = numeric;
2029 type = ops[node].ival;
2032 if (type == OVAR && len == 1) {
2033 tmpstr=walk(0,0,ops[node+1].ival,&numarg,P_MIN);
2034 tmp2str = str_make("1");
2035 hstore(symtab,tmpstr->str_ptr,tmp2str);