1 /* $Header: walk.c,v 3.0.1.2 89/11/17 15:53:00 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.2 89/11/17 15:53:00 lwall
10 * patch5: on Pyramids, index(s, '}' + 128) doesn't find meta-}
12 * Revision 3.0.1.1 89/11/11 05:09:33 lwall
13 * patch2: in a2p, awk script with no line actions still needs main loop
15 * Revision 3.0 89/10/18 15:35:48 lwall
26 bool realexit = FALSE;
27 bool saw_getline = FALSE;
28 bool subretnum = FALSE;
30 bool saw_argv0 = FALSE;
35 STR *curargs = Nullstr;
38 walk(useval,level,node,numericptr,minprec)
43 int minprec; /* minimum precedence without parens */
57 int prec = P_MAX; /* assume no parens needed */
64 type = ops[node].ival;
71 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
72 if (do_split && need_entire && !absmaxfld)
73 split_to_array = TRUE;
74 if (do_split && split_to_array)
75 set_array_base = TRUE;
77 str_cat(str,"$[ = 1;\t\t\t# set array base to 1\n");
79 if (fswitch && !const_FS)
81 if (saw_FS > 1 || saw_RS)
83 if (saw_ORS && need_entire)
86 str_cat(str,"$FS = '");
87 if (index("*+?.[]()|^$\\",fswitch))
89 sprintf(tokenbuf,"%c",fswitch);
90 str_cat(str,tokenbuf);
91 str_cat(str,"';\t\t# field separator from -F switch\n");
93 else if (saw_FS && !const_FS) {
94 str_cat(str,"$FS = ' ';\t\t# set field separator\n");
97 str_cat(str,"$, = ' ';\t\t# set output field separator\n");
100 str_cat(str,"$\\ = \"\\n\";\t\t# set output record separator\n");
103 str_cat(str,"$ARGV0 = $0;\t\t# remember what we ran as\n");
105 if (str->str_cur > 20)
107 if (ops[node+2].ival) {
108 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
112 fstr = walk(0,level+1,ops[node+3].ival,&numarg,P_MIN);
113 if (*fstr->str_ptr) {
115 str_cat(str,"line: ");
116 str_cat(str,"while (<>) {\n");
118 if (saw_FS && !const_FS)
121 str_cat(str,"chop;\t# strip record separator\n");
126 while (isalpha(*namelist)) {
127 for (d = tokenbuf,s=namelist;
128 isalpha(*s) || isdigit(*s) || *s == '_';
131 while (*s && !isalpha(*s)) s++;
133 nameary[++arymax] = savestr(tokenbuf);
139 emit_split(str,level);
145 str_cat(str,"continue {\n $FNRbase = $. if eof;\n}\n");
148 str_cat(str,"while (<>) { } # (no line actions)\n");
149 if (ops[node+4].ival) {
153 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
158 str_cat(str,"exit ExitValue;\n");
164 for (len = 0; len < 4; len++) {
165 if (saw_getline & (1 << len)) {
166 sprintf(tokenbuf,"\nsub Getline%d {\n",len);
167 str_cat(str, tokenbuf);
170 str_cat(str," &Pick('',@_);\n");
172 str_cat(str," ($fh) = @_;\n");
176 str_cat(str," $FNRbase = $. if eof;\n");
179 str_cat(str," local($_)\n");
182 " if ($getline_ok = (($_ = <$fh>) ne ''))");
185 " if ($getline_ok = (($_ = <>) ne ''))");
186 str_cat(str, " {\n");
192 str_cat(str,"chop;\t# strip record separator\n");
195 if (do_split && !(len & 1)) {
197 emit_split(str,level);
202 str_cat(str,"}\n $_;\n}\n");
207 if (do_fancy_opens) {
210 local($mode,$name,$pipe) = @_;\n\
211 $fh = $opened{$name};\n\
213 $fh = $opened{$name} = 'fh_' . ($nextfh++ + 0);\n\
214 open($fh,$mode.$name.$pipe);\n\
221 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
222 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
225 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
233 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
235 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
243 tmpstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN);
244 /* translate \nnn to [\nnn] */
245 for (s = tmpstr->str_ptr, d = tokenbuf; *s; s++, d++) {
246 if (*s == '\\' && isdigit(s[1]) && isdigit(s[2]) && isdigit(s[3])){
258 for (d=tokenbuf; *d; d++)
260 str_cat(str,tokenbuf);
267 str = walk(0,level,oper1(OPRINT,0),&numarg,P_MIN);
269 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
274 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
275 if (*tmpstr->str_ptr) {
278 str_scat(str,tmpstr);
279 str_cat(str,") {\n");
281 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
288 str = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
295 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
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));
310 str = walk(1,level,ops[node+1].ival,&numarg,prec);
312 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
314 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
321 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
327 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
334 str = walk(1,level,ops[node+1].ival,&numarg,prec);
337 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
339 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
344 str = walk(1,level,ops[node+1].ival,&numarg,prec);
347 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
349 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
356 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
362 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
364 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
365 tmp2str = walk(1,level,ops[node+3].ival,&numarg,prec+1);
368 (!numarg && (*tmp2str->str_ptr == '"' || *tmp2str->str_ptr == '\''))) {
371 str_set(tmpstr,"eq");
372 else if (strEQ(t,"!="))
373 str_set(tmpstr,"ne");
374 else if (strEQ(t,"<"))
375 str_set(tmpstr,"lt");
376 else if (strEQ(t,"<="))
377 str_set(tmpstr,"le");
378 else if (strEQ(t,">"))
379 str_set(tmpstr,"gt");
380 else if (strEQ(t,">="))
381 str_set(tmpstr,"ge");
382 if (!index(tmpstr->str_ptr,'\'') && !index(tmpstr->str_ptr,'"') &&
383 !index(tmp2str->str_ptr,'\'') && !index(tmp2str->str_ptr,'"') )
387 if (numeric & 1) /* numeric is very good guess */
395 str_scat(str,tmpstr);
398 str_scat(str,tmp2str);
405 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
412 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
414 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
415 if (strEQ(tmpstr->str_ptr,"~"))
418 str_scat(str,tmpstr);
422 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
430 fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
437 type = ops[ops[node+1].ival].ival & 255;
438 str = walk(1,level,ops[node+1].ival,&numarg,prec+(type != OCONCAT));
440 type = ops[ops[node+2].ival].ival & 255;
442 fstr=walk(1,level,ops[node+2].ival,&numarg,prec+(type != OCONCAT)));
447 str = walk(0,level,ops[node+2].ival,&numarg,prec+1);
449 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
450 str_scat(str,tmpstr);
451 if (str_len(tmpstr) > 1)
455 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec));
461 str = walk(1,level,ops[node+1].ival,&numarg,prec);
463 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
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+1);
495 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec));
501 str = walk(1,level,ops[node+1].ival,&numarg,prec);
503 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
509 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
515 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
523 str_scat(str,fstr=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));
550 fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
561 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
562 if (!*fstr->str_ptr) {
564 len = 2; /* a legal fiction */
571 tmpstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN);
572 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
573 if (!do_fancy_opens) {
575 if (*t == '"' || *t == '\'')
576 t = cpytill(tokenbuf,t+1,*t);
578 fatal("Internal error: OGETLINE %s", t);
580 s = savestr(tokenbuf);
581 for (t = tokenbuf; *t; t++) {
583 if (!isalpha(*t) && !isdigit(*t))
586 if (!index(tokenbuf,'_'))
588 tmp3str = hfetch(symtab,tokenbuf);
591 str_cat(opens,"open(");
592 str_cat(opens,tokenbuf);
596 str_cat(opens,tmpstr->str_ptr+1);
598 if (*fstr->str_ptr == '|')
601 if (*fstr->str_ptr == '|')
602 str_cat(opens,") || die 'Cannot pipe from \"");
604 str_cat(opens,") || die 'Cannot open file \"");
606 str_cat(opens,"'.\"");
609 str_cat(opens,"\".'");
610 str_cat(opens,"\".';\n");
611 hstore(symtab,tokenbuf,str_make("x"));
616 str_cat(tmpstr,tokenbuf);
619 if (*fstr->str_ptr == '|')
620 str_cat(tmpstr,", '|'");
624 tmpstr = str_make("");
625 sprintf(tokenbuf," = &Getline%d(%s)",len,tmpstr->str_ptr);
626 str_cat(str,tokenbuf);
629 str_cat(str,",$getline_ok)");
630 saw_getline |= 1 << len;
634 str_set(str,"sprintf(");
635 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
641 str_set(str,"substr(");
642 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
645 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
649 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1));
653 str_cat(str,"999999");
658 str_set(str,ops[node+1].cval);
663 tmpstr = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
668 str_scat(str,tmpstr);
669 str_cat(str," = split(");
671 fstr = walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1);
672 if (str_len(fstr) == 3 && *fstr->str_ptr == '\'') {
673 i = fstr->str_ptr[1] & 127;
674 if (index("*+?.[]()|^$\\",i))
675 sprintf(tokenbuf,"/\\%c/",i);
677 sprintf(tokenbuf,"/%c/",i);
678 str_cat(str,tokenbuf);
685 sprintf(tokenbuf,"/[%c\\n]/",const_FS);
686 str_cat(str,tokenbuf);
693 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
695 str_cat(str,", 999)");
703 str_set(str,"index(");
704 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
707 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
715 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MATCH+1));
718 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MATCH+1));
720 str_cat(str," && ($RLENGTH = length($&), $RSTART = length($`)+1)");
726 fstr=walk(1,level-1,ops[node+2].ival,&numarg,P_MIN);
727 curargs = str_new(0);
728 str_sset(curargs,fstr);
729 str_cat(curargs,",");
730 tmp2str=walk(1,level,ops[node+5].ival,&numarg,P_MIN);
736 t = tmp2str->str_ptr;
737 while (t = instr(t,"return "))
741 for (t = s+7; *t; t++) {
742 if (*t == ';' || *t == '}')
747 tmp2str->str_cur -= 7;
753 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
757 str_cat(str,"local(");
759 str_cat(str,") = @_;");
762 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
765 str_scat(str,fstr=walk(1,level,ops[node+4].ival,&numarg,P_MIN));
768 str_scat(str,tmp2str);
776 tmp2str = str_new(0);
778 str_set(tmp2str,"1");
779 hstore(symtab,tmpstr->str_ptr,tmp2str);
786 str_cat(str,"return ");
787 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_UNI+1));
793 str_cat(str,"return");
798 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
801 tmpstr = hfetch(symtab,str->str_ptr+3);
802 if (tmpstr && tmpstr->str_ptr)
803 numeric |= atoi(tmpstr->str_ptr);
804 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
818 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MATCH+1);
819 if (strNE(tmpstr->str_ptr,"$_")) {
820 str_cat(tmpstr, " =~ s");
824 str_set(tmpstr, "s");
827 str_set(tmpstr, "s");
828 type = ops[ops[node+2].ival].ival;
831 tmp3str = str_new(0);
833 tmp2str=walk(1,level,ops[ops[node+2].ival+1].ival,&numarg,P_MIN);
834 for (t = tmp2str->str_ptr, d=tokenbuf; *t; d++,t++) {
842 str_set(tmp2str,tokenbuf);
845 tmp2str=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
846 str_set(tmp3str,"($s_ = '\"'.(");
847 str_scat(tmp3str,tmp2str);
848 str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, ");
849 str_set(tmp2str,"eval $s_");
850 s = (*s == 'g' ? "ge" : "e");
853 type = ops[ops[node+1].ival].ival;
856 fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN);
857 if (type == OREGEX) {
860 str_scat(str,tmp3str);
861 str_scat(str,tmpstr);
863 str_scat(str,tmp2str);
867 else if ((type == OFLD && !split_to_array) || (type == OVAR && len == 1)) {
870 str_scat(str,tmp3str);
871 str_scat(str,tmpstr);
875 str_scat(str,tmp2str);
883 str_cat(str,"$s = ");
886 str_scat(str,tmp3str);
887 str_scat(str,tmpstr);
889 str_scat(str,tmp2str);
902 str = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
906 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
908 for (t = tmpstr->str_ptr, d=tokenbuf; *t; d++,t++) {
911 else if (*t == '\\') {
915 case '\\': case '"': case 'n': case 't':
917 default: /* hide this from perl */
926 str_cat(str,tokenbuf);
933 str_set(str,"defined $");
937 str_set(str,"delete $");
947 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
949 tmp2str = hfetch(symtab,tmpstr->str_ptr);
950 if (tmp2str && atoi(tmp2str->str_ptr))
952 if (strEQ(str->str_ptr,"$FNR")) {
955 str_set(str,"($.-$FNRbase)");
957 else if (strEQ(str->str_ptr,"$NR")) {
961 else if (strEQ(str->str_ptr,"$NF")) {
963 str_set(str,"$#Fld");
965 else if (strEQ(str->str_ptr,"$0"))
967 else if (strEQ(str->str_ptr,"$ARGC"))
968 str_set(str,"($#ARGV+1)");
973 sprintf(tokenbuf,"$%s,",tmpstr->str_ptr);
974 ??? if (instr(curargs->str_ptr,tokenbuf))
975 str_cat(str,"\377"); /* can't translate yet */
978 str_cat(tmpstr,"[]");
979 tmp2str = hfetch(symtab,tmpstr->str_ptr);
980 if (tmp2str && atoi(tmp2str->str_ptr))
984 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
986 if (strEQ(str->str_ptr,"$ARGV[0")) {
987 str_set(str,"$ARGV0");
991 if (tmp2str && atoi(tmp2str->str_ptr))
992 strcpy(tokenbuf,"]");
994 strcpy(tokenbuf,"}");
996 str_cat(str,tokenbuf);
1003 if (split_to_array) {
1004 str_set(str,"$Fld");
1006 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1011 i = atoi(walk(1,level,ops[node+1].ival,&numarg,P_MIN)->str_ptr);
1013 sprintf(tokenbuf,"$%s",nameary[i]);
1015 sprintf(tokenbuf,"$Fld%d",i);
1016 str_set(str,tokenbuf);
1021 str_set(str,"$Fld[");
1022 i = ops[node+1].ival;
1023 if ((ops[i].ival & 255) == OPAREN)
1025 tmpstr=walk(1,level,i,&numarg,P_MIN);
1026 str_scat(str,tmpstr);
1045 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1046 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1048 str_scat(str,tmpstr);
1054 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1055 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1057 str_scat(str,tmpstr);
1063 str = walk(1,level,ops[node+1].ival,&numarg,prec);
1065 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
1067 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
1076 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1077 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1083 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1086 tmpstr = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
1087 if (*tmpstr->str_ptr == ';') {
1089 str_cat(str,tmpstr->str_ptr+1);
1096 str = str_make("close(");
1097 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1098 if (!do_fancy_opens) {
1099 t = tmpstr->str_ptr;
1100 if (*t == '"' || *t == '\'')
1101 t = cpytill(tokenbuf,t+1,*t);
1103 fatal("Internal error: OCLOSE %s",t);
1104 s = savestr(tokenbuf);
1105 for (t = tokenbuf; *t; t++) {
1107 if (!isalpha(*t) && !isdigit(*t))
1110 if (!index(tokenbuf,'_'))
1114 str_set(str,"close ");
1115 str_cat(str,tokenbuf);
1118 sprintf(tokenbuf,"$fh = delete $opened{%s} && close($fh)",
1121 str_set(str,tokenbuf);
1126 lparen = ""; /* set to parens if necessary */
1129 if (len == 3) { /* output redirection */
1130 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MIN);
1131 tmp2str = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1132 if (!do_fancy_opens) {
1133 t = tmpstr->str_ptr;
1134 if (*t == '"' || *t == '\'')
1135 t = cpytill(tokenbuf,t+1,*t);
1137 fatal("Internal error: OPRINT");
1139 s = savestr(tokenbuf);
1140 for (t = tokenbuf; *t; t++) {
1142 if (!isalpha(*t) && !isdigit(*t))
1145 if (!index(tokenbuf,'_'))
1147 tmp3str = hfetch(symtab,tokenbuf);
1149 str_cat(opens,"open(");
1150 str_cat(opens,tokenbuf);
1151 str_cat(opens,", ");
1154 str_scat(opens,tmp2str);
1155 str_cat(opens,tmpstr->str_ptr+1);
1156 if (*tmp2str->str_ptr == '|')
1157 str_cat(opens,") || die 'Cannot pipe to \"");
1159 str_cat(opens,") || die 'Cannot create file \"");
1161 str_cat(opens,"'.\"");
1164 str_cat(opens,"\".'");
1165 str_cat(opens,"\".';\n");
1166 hstore(symtab,tokenbuf,str_make("x"));
1174 sprintf(tokenbuf,"&Pick('%s', %s) &&\n",
1175 tmp2str->str_ptr, tmpstr->str_ptr);
1176 str_cat(str,tokenbuf);
1178 strcpy(tokenbuf,"$fh");
1186 strcpy(tokenbuf,"");
1187 str_cat(str,lparen); /* may be null */
1188 if (type == OPRINTF)
1189 str_cat(str,"printf");
1191 str_cat(str,"print");
1192 if (len == 3 || do_fancy_opens) {
1195 str_cat(str,tokenbuf);
1197 tmpstr = walk(1+(type==OPRINT),level,ops[node+1].ival,&numarg,P_MIN);
1198 if (!*tmpstr->str_ptr && lval_field) {
1199 t = saw_OFS ? "$," : "' '";
1200 if (split_to_array) {
1201 sprintf(tokenbuf,"join(%s,@Fld)",t);
1202 str_cat(tmpstr,tokenbuf);
1205 for (i = 1; i < maxfld; i++) {
1207 sprintf(tokenbuf,"$%s, ",nameary[i]);
1209 sprintf(tokenbuf,"$Fld%d, ",i);
1210 str_cat(tmpstr,tokenbuf);
1212 if (maxfld <= arymax)
1213 sprintf(tokenbuf,"$%s",nameary[maxfld]);
1215 sprintf(tokenbuf,"$Fld%d",maxfld);
1216 str_cat(tmpstr,tokenbuf);
1219 if (*tmpstr->str_ptr) {
1221 str_scat(str,tmpstr);
1226 str_cat(str,rparen); /* may be null */
1230 str = str_make("rand(1)");
1233 str = str_make("srand(");
1236 str = str_make("atan2(");
1239 str = str_make("sin(");
1242 str = str_make("cos(");
1245 str = str_make("system(");
1248 str = str_make("length(");
1251 str = str_make("log(");
1254 str = str_make("exp(");
1257 str = str_make("sqrt(");
1260 str = str_make("int(");
1264 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1266 tmpstr = str_new(0);;
1267 if (!*tmpstr->str_ptr) {
1269 t = saw_OFS ? "$," : "' '";
1270 if (split_to_array) {
1271 sprintf(tokenbuf,"join(%s,@Fld)",t);
1272 str_cat(tmpstr,tokenbuf);
1275 sprintf(tokenbuf,"join(%s, ",t);
1276 str_cat(tmpstr,tokenbuf);
1277 for (i = 1; i < maxfld; i++) {
1279 sprintf(tokenbuf,"$%s,",nameary[i]);
1281 sprintf(tokenbuf,"$Fld%d,",i);
1282 str_cat(tmpstr,tokenbuf);
1284 if (maxfld <= arymax)
1285 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1287 sprintf(tokenbuf,"$Fld%d)",maxfld);
1288 str_cat(tmpstr,tokenbuf);
1292 str_cat(tmpstr,"$_");
1294 if (strEQ(tmpstr->str_ptr,"$_")) {
1295 if (type == OLENGTH && !do_chop) {
1296 str = str_make("(length(");
1297 str_cat(tmpstr,") - 1");
1300 str_scat(str,tmpstr);
1306 str_set(str,"last");
1310 str_set(str,"next line");
1316 str_set(str,"exit");
1321 fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
1327 str_set(str,"ExitValue = ");
1330 fstr=walk(1,level,ops[node+1].ival,&numarg,P_ASSIGN));
1334 str_cat(str,"last line");
1339 str_set(str,"next");
1345 str_set(str,"if (");
1346 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1349 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1352 i = ops[node+3].ival;
1354 if ((ops[i].ival & 255) == OBLOCK) {
1357 if ((ops[i].ival & 255) != OIF)
1366 str_scat(str,fstr=walk(0,level,i,&numarg,P_MIN));
1370 str_cat(str,"else ");
1371 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1378 str_set(str,"while (");
1379 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1382 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1387 str_set(str,"for (");
1388 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1391 t = s = tmpstr->str_ptr;
1392 while (isalpha(*t) || isdigit(*t) || *t == '$' || *t == '_')
1399 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1400 if (i && (t = index(fstr->str_ptr,0377))) {
1401 if (strnEQ(fstr->str_ptr,s,i))
1408 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
1411 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
1415 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1416 d = index(tmpstr->str_ptr,'$');
1418 fatal("Illegal for loop: %s",tmpstr->str_ptr);
1423 fatal("Illegal for loop: %s",d);
1425 for (t = s; i = *t; t++) {
1427 if (i == '}' || i == ']')
1435 tmp2str = hfetch(symtab,str->str_ptr);
1436 if (tmp2str && atoi(tmp2str->str_ptr)) {
1438 "foreach %s (@%s) ",
1444 "foreach %s (keys %%%s) ",
1448 str_set(str,tokenbuf);
1449 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1456 if (len >= 2 && ops[node+2].ival) {
1457 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1460 fixtab(str,++level);
1461 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1464 fixtab(str,--level);
1468 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1476 fatal("Garbage length in walk");
1477 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1478 for (i = 2; i<= len; i++) {
1479 str_scat(str,fstr=walk(0,level,ops[node+i].ival,&numarg,P_MIN));
1491 if (useval && prec < minprec) { /* need parens? */
1492 fstr = str_new(str->str_cur+2);
1493 str_nset(fstr,"(",1);
1495 str_ncat(fstr,")",1);
1500 *numericptr = numeric;
1503 printf("%3d %5d %15s %d %4d ",level,node,opname[type],len,str->str_cur);
1504 for (t = str->str_ptr; *t && t - str->str_ptr < 40; t++)
1507 else if (*t == '\t')
1535 /* strip trailing white space */
1537 s = str->str_ptr+str->str_cur - 1;
1538 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1541 str->str_cur = s + 1 - str->str_ptr;
1542 if (s >= str->str_ptr && *s != '\n')
1553 s = str->str_ptr+str->str_cur - 1;
1554 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1556 if (s >= str->str_ptr && *s != ';' && *s != '}')
1560 emit_split(str,level)
1567 str_cat(str,"@Fld");
1570 for (i = 1; i < maxfld; i++) {
1572 sprintf(tokenbuf,"$%s,",nameary[i]);
1574 sprintf(tokenbuf,"$Fld%d,",i);
1575 str_cat(str,tokenbuf);
1577 if (maxfld <= arymax)
1578 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1580 sprintf(tokenbuf,"$Fld%d)",maxfld);
1581 str_cat(str,tokenbuf);
1584 sprintf(tokenbuf," = split(/[%c\\n]/, $_, 999);\n",const_FS);
1585 str_cat(str,tokenbuf);
1588 str_cat(str," = split($FS, $_, 999);\n");
1590 str_cat(str," = split(' ', $_, 999);\n");
1594 prewalk(numit,level,node,numericptr)
1606 int numeric = FALSE;
1614 type = ops[node].ival;
1619 prewalk(0,level,ops[node+1].ival,&numarg);
1620 if (ops[node+2].ival) {
1621 prewalk(0,level,ops[node+2].ival,&numarg);
1624 prewalk(0,level,ops[node+3].ival,&numarg);
1626 if (ops[node+3].ival) {
1627 prewalk(0,level,ops[node+4].ival,&numarg);
1631 prewalk(0,level,ops[node+1].ival,&numarg);
1632 prewalk(0,level,ops[node+2].ival,&numarg);
1634 prewalk(0,level,ops[node+3].ival,&numarg);
1638 prewalk(1,level,ops[node+1].ival,&numarg);
1639 prewalk(1,level,ops[node+2].ival,&numarg);
1644 prewalk(0,level,ops[node+1].ival,&numarg);
1648 prewalk(0,level,ops[node+1].ival,&numarg);
1651 i = prewalk(0,level,ops[node+1].ival,&numarg);
1654 prewalk(0,level,ops[node+2].ival,&numarg);
1658 prewalk(0,level,ops[node+2].ival,&numarg);
1663 prewalk(0,level,ops[node+1].ival,&numarg);
1666 prewalk(0,level,ops[node+1].ival,&numarg);
1667 prewalk(0,level,ops[node+2].ival,&numarg);
1670 prewalk(0,level,ops[node+1].ival,&numarg);
1671 prewalk(0,level,ops[node+2].ival,&numarg);
1674 prewalk(0,level,ops[node+1].ival,&numarg);
1677 prewalk(0,level,ops[node+1].ival,&numarg);
1681 prewalk(0,level,ops[node+1].ival,&numarg);
1683 prewalk(0,level,ops[node+2].ival,&numarg);
1686 prewalk(0,level,ops[node+1].ival,&numarg);
1688 prewalk(0,level,ops[node+2].ival,&numarg);
1691 prewalk(0,level,ops[node+1].ival,&numarg);
1695 prewalk(0,level,ops[node+2].ival,&numarg);
1697 prewalk(0,level,ops[node+1].ival,&numarg);
1698 prewalk(0,level,ops[node+3].ival,&numarg);
1703 prewalk(0,level,ops[node+1].ival,&numarg);
1707 prewalk(0,level,ops[node+2].ival,&numarg);
1708 prewalk(0,level,ops[node+1].ival,&numarg);
1709 prewalk(0,level,ops[node+3].ival,&numarg);
1713 prewalk(0,level,ops[node+1].ival,&numarg);
1717 prewalk(0,level,ops[node+1].ival,&numarg);
1718 prewalk(0,level,ops[node+2].ival,&numarg);
1721 prewalk(0,level,ops[node+2].ival,&numarg);
1722 prewalk(0,level,ops[node+1].ival,&numarg);
1723 prewalk(0,level,ops[node+3].ival,&numarg);
1724 if (numarg || strlen(ops[ops[node+1].ival+1].cval) > 1) {
1725 numericize(ops[node+2].ival);
1727 numericize(ops[node+3].ival);
1732 prewalk(1,level,ops[node+1].ival,&numarg);
1733 prewalk(1,level,ops[node+2].ival,&numarg);
1737 prewalk(1,level,ops[node+1].ival,&numarg);
1738 prewalk(1,level,ops[node+2].ival,&numarg);
1742 prewalk(1,level,ops[node+1].ival,&numarg);
1743 prewalk(1,level,ops[node+2].ival,&numarg);
1747 prewalk(1,level,ops[node+1].ival,&numarg);
1748 prewalk(1,level,ops[node+2].ival,&numarg);
1752 prewalk(1,level,ops[node+1].ival,&numarg);
1753 prewalk(1,level,ops[node+2].ival,&numarg);
1757 prewalk(1,level,ops[node+1].ival,&numarg);
1758 prewalk(1,level,ops[node+2].ival,&numarg);
1762 prewalk(1,level,ops[node+1].ival,&numarg);
1766 prewalk(1,level,ops[node+1].ival,&numarg);
1770 prewalk(1,level,ops[node+1].ival,&numarg);
1774 prewalk(1,level,ops[node+1].ival,&numarg);
1778 prewalk(1,level,ops[node+1].ival,&numarg);
1782 prewalk(1,level,ops[node+1].ival,&numarg);
1786 prewalk(0,level,ops[node+1].ival,&numarg);
1792 prewalk(0,level,ops[node+1].ival,&numarg);
1795 prewalk(0,level,ops[node+1].ival,&numarg);
1796 prewalk(1,level,ops[node+2].ival,&numarg);
1798 prewalk(1,level,ops[node+3].ival,&numarg);
1805 prewalk(0,level,ops[node+2].ival,&numarg);
1807 prewalk(0,level,ops[node+3].ival,&numarg);
1808 prewalk(0,level,ops[node+1].ival,&numarg);
1811 prewalk(0,level,ops[node+1].ival,&numarg);
1812 prewalk(0,level,ops[node+2].ival,&numarg);
1816 prewalk(0,level,ops[node+1].ival,&numarg);
1817 prewalk(0,level,ops[node+2].ival,&numarg);
1823 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1825 prewalk(0,level,ops[node+2].ival,&numarg);
1826 prewalk(0,level,ops[node+4].ival,&numarg);
1827 prewalk(0,level,ops[node+5].ival,&numarg);
1829 str_cat(tmpstr,"(");
1830 tmp2str = str_new(0);
1831 if (subretnum || numarg)
1832 str_set(tmp2str,"1");
1833 hstore(symtab,tmpstr->str_ptr,tmp2str);
1839 prewalk(0,level,ops[node+1].ival,&numarg);
1845 tmp2str = str_new(0);
1846 str_scat(tmp2str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1847 fixrargs(tmpstr->str_ptr,ops[node+2],0);
1849 str_cat(tmp2str,"(");
1850 tmpstr = hfetch(symtab,tmp2str->str_ptr);
1851 if (tmpstr && tmpstr->str_ptr)
1852 numeric |= atoi(tmpstr->str_ptr);
1853 prewalk(0,level,ops[node+2].ival,&numarg);
1859 prewalk(0,level,ops[node+3].ival,&numarg);
1860 prewalk(0,level,ops[ops[node+2].ival+1].ival,&numarg);
1861 prewalk(0,level,ops[node+1].ival,&numarg);
1865 prewalk(0,level,ops[node+1].ival,&numarg);
1869 prewalk(0,level,ops[node+1].ival,&numarg);
1875 prewalk(0,level,ops[node+1].ival,&numarg);
1881 prewalk(0,level,ops[node+2].ival,&numarg);
1885 prewalk(0,level,ops[node+1].ival,&numarg);
1888 i = ops[node+1].ival;
1889 prewalk(0,level,i,&numarg);
1902 prewalk(0,level,ops[node+1].ival,&numarg);
1903 prewalk(0,level,ops[node+2].ival,&numarg);
1904 prewalk(0,level,ops[node+3].ival,&numarg);
1909 prewalk(0,level,ops[node+1].ival,&numarg);
1910 prewalk(0,level,ops[node+2].ival,&numarg);
1914 prewalk(0,level,ops[node+1].ival,&numarg);
1916 prewalk(0,level,ops[node+2].ival,&numarg);
1921 prewalk(0,level,ops[node+1].ival,&numarg);
1925 if (len == 3) { /* output redirection */
1926 prewalk(0,level,ops[node+3].ival,&numarg);
1927 prewalk(0,level,ops[node+2].ival,&numarg);
1929 prewalk(0+(type==OPRINT),level,ops[node+1].ival,&numarg);
1955 prewalk(type != OLENGTH && type != OSYSTEM,
1956 level,ops[node+1].ival,&numarg);
1964 prewalk(1,level,ops[node+1].ival,&numarg);
1972 prewalk(0,level,ops[node+1].ival,&numarg);
1973 prewalk(0,level,ops[node+2].ival,&numarg);
1975 prewalk(0,level,ops[node+3].ival,&numarg);
1979 prewalk(0,level,ops[node+1].ival,&numarg);
1980 prewalk(0,level,ops[node+2].ival,&numarg);
1983 prewalk(0,level,ops[node+1].ival,&numarg);
1984 prewalk(0,level,ops[node+2].ival,&numarg);
1985 prewalk(0,level,ops[node+3].ival,&numarg);
1986 prewalk(0,level,ops[node+4].ival,&numarg);
1989 prewalk(0,level,ops[node+2].ival,&numarg);
1990 prewalk(0,level,ops[node+1].ival,&numarg);
1994 prewalk(0,level,ops[node+2].ival,&numarg);
1997 prewalk(0,level,ops[node+1].ival,&numarg);
2004 fatal("Garbage length in prewalk");
2005 prewalk(0,level,ops[node+1].ival,&numarg);
2006 for (i = 2; i<= len; i++) {
2007 prewalk(0,level,ops[node+i].ival,&numarg);
2012 *numericptr = numeric;
2026 type = ops[node].ival;
2029 if (type == OVAR && len == 1) {
2030 tmpstr=walk(0,0,ops[node+1].ival,&numarg,P_MIN);
2031 tmp2str = str_make("1");
2032 hstore(symtab,tmpstr->str_ptr,tmp2str);