1 /* $Header: walk.c,v 3.0.1.5 90/08/09 05:55:01 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.5 90/08/09 05:55:01 lwall
10 * patch19: a2p emited local($_) without a semicolon
11 * patch19: a2p didn't make explicit split on whitespace skip leading whitespace
12 * patch19: foreach on a normal array was iterating on values instead of indexes
14 * Revision 3.0.1.4 90/03/01 10:32:45 lwall
15 * patch9: a2p didn't put a $ on ExitValue
17 * Revision 3.0.1.3 89/12/21 20:32:35 lwall
18 * patch7: in a2p, user-defined functions didn't work on some machines
20 * Revision 3.0.1.2 89/11/17 15:53:00 lwall
21 * patch5: on Pyramids, index(s, '}' + 128) doesn't find meta-}
23 * Revision 3.0.1.1 89/11/11 05:09:33 lwall
24 * patch2: in a2p, awk script with no line actions still needs main loop
26 * Revision 3.0 89/10/18 15:35:48 lwall
37 bool realexit = FALSE;
38 bool saw_getline = FALSE;
39 bool subretnum = FALSE;
41 bool saw_argv0 = FALSE;
46 STR *curargs = Nullstr;
49 walk(useval,level,node,numericptr,minprec)
54 int minprec; /* minimum precedence without parens */
68 int prec = P_MAX; /* assume no parens needed */
75 type = ops[node].ival;
82 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
83 if (do_split && need_entire && !absmaxfld)
84 split_to_array = TRUE;
85 if (do_split && split_to_array)
86 set_array_base = TRUE;
88 str_cat(str,"$[ = 1;\t\t\t# set array base to 1\n");
90 if (fswitch && !const_FS)
92 if (saw_FS > 1 || saw_RS)
94 if (saw_ORS && need_entire)
97 str_cat(str,"$FS = '");
98 if (index("*+?.[]()|^$\\",fswitch))
100 sprintf(tokenbuf,"%c",fswitch);
101 str_cat(str,tokenbuf);
102 str_cat(str,"';\t\t# field separator from -F switch\n");
104 else if (saw_FS && !const_FS) {
105 str_cat(str,"$FS = ' ';\t\t# set field separator\n");
108 str_cat(str,"$, = ' ';\t\t# set output field separator\n");
111 str_cat(str,"$\\ = \"\\n\";\t\t# set output record separator\n");
114 str_cat(str,"$ARGV0 = $0;\t\t# remember what we ran as\n");
116 if (str->str_cur > 20)
118 if (ops[node+2].ival) {
119 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
123 fstr = walk(0,level+1,ops[node+3].ival,&numarg,P_MIN);
124 if (*fstr->str_ptr) {
126 str_cat(str,"line: ");
127 str_cat(str,"while (<>) {\n");
129 if (saw_FS && !const_FS)
132 str_cat(str,"chop;\t# strip record separator\n");
137 while (isalpha(*namelist)) {
138 for (d = tokenbuf,s=namelist;
139 isalpha(*s) || isdigit(*s) || *s == '_';
142 while (*s && !isalpha(*s)) s++;
144 nameary[++arymax] = savestr(tokenbuf);
150 emit_split(str,level);
156 str_cat(str,"continue {\n $FNRbase = $. if eof;\n}\n");
159 str_cat(str,"while (<>) { } # (no line actions)\n");
160 if (ops[node+4].ival) {
164 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
169 str_cat(str,"exit $ExitValue;\n");
175 for (len = 0; len < 4; len++) {
176 if (saw_getline & (1 << len)) {
177 sprintf(tokenbuf,"\nsub Getline%d {\n",len);
178 str_cat(str, tokenbuf);
181 str_cat(str," &Pick('',@_);\n");
183 str_cat(str," ($fh) = @_;\n");
187 str_cat(str," $FNRbase = $. if eof;\n");
190 str_cat(str," local($_);\n");
193 " if ($getline_ok = (($_ = <$fh>) ne ''))");
196 " if ($getline_ok = (($_ = <>) ne ''))");
197 str_cat(str, " {\n");
203 str_cat(str,"chop;\t# strip record separator\n");
206 if (do_split && !(len & 1)) {
208 emit_split(str,level);
213 str_cat(str,"}\n $_;\n}\n");
218 if (do_fancy_opens) {
221 local($mode,$name,$pipe) = @_;\n\
222 $fh = $opened{$name};\n\
224 $fh = $opened{$name} = 'fh_' . ($nextfh++ + 0);\n\
225 open($fh,$mode.$name.$pipe);\n\
232 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
233 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
236 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
244 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
246 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
254 tmpstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN);
255 /* translate \nnn to [\nnn] */
256 for (s = tmpstr->str_ptr, d = tokenbuf; *s; s++, d++) {
257 if (*s == '\\' && isdigit(s[1]) && isdigit(s[2]) && isdigit(s[3])){
269 for (d=tokenbuf; *d; d++)
271 str_cat(str,tokenbuf);
278 str = walk(0,level,oper1(OPRINT,0),&numarg,P_MIN);
280 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
285 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
286 if (*tmpstr->str_ptr) {
289 str_scat(str,tmpstr);
290 str_cat(str,") {\n");
292 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
299 str = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
306 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
312 str = walk(1,level,ops[node+1].ival,&numarg,prec);
314 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
316 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
321 str = walk(1,level,ops[node+1].ival,&numarg,prec);
323 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
325 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
332 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
337 str = walk(1,level,ops[node+1].ival,&numarg,prec);
339 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));
348 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
355 str = walk(1,level,ops[node+1].ival,&numarg,prec);
358 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
360 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
365 str = walk(1,level,ops[node+1].ival,&numarg,prec);
368 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
370 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
377 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
383 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
385 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
386 tmp2str = walk(1,level,ops[node+3].ival,&numarg,prec+1);
389 (!numarg && (*tmp2str->str_ptr == '"' || *tmp2str->str_ptr == '\''))) {
392 str_set(tmpstr,"eq");
393 else if (strEQ(t,"!="))
394 str_set(tmpstr,"ne");
395 else if (strEQ(t,"<"))
396 str_set(tmpstr,"lt");
397 else if (strEQ(t,"<="))
398 str_set(tmpstr,"le");
399 else if (strEQ(t,">"))
400 str_set(tmpstr,"gt");
401 else if (strEQ(t,">="))
402 str_set(tmpstr,"ge");
403 if (!index(tmpstr->str_ptr,'\'') && !index(tmpstr->str_ptr,'"') &&
404 !index(tmp2str->str_ptr,'\'') && !index(tmp2str->str_ptr,'"') )
408 if (numeric & 1) /* numeric is very good guess */
416 str_scat(str,tmpstr);
419 str_scat(str,tmp2str);
426 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
433 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
435 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
436 if (strEQ(tmpstr->str_ptr,"~"))
439 str_scat(str,tmpstr);
443 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
451 fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
458 type = ops[ops[node+1].ival].ival & 255;
459 str = walk(1,level,ops[node+1].ival,&numarg,prec+(type != OCONCAT));
461 type = ops[ops[node+2].ival].ival & 255;
463 fstr=walk(1,level,ops[node+2].ival,&numarg,prec+(type != OCONCAT)));
468 str = walk(0,level,ops[node+2].ival,&numarg,prec+1);
470 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
471 str_scat(str,tmpstr);
472 if (str_len(tmpstr) > 1)
476 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec));
482 str = walk(1,level,ops[node+1].ival,&numarg,prec);
484 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
490 str = walk(1,level,ops[node+1].ival,&numarg,prec);
492 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
498 str = walk(1,level,ops[node+1].ival,&numarg,prec);
500 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
506 str = walk(1,level,ops[node+1].ival,&numarg,prec);
508 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
514 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
516 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec));
522 str = walk(1,level,ops[node+1].ival,&numarg,prec);
524 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
530 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
536 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
544 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
552 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
560 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
571 fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
582 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
583 if (!*fstr->str_ptr) {
585 len = 2; /* a legal fiction */
592 tmpstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN);
593 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
594 if (!do_fancy_opens) {
596 if (*t == '"' || *t == '\'')
597 t = cpytill(tokenbuf,t+1,*t);
599 fatal("Internal error: OGETLINE %s", t);
601 s = savestr(tokenbuf);
602 for (t = tokenbuf; *t; t++) {
604 if (!isalpha(*t) && !isdigit(*t))
607 if (!index(tokenbuf,'_'))
609 tmp3str = hfetch(symtab,tokenbuf);
612 str_cat(opens,"open(");
613 str_cat(opens,tokenbuf);
617 str_cat(opens,tmpstr->str_ptr+1);
619 if (*fstr->str_ptr == '|')
622 if (*fstr->str_ptr == '|')
623 str_cat(opens,") || die 'Cannot pipe from \"");
625 str_cat(opens,") || die 'Cannot open file \"");
627 str_cat(opens,"'.\"");
630 str_cat(opens,"\".'");
631 str_cat(opens,"\".';\n");
632 hstore(symtab,tokenbuf,str_make("x"));
637 str_cat(tmpstr,tokenbuf);
640 if (*fstr->str_ptr == '|')
641 str_cat(tmpstr,", '|'");
645 tmpstr = str_make("");
646 sprintf(tokenbuf," = &Getline%d(%s)",len,tmpstr->str_ptr);
647 str_cat(str,tokenbuf);
650 str_cat(str,",$getline_ok)");
651 saw_getline |= 1 << len;
655 str_set(str,"sprintf(");
656 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
662 str_set(str,"substr(");
663 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
666 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
670 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1));
674 str_cat(str,"999999");
679 str_set(str,ops[node+1].cval);
684 tmpstr = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
689 str_scat(str,tmpstr);
690 str_cat(str," = split(");
692 fstr = walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1);
693 if (str_len(fstr) == 3 && *fstr->str_ptr == '\'') {
694 i = fstr->str_ptr[1] & 127;
695 if (index("*+?.[]()|^$\\",i))
696 sprintf(tokenbuf,"/\\%c/",i);
698 sprintf(tokenbuf,"' '");
700 sprintf(tokenbuf,"/%c/",i);
701 str_cat(str,tokenbuf);
708 sprintf(tokenbuf,"/[%c\\n]/",const_FS);
709 str_cat(str,tokenbuf);
716 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
718 str_cat(str,", 9999)");
726 str_set(str,"index(");
727 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
730 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
738 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MATCH+1));
741 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MATCH+1));
743 str_cat(str," && ($RLENGTH = length($&), $RSTART = length($`)+1)");
749 fstr=walk(1,level-1,ops[node+2].ival,&numarg,P_MIN);
750 curargs = str_new(0);
751 str_sset(curargs,fstr);
752 str_cat(curargs,",");
753 tmp2str=walk(1,level,ops[node+5].ival,&numarg,P_MIN);
759 t = tmp2str->str_ptr;
760 while (t = instr(t,"return "))
764 for (t = s+7; *t; t++) {
765 if (*t == ';' || *t == '}')
770 tmp2str->str_cur -= 7;
776 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
780 str_cat(str,"local(");
782 str_cat(str,") = @_;");
785 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
788 str_scat(str,fstr=walk(1,level,ops[node+4].ival,&numarg,P_MIN));
791 str_scat(str,tmp2str);
799 tmp2str = str_new(0);
801 str_set(tmp2str,"1");
802 hstore(symtab,tmpstr->str_ptr,tmp2str);
809 str_cat(str,"return ");
810 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_UNI+1));
816 str_cat(str,"return");
821 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
824 tmpstr = hfetch(symtab,str->str_ptr+3);
825 if (tmpstr && tmpstr->str_ptr)
826 numeric |= atoi(tmpstr->str_ptr);
827 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
841 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MATCH+1);
842 if (strNE(tmpstr->str_ptr,"$_")) {
843 str_cat(tmpstr, " =~ s");
847 str_set(tmpstr, "s");
850 str_set(tmpstr, "s");
851 type = ops[ops[node+2].ival].ival;
854 tmp3str = str_new(0);
856 tmp2str=walk(1,level,ops[ops[node+2].ival+1].ival,&numarg,P_MIN);
857 for (t = tmp2str->str_ptr, d=tokenbuf; *t; d++,t++) {
865 str_set(tmp2str,tokenbuf);
868 tmp2str=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
869 str_set(tmp3str,"($s_ = '\"'.(");
870 str_scat(tmp3str,tmp2str);
871 str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, ");
872 str_set(tmp2str,"eval $s_");
873 s = (*s == 'g' ? "ge" : "e");
876 type = ops[ops[node+1].ival].ival;
879 fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN);
880 if (type == OREGEX) {
883 str_scat(str,tmp3str);
884 str_scat(str,tmpstr);
886 str_scat(str,tmp2str);
890 else if ((type == OFLD && !split_to_array) || (type == OVAR && len == 1)) {
893 str_scat(str,tmp3str);
894 str_scat(str,tmpstr);
898 str_scat(str,tmp2str);
906 str_cat(str,"$s = ");
909 str_scat(str,tmp3str);
910 str_scat(str,tmpstr);
912 str_scat(str,tmp2str);
925 str = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
929 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
931 for (t = tmpstr->str_ptr, d=tokenbuf; *t; d++,t++) {
934 else if (*t == '\\') {
938 case '\\': case '"': case 'n': case 't':
940 default: /* hide this from perl */
949 str_cat(str,tokenbuf);
956 str_set(str,"defined $");
960 str_set(str,"delete $");
970 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
972 tmp2str = hfetch(symtab,tmpstr->str_ptr);
973 if (tmp2str && atoi(tmp2str->str_ptr))
975 if (strEQ(str->str_ptr,"$FNR")) {
978 str_set(str,"($.-$FNRbase)");
980 else if (strEQ(str->str_ptr,"$NR")) {
984 else if (strEQ(str->str_ptr,"$NF")) {
986 str_set(str,"$#Fld");
988 else if (strEQ(str->str_ptr,"$0"))
990 else if (strEQ(str->str_ptr,"$ARGC"))
991 str_set(str,"($#ARGV+1)");
996 sprintf(tokenbuf,"$%s,",tmpstr->str_ptr);
997 ??? if (instr(curargs->str_ptr,tokenbuf))
998 str_cat(str,"\377"); /* can't translate yet */
1001 str_cat(tmpstr,"[]");
1002 tmp2str = hfetch(symtab,tmpstr->str_ptr);
1003 if (tmp2str && atoi(tmp2str->str_ptr))
1007 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
1009 if (strEQ(str->str_ptr,"$ARGV[0")) {
1010 str_set(str,"$ARGV0");
1014 if (tmp2str && atoi(tmp2str->str_ptr))
1015 strcpy(tokenbuf,"]");
1017 strcpy(tokenbuf,"}");
1019 str_cat(str,tokenbuf);
1026 if (split_to_array) {
1027 str_set(str,"$Fld");
1029 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1034 i = atoi(walk(1,level,ops[node+1].ival,&numarg,P_MIN)->str_ptr);
1036 sprintf(tokenbuf,"$%s",nameary[i]);
1038 sprintf(tokenbuf,"$Fld%d",i);
1039 str_set(str,tokenbuf);
1044 str_set(str,"$Fld[");
1045 i = ops[node+1].ival;
1046 if ((ops[i].ival & 255) == OPAREN)
1048 tmpstr=walk(1,level,i,&numarg,P_MIN);
1049 str_scat(str,tmpstr);
1068 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1069 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1071 str_scat(str,tmpstr);
1077 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1078 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1080 str_scat(str,tmpstr);
1086 str = walk(1,level,ops[node+1].ival,&numarg,prec);
1088 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
1090 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
1099 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1100 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1106 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1109 tmpstr = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
1110 if (*tmpstr->str_ptr == ';') {
1112 str_cat(str,tmpstr->str_ptr+1);
1119 str = str_make("close(");
1120 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1121 if (!do_fancy_opens) {
1122 t = tmpstr->str_ptr;
1123 if (*t == '"' || *t == '\'')
1124 t = cpytill(tokenbuf,t+1,*t);
1126 fatal("Internal error: OCLOSE %s",t);
1127 s = savestr(tokenbuf);
1128 for (t = tokenbuf; *t; t++) {
1130 if (!isalpha(*t) && !isdigit(*t))
1133 if (!index(tokenbuf,'_'))
1137 str_set(str,"close ");
1138 str_cat(str,tokenbuf);
1141 sprintf(tokenbuf,"$fh = delete $opened{%s} && close($fh)",
1144 str_set(str,tokenbuf);
1149 lparen = ""; /* set to parens if necessary */
1152 if (len == 3) { /* output redirection */
1153 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MIN);
1154 tmp2str = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1155 if (!do_fancy_opens) {
1156 t = tmpstr->str_ptr;
1157 if (*t == '"' || *t == '\'')
1158 t = cpytill(tokenbuf,t+1,*t);
1160 fatal("Internal error: OPRINT");
1162 s = savestr(tokenbuf);
1163 for (t = tokenbuf; *t; t++) {
1165 if (!isalpha(*t) && !isdigit(*t))
1168 if (!index(tokenbuf,'_'))
1170 tmp3str = hfetch(symtab,tokenbuf);
1172 str_cat(opens,"open(");
1173 str_cat(opens,tokenbuf);
1174 str_cat(opens,", ");
1177 str_scat(opens,tmp2str);
1178 str_cat(opens,tmpstr->str_ptr+1);
1179 if (*tmp2str->str_ptr == '|')
1180 str_cat(opens,") || die 'Cannot pipe to \"");
1182 str_cat(opens,") || die 'Cannot create file \"");
1184 str_cat(opens,"'.\"");
1187 str_cat(opens,"\".'");
1188 str_cat(opens,"\".';\n");
1189 hstore(symtab,tokenbuf,str_make("x"));
1197 sprintf(tokenbuf,"&Pick('%s', %s) &&\n",
1198 tmp2str->str_ptr, tmpstr->str_ptr);
1199 str_cat(str,tokenbuf);
1201 strcpy(tokenbuf,"$fh");
1209 strcpy(tokenbuf,"");
1210 str_cat(str,lparen); /* may be null */
1211 if (type == OPRINTF)
1212 str_cat(str,"printf");
1214 str_cat(str,"print");
1215 if (len == 3 || do_fancy_opens) {
1218 str_cat(str,tokenbuf);
1220 tmpstr = walk(1+(type==OPRINT),level,ops[node+1].ival,&numarg,P_MIN);
1221 if (!*tmpstr->str_ptr && lval_field) {
1222 t = saw_OFS ? "$," : "' '";
1223 if (split_to_array) {
1224 sprintf(tokenbuf,"join(%s,@Fld)",t);
1225 str_cat(tmpstr,tokenbuf);
1228 for (i = 1; i < maxfld; i++) {
1230 sprintf(tokenbuf,"$%s, ",nameary[i]);
1232 sprintf(tokenbuf,"$Fld%d, ",i);
1233 str_cat(tmpstr,tokenbuf);
1235 if (maxfld <= arymax)
1236 sprintf(tokenbuf,"$%s",nameary[maxfld]);
1238 sprintf(tokenbuf,"$Fld%d",maxfld);
1239 str_cat(tmpstr,tokenbuf);
1242 if (*tmpstr->str_ptr) {
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) {
1292 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));
1410 str_set(str,"for (");
1411 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1414 t = s = tmpstr->str_ptr;
1415 while (isalpha(*t) || isdigit(*t) || *t == '$' || *t == '_')
1422 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1423 if (i && (t = index(fstr->str_ptr,0377))) {
1424 if (strnEQ(fstr->str_ptr,s,i))
1431 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
1434 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
1438 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1439 d = index(tmpstr->str_ptr,'$');
1441 fatal("Illegal for loop: %s",tmpstr->str_ptr);
1446 fatal("Illegal for loop: %s",d);
1448 for (t = s; i = *t; t++) {
1450 if (i == '}' || i == ']')
1458 tmp2str = hfetch(symtab,str->str_ptr);
1459 if (tmp2str && atoi(tmp2str->str_ptr)) {
1461 "foreach %s ($[ .. $#%s) ",
1467 "foreach %s (keys %%%s) ",
1471 str_set(str,tokenbuf);
1472 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1479 if (len >= 2 && ops[node+2].ival) {
1480 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1483 fixtab(str,++level);
1484 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1487 fixtab(str,--level);
1491 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1499 fatal("Garbage length in walk");
1500 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1501 for (i = 2; i<= len; i++) {
1502 str_scat(str,fstr=walk(0,level,ops[node+i].ival,&numarg,P_MIN));
1514 if (useval && prec < minprec) { /* need parens? */
1515 fstr = str_new(str->str_cur+2);
1516 str_nset(fstr,"(",1);
1518 str_ncat(fstr,")",1);
1523 *numericptr = numeric;
1526 printf("%3d %5d %15s %d %4d ",level,node,opname[type],len,str->str_cur);
1527 for (t = str->str_ptr; *t && t - str->str_ptr < 40; t++)
1530 else if (*t == '\t')
1558 /* strip trailing white space */
1560 s = str->str_ptr+str->str_cur - 1;
1561 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1564 str->str_cur = s + 1 - str->str_ptr;
1565 if (s >= str->str_ptr && *s != '\n')
1576 s = str->str_ptr+str->str_cur - 1;
1577 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1579 if (s >= str->str_ptr && *s != ';' && *s != '}')
1583 emit_split(str,level)
1590 str_cat(str,"@Fld");
1593 for (i = 1; i < maxfld; i++) {
1595 sprintf(tokenbuf,"$%s,",nameary[i]);
1597 sprintf(tokenbuf,"$Fld%d,",i);
1598 str_cat(str,tokenbuf);
1600 if (maxfld <= arymax)
1601 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1603 sprintf(tokenbuf,"$Fld%d)",maxfld);
1604 str_cat(str,tokenbuf);
1607 sprintf(tokenbuf," = split(/[%c\\n]/, $_, 9999);\n",const_FS);
1608 str_cat(str,tokenbuf);
1611 str_cat(str," = split($FS, $_, 9999);\n");
1613 str_cat(str," = split(' ', $_, 9999);\n");
1617 prewalk(numit,level,node,numericptr)
1629 int numeric = FALSE;
1637 type = ops[node].ival;
1642 prewalk(0,level,ops[node+1].ival,&numarg);
1643 if (ops[node+2].ival) {
1644 prewalk(0,level,ops[node+2].ival,&numarg);
1647 prewalk(0,level,ops[node+3].ival,&numarg);
1649 if (ops[node+3].ival) {
1650 prewalk(0,level,ops[node+4].ival,&numarg);
1654 prewalk(0,level,ops[node+1].ival,&numarg);
1655 prewalk(0,level,ops[node+2].ival,&numarg);
1657 prewalk(0,level,ops[node+3].ival,&numarg);
1661 prewalk(1,level,ops[node+1].ival,&numarg);
1662 prewalk(1,level,ops[node+2].ival,&numarg);
1667 prewalk(0,level,ops[node+1].ival,&numarg);
1671 prewalk(0,level,ops[node+1].ival,&numarg);
1674 i = prewalk(0,level,ops[node+1].ival,&numarg);
1677 prewalk(0,level,ops[node+2].ival,&numarg);
1681 prewalk(0,level,ops[node+2].ival,&numarg);
1686 prewalk(0,level,ops[node+1].ival,&numarg);
1689 prewalk(0,level,ops[node+1].ival,&numarg);
1690 prewalk(0,level,ops[node+2].ival,&numarg);
1693 prewalk(0,level,ops[node+1].ival,&numarg);
1694 prewalk(0,level,ops[node+2].ival,&numarg);
1697 prewalk(0,level,ops[node+1].ival,&numarg);
1700 prewalk(0,level,ops[node+1].ival,&numarg);
1704 prewalk(0,level,ops[node+1].ival,&numarg);
1706 prewalk(0,level,ops[node+2].ival,&numarg);
1709 prewalk(0,level,ops[node+1].ival,&numarg);
1711 prewalk(0,level,ops[node+2].ival,&numarg);
1714 prewalk(0,level,ops[node+1].ival,&numarg);
1718 prewalk(0,level,ops[node+2].ival,&numarg);
1720 prewalk(0,level,ops[node+1].ival,&numarg);
1721 prewalk(0,level,ops[node+3].ival,&numarg);
1726 prewalk(0,level,ops[node+1].ival,&numarg);
1730 prewalk(0,level,ops[node+2].ival,&numarg);
1731 prewalk(0,level,ops[node+1].ival,&numarg);
1732 prewalk(0,level,ops[node+3].ival,&numarg);
1736 prewalk(0,level,ops[node+1].ival,&numarg);
1740 prewalk(0,level,ops[node+1].ival,&numarg);
1741 prewalk(0,level,ops[node+2].ival,&numarg);
1744 prewalk(0,level,ops[node+2].ival,&numarg);
1745 prewalk(0,level,ops[node+1].ival,&numarg);
1746 prewalk(0,level,ops[node+3].ival,&numarg);
1747 if (numarg || strlen(ops[ops[node+1].ival+1].cval) > 1) {
1748 numericize(ops[node+2].ival);
1750 numericize(ops[node+3].ival);
1755 prewalk(1,level,ops[node+1].ival,&numarg);
1756 prewalk(1,level,ops[node+2].ival,&numarg);
1760 prewalk(1,level,ops[node+1].ival,&numarg);
1761 prewalk(1,level,ops[node+2].ival,&numarg);
1765 prewalk(1,level,ops[node+1].ival,&numarg);
1766 prewalk(1,level,ops[node+2].ival,&numarg);
1770 prewalk(1,level,ops[node+1].ival,&numarg);
1771 prewalk(1,level,ops[node+2].ival,&numarg);
1775 prewalk(1,level,ops[node+1].ival,&numarg);
1776 prewalk(1,level,ops[node+2].ival,&numarg);
1780 prewalk(1,level,ops[node+1].ival,&numarg);
1781 prewalk(1,level,ops[node+2].ival,&numarg);
1785 prewalk(1,level,ops[node+1].ival,&numarg);
1789 prewalk(1,level,ops[node+1].ival,&numarg);
1793 prewalk(1,level,ops[node+1].ival,&numarg);
1797 prewalk(1,level,ops[node+1].ival,&numarg);
1801 prewalk(1,level,ops[node+1].ival,&numarg);
1805 prewalk(1,level,ops[node+1].ival,&numarg);
1809 prewalk(0,level,ops[node+1].ival,&numarg);
1815 prewalk(0,level,ops[node+1].ival,&numarg);
1818 prewalk(0,level,ops[node+1].ival,&numarg);
1819 prewalk(1,level,ops[node+2].ival,&numarg);
1821 prewalk(1,level,ops[node+3].ival,&numarg);
1828 prewalk(0,level,ops[node+2].ival,&numarg);
1830 prewalk(0,level,ops[node+3].ival,&numarg);
1831 prewalk(0,level,ops[node+1].ival,&numarg);
1834 prewalk(0,level,ops[node+1].ival,&numarg);
1835 prewalk(0,level,ops[node+2].ival,&numarg);
1839 prewalk(0,level,ops[node+1].ival,&numarg);
1840 prewalk(0,level,ops[node+2].ival,&numarg);
1846 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1848 prewalk(0,level,ops[node+2].ival,&numarg);
1849 prewalk(0,level,ops[node+4].ival,&numarg);
1850 prewalk(0,level,ops[node+5].ival,&numarg);
1852 str_cat(tmpstr,"(");
1853 tmp2str = str_new(0);
1854 if (subretnum || numarg)
1855 str_set(tmp2str,"1");
1856 hstore(symtab,tmpstr->str_ptr,tmp2str);
1862 prewalk(0,level,ops[node+1].ival,&numarg);
1868 tmp2str = str_new(0);
1869 str_scat(tmp2str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1870 fixrargs(tmpstr->str_ptr,ops[node+2].ival,0);
1872 str_cat(tmp2str,"(");
1873 tmpstr = hfetch(symtab,tmp2str->str_ptr);
1874 if (tmpstr && tmpstr->str_ptr)
1875 numeric |= atoi(tmpstr->str_ptr);
1876 prewalk(0,level,ops[node+2].ival,&numarg);
1882 prewalk(0,level,ops[node+3].ival,&numarg);
1883 prewalk(0,level,ops[ops[node+2].ival+1].ival,&numarg);
1884 prewalk(0,level,ops[node+1].ival,&numarg);
1888 prewalk(0,level,ops[node+1].ival,&numarg);
1892 prewalk(0,level,ops[node+1].ival,&numarg);
1898 prewalk(0,level,ops[node+1].ival,&numarg);
1904 prewalk(0,level,ops[node+2].ival,&numarg);
1908 prewalk(0,level,ops[node+1].ival,&numarg);
1911 i = ops[node+1].ival;
1912 prewalk(0,level,i,&numarg);
1925 prewalk(0,level,ops[node+1].ival,&numarg);
1926 prewalk(0,level,ops[node+2].ival,&numarg);
1927 prewalk(0,level,ops[node+3].ival,&numarg);
1932 prewalk(0,level,ops[node+1].ival,&numarg);
1933 prewalk(0,level,ops[node+2].ival,&numarg);
1937 prewalk(0,level,ops[node+1].ival,&numarg);
1939 prewalk(0,level,ops[node+2].ival,&numarg);
1944 prewalk(0,level,ops[node+1].ival,&numarg);
1948 if (len == 3) { /* output redirection */
1949 prewalk(0,level,ops[node+3].ival,&numarg);
1950 prewalk(0,level,ops[node+2].ival,&numarg);
1952 prewalk(0+(type==OPRINT),level,ops[node+1].ival,&numarg);
1978 prewalk(type != OLENGTH && type != OSYSTEM,
1979 level,ops[node+1].ival,&numarg);
1987 prewalk(1,level,ops[node+1].ival,&numarg);
1995 prewalk(0,level,ops[node+1].ival,&numarg);
1996 prewalk(0,level,ops[node+2].ival,&numarg);
1998 prewalk(0,level,ops[node+3].ival,&numarg);
2002 prewalk(0,level,ops[node+1].ival,&numarg);
2003 prewalk(0,level,ops[node+2].ival,&numarg);
2006 prewalk(0,level,ops[node+1].ival,&numarg);
2007 prewalk(0,level,ops[node+2].ival,&numarg);
2008 prewalk(0,level,ops[node+3].ival,&numarg);
2009 prewalk(0,level,ops[node+4].ival,&numarg);
2012 prewalk(0,level,ops[node+2].ival,&numarg);
2013 prewalk(0,level,ops[node+1].ival,&numarg);
2017 prewalk(0,level,ops[node+2].ival,&numarg);
2020 prewalk(0,level,ops[node+1].ival,&numarg);
2027 fatal("Garbage length in prewalk");
2028 prewalk(0,level,ops[node+1].ival,&numarg);
2029 for (i = 2; i<= len; i++) {
2030 prewalk(0,level,ops[node+i].ival,&numarg);
2035 *numericptr = numeric;
2049 type = ops[node].ival;
2052 if (type == OVAR && len == 1) {
2053 tmpstr=walk(0,0,ops[node+1].ival,&numarg,P_MIN);
2054 tmp2str = str_make("1");
2055 hstore(symtab,tmpstr->str_ptr,tmp2str);