1 /* $RCSfile: walk.c,v $$Revision: 4.0.1.3 $$Date: 92/06/08 17:33:46 $
3 * Copyright (c) 1991, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
9 * Revision 4.0.1.3 92/06/08 17:33:46 lwall
10 * patch20: in a2p, simplified the filehandle model
11 * patch20: in a2p, made RS="" translate to $/ = "\n\n"
12 * patch20: in a2p, do {...} while ... was missing some reconstruction code
13 * patch20: in a2p, getline should allow variable to be array element
15 * Revision 4.0.1.2 91/11/05 19:25:09 lwall
16 * patch11: in a2p, split on whitespace produced extra null field
18 * Revision 4.0.1.1 91/06/07 12:22:04 lwall
19 * patch4: new copyright notice
20 * patch4: a2p didn't correctly implement -n switch
22 * Revision 4.0 91/03/20 01:58:36 lwall
33 bool realexit = FALSE;
34 bool saw_getline = FALSE;
35 bool subretnum = FALSE;
37 bool saw_argv0 = FALSE;
44 STR *curargs = Nullstr;
47 walk(useval,level,node,numericptr,minprec)
52 int minprec; /* minimum precedence without parens */
66 int prec = P_MAX; /* assume no parens needed */
73 type = ops[node].ival;
80 while (isalpha(*namelist)) {
81 for (d = tokenbuf,s=namelist;
82 isalpha(*s) || isdigit(*s) || *s == '_';
85 while (*s && !isalpha(*s)) s++;
87 nameary[++arymax] = savestr(tokenbuf);
94 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
95 if (do_split && need_entire && !absmaxfld)
96 split_to_array = TRUE;
97 if (do_split && split_to_array)
98 set_array_base = TRUE;
100 str_cat(str,"$[ = 1;\t\t\t# set array base to 1\n");
102 if (fswitch && !const_FS)
104 if (saw_FS > 1 || saw_RS)
106 if (saw_ORS && need_entire)
109 str_cat(str,"$FS = '");
110 if (index("*+?.[]()|^$\\",fswitch))
112 sprintf(tokenbuf,"%c",fswitch);
113 str_cat(str,tokenbuf);
114 str_cat(str,"';\t\t# field separator from -F switch\n");
116 else if (saw_FS && !const_FS) {
117 str_cat(str,"$FS = ' ';\t\t# set field separator\n");
120 str_cat(str,"$, = ' ';\t\t# set output field separator\n");
123 str_cat(str,"$\\ = \"\\n\";\t\t# set output record separator\n");
126 str_cat(str,"$ARGV0 = $0;\t\t# remember what we ran as\n");
128 if (str->str_cur > 20)
130 if (ops[node+2].ival) {
131 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
135 fstr = walk(0,level+1,ops[node+3].ival,&numarg,P_MIN);
136 if (*fstr->str_ptr) {
138 str_cat(str,"line: ");
139 str_cat(str,"while (<>) {\n");
141 if (saw_FS && !const_FS)
144 str_cat(str,"chop;\t# strip record separator\n");
148 emit_split(str,level);
154 str_cat(str,"continue {\n $FNRbase = $. if eof;\n}\n");
157 str_cat(str,"while (<>) { } # (no line actions)\n");
158 if (ops[node+4].ival) {
162 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
167 str_cat(str,"exit $ExitValue;\n");
173 for (len = 0; len < 4; len++) {
174 if (saw_getline & (1 << len)) {
175 sprintf(tokenbuf,"\nsub Getline%d {\n",len);
176 str_cat(str, tokenbuf);
179 str_cat(str," &Pick('',@_);\n");
181 str_cat(str," ($fh) = @_;\n");
185 str_cat(str," $FNRbase = $. if eof;\n");
188 str_cat(str," local($_);\n");
191 " if ($getline_ok = (($_ = <$fh>) ne ''))");
194 " if ($getline_ok = (($_ = <>) ne ''))");
195 str_cat(str, " {\n");
201 str_cat(str,"chop;\t# strip record separator\n");
204 if (do_split && !(len & 1)) {
206 emit_split(str,level);
211 str_cat(str,"}\n $_;\n}\n");
216 if (do_fancy_opens) {
219 local($mode,$name,$pipe) = @_;\n\
221 open($name,$mode.$name.$pipe) unless $opened{$name}++;\n\
227 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
228 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
231 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
239 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
241 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
249 tmpstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN);
250 /* translate \nnn to [\nnn] */
251 for (s = tmpstr->str_ptr, d = tokenbuf; *s; s++, d++) {
252 if (*s == '\\' && isdigit(s[1]) && isdigit(s[2]) && isdigit(s[3])){
264 for (d=tokenbuf; *d; d++)
266 str_cat(str,tokenbuf);
273 str = walk(0,level,oper1(OPRINT,0),&numarg,P_MIN);
275 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
280 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
281 if (*tmpstr->str_ptr) {
284 str_scat(str,tmpstr);
285 str_cat(str,") {\n");
287 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
294 str = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
301 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
307 str = walk(1,level,ops[node+1].ival,&numarg,prec);
309 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
311 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
316 str = walk(1,level,ops[node+1].ival,&numarg,prec);
318 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
320 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
327 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
332 str = walk(1,level,ops[node+1].ival,&numarg,prec);
334 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
337 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
343 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
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));
360 str = walk(1,level,ops[node+1].ival,&numarg,prec);
363 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
365 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
372 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
378 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
380 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
381 tmp2str = walk(1,level,ops[node+3].ival,&numarg,prec+1);
384 (!numarg && (*tmp2str->str_ptr == '"' || *tmp2str->str_ptr == '\''))) {
387 str_set(tmpstr,"eq");
388 else if (strEQ(t,"!="))
389 str_set(tmpstr,"ne");
390 else if (strEQ(t,"<"))
391 str_set(tmpstr,"lt");
392 else if (strEQ(t,"<="))
393 str_set(tmpstr,"le");
394 else if (strEQ(t,">"))
395 str_set(tmpstr,"gt");
396 else if (strEQ(t,">="))
397 str_set(tmpstr,"ge");
398 if (!index(tmpstr->str_ptr,'\'') && !index(tmpstr->str_ptr,'"') &&
399 !index(tmp2str->str_ptr,'\'') && !index(tmp2str->str_ptr,'"') )
403 if (numeric & 1) /* numeric is very good guess */
411 str_scat(str,tmpstr);
414 str_scat(str,tmp2str);
421 str_scat(str,fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
428 str = walk(1,level,ops[node+2].ival,&numarg,prec+1);
430 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
431 if (strEQ(tmpstr->str_ptr,"~"))
434 str_scat(str,tmpstr);
438 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
446 fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
453 type = ops[ops[node+1].ival].ival & 255;
454 str = walk(1,level,ops[node+1].ival,&numarg,prec+(type != OCONCAT));
456 type = ops[ops[node+2].ival].ival & 255;
458 fstr=walk(1,level,ops[node+2].ival,&numarg,prec+(type != OCONCAT)));
463 str = walk(0,level,ops[node+2].ival,&numarg,prec+1);
465 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
466 str_scat(str,tmpstr);
467 if (str_len(tmpstr) > 1)
471 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec));
474 if (strEQ(str->str_ptr,"$/ = ''"))
475 str_set(str, "$/ = \"\\n\\n\"");
479 str = walk(1,level,ops[node+1].ival,&numarg,prec);
481 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
487 str = walk(1,level,ops[node+1].ival,&numarg,prec);
489 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
495 str = walk(1,level,ops[node+1].ival,&numarg,prec);
497 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
503 str = walk(1,level,ops[node+1].ival,&numarg,prec);
505 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
511 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
513 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec));
519 str = walk(1,level,ops[node+1].ival,&numarg,prec);
521 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,prec+1));
527 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
533 str = walk(1,level,ops[node+1].ival,&numarg,prec+1);
541 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
549 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
557 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec));
568 fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN));
578 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
579 if (!*fstr->str_ptr) {
581 len = 2; /* a legal fiction */
588 tmpstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN);
589 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
590 if (!do_fancy_opens) {
592 if (*t == '"' || *t == '\'')
593 t = cpytill(tokenbuf,t+1,*t);
595 fatal("Internal error: OGETLINE %s", t);
597 s = savestr(tokenbuf);
598 for (t = tokenbuf; *t; t++) {
602 if (!isalpha(*t) && !isdigit(*t))
605 if (!index(tokenbuf,'_'))
607 tmp3str = hfetch(symtab,tokenbuf);
610 str_cat(opens,"open(");
611 str_cat(opens,tokenbuf);
615 str_cat(opens,tmpstr->str_ptr+1);
617 if (*fstr->str_ptr == '|')
620 if (*fstr->str_ptr == '|')
621 str_cat(opens,") || die 'Cannot pipe from \"");
623 str_cat(opens,") || die 'Cannot open file \"");
625 str_cat(opens,"'.\"");
628 str_cat(opens,"\".'");
629 str_cat(opens,"\".';\n");
630 hstore(symtab,tokenbuf,str_make("x"));
635 str_cat(tmpstr,tokenbuf);
638 if (*fstr->str_ptr == '|')
639 str_cat(tmpstr,", '|'");
643 tmpstr = str_make("");
644 sprintf(tokenbuf," = &Getline%d(%s)",len,tmpstr->str_ptr);
645 str_cat(str,tokenbuf);
648 str_cat(str,",$getline_ok)");
649 saw_getline |= 1 << len;
653 str_set(str,"sprintf(");
654 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
660 str_set(str,"substr(");
661 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
664 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
668 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1));
672 str_cat(str,"999999");
677 str_set(str,ops[node+1].cval);
683 tmpstr = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
688 str_scat(str,tmpstr);
689 str_cat(str," = split(");
691 fstr = walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1);
692 if (str_len(fstr) == 3 && *fstr->str_ptr == '\'') {
693 i = fstr->str_ptr[1] & 127;
694 if (index("*+?.[]()|^$\\",i))
695 sprintf(tokenbuf,"/\\%c/",i);
697 sprintf(tokenbuf,"' '");
699 sprintf(tokenbuf,"/%c/",i);
700 str_cat(str,tokenbuf);
707 sprintf(tokenbuf,"/[%c\\n]/",const_FS);
708 str_cat(str,tokenbuf);
717 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
727 str_set(str,"index(");
728 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1));
731 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1));
739 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MATCH+1));
742 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MATCH+1));
744 str_cat(str," && ($RLENGTH = length($&), $RSTART = length($`)+1)");
750 fstr=walk(1,level-1,ops[node+2].ival,&numarg,P_MIN);
751 curargs = str_new(0);
752 str_sset(curargs,fstr);
753 str_cat(curargs,",");
754 tmp2str=walk(1,level,ops[node+5].ival,&numarg,P_MIN);
760 t = tmp2str->str_ptr;
761 while (t = instr(t,"return "))
765 for (t = s+7; *t; t++) {
766 if (*t == ';' || *t == '}')
771 tmp2str->str_cur -= 7;
777 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
781 str_cat(str,"local(");
783 str_cat(str,") = @_;");
786 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
789 str_scat(str,fstr=walk(1,level,ops[node+4].ival,&numarg,P_MIN));
792 str_scat(str,tmp2str);
800 tmp2str = str_new(0);
802 str_set(tmp2str,"1");
803 hstore(symtab,tmpstr->str_ptr,tmp2str);
810 str_cat(str,"return ");
811 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_UNI+1));
817 str_cat(str,"return");
822 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
825 tmpstr = hfetch(symtab,str->str_ptr+3);
826 if (tmpstr && tmpstr->str_ptr)
827 numeric |= atoi(tmpstr->str_ptr);
828 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
842 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MATCH+1);
843 if (strNE(tmpstr->str_ptr,"$_")) {
844 str_cat(tmpstr, " =~ s");
848 str_set(tmpstr, "s");
851 str_set(tmpstr, "s");
852 type = ops[ops[node+2].ival].ival;
855 tmp3str = str_new(0);
857 tmp2str=walk(1,level,ops[ops[node+2].ival+1].ival,&numarg,P_MIN);
858 for (t = tmp2str->str_ptr, d=tokenbuf; *t; d++,t++) {
866 str_set(tmp2str,tokenbuf);
869 tmp2str=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
870 str_set(tmp3str,"($s_ = '\"'.(");
871 str_scat(tmp3str,tmp2str);
872 str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, ");
873 str_set(tmp2str,"eval $s_");
874 s = (*s == 'g' ? "ge" : "e");
877 type = ops[ops[node+1].ival].ival;
880 fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN);
881 if (type == OREGEX) {
884 str_scat(str,tmp3str);
885 str_scat(str,tmpstr);
887 str_scat(str,tmp2str);
891 else if ((type == OFLD && !split_to_array) || (type == OVAR && len == 1)) {
894 str_scat(str,tmp3str);
895 str_scat(str,tmpstr);
899 str_scat(str,tmp2str);
907 str_cat(str,"$s = ");
910 str_scat(str,tmp3str);
911 str_scat(str,tmpstr);
913 str_scat(str,tmp2str);
926 str = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
930 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
932 for (t = tmpstr->str_ptr, d=tokenbuf; *t; d++,t++) {
935 else if (*t == '\\') {
939 case '\\': case '"': case 'n': case 't': case '$':
941 default: /* hide this from perl */
950 str_cat(str,tokenbuf);
957 str_set(str,"defined $");
961 str_set(str,"delete $");
971 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
973 tmp2str = hfetch(symtab,tmpstr->str_ptr);
974 if (tmp2str && atoi(tmp2str->str_ptr))
976 if (strEQ(str->str_ptr,"$FNR")) {
979 str_set(str,"($.-$FNRbase)");
981 else if (strEQ(str->str_ptr,"$NR")) {
985 else if (strEQ(str->str_ptr,"$NF")) {
987 str_set(str,"$#Fld");
989 else if (strEQ(str->str_ptr,"$0"))
991 else if (strEQ(str->str_ptr,"$ARGC"))
992 str_set(str,"($#ARGV+1)");
997 sprintf(tokenbuf,"$%s,",tmpstr->str_ptr);
998 ??? if (instr(curargs->str_ptr,tokenbuf))
999 str_cat(str,"\377"); /* can't translate yet */
1002 str_cat(tmpstr,"[]");
1003 tmp2str = hfetch(symtab,tmpstr->str_ptr);
1004 if (tmp2str && atoi(tmp2str->str_ptr))
1008 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
1010 if (strEQ(str->str_ptr,"$ARGV[0")) {
1011 str_set(str,"$ARGV0");
1015 if (tmp2str && atoi(tmp2str->str_ptr))
1016 strcpy(tokenbuf,"]");
1018 strcpy(tokenbuf,"}");
1020 str_cat(str,tokenbuf);
1027 if (split_to_array) {
1028 str_set(str,"$Fld");
1030 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1035 i = atoi(walk(1,level,ops[node+1].ival,&numarg,P_MIN)->str_ptr);
1037 sprintf(tokenbuf,"$%s",nameary[i]);
1039 sprintf(tokenbuf,"$Fld%d",i);
1040 str_set(str,tokenbuf);
1045 str_set(str,"$Fld[");
1046 i = ops[node+1].ival;
1047 if ((ops[i].ival & 255) == OPAREN)
1049 tmpstr=walk(1,level,i,&numarg,P_MIN);
1050 str_scat(str,tmpstr);
1069 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1070 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1072 str_scat(str,tmpstr);
1078 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1079 for (s = tmpstr->str_ptr; *s && *s != '\n'; s++)
1081 str_scat(str,tmpstr);
1087 str = walk(1,level,ops[node+1].ival,&numarg,prec);
1089 str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN));
1091 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1));
1100 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1101 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1107 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1110 tmpstr = walk(0,level,ops[node+2].ival,&numarg,P_MIN);
1111 if (*tmpstr->str_ptr == ';') {
1113 str_cat(str,tmpstr->str_ptr+1);
1120 str = str_make("close(");
1121 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1122 if (!do_fancy_opens) {
1123 t = tmpstr->str_ptr;
1124 if (*t == '"' || *t == '\'')
1125 t = cpytill(tokenbuf,t+1,*t);
1127 fatal("Internal error: OCLOSE %s",t);
1128 s = savestr(tokenbuf);
1129 for (t = tokenbuf; *t; t++) {
1133 if (!isalpha(*t) && !isdigit(*t))
1136 if (!index(tokenbuf,'_'))
1140 str_set(str,"close ");
1141 str_cat(str,tokenbuf);
1144 sprintf(tokenbuf,"delete $opened{%s} && close(%s)",
1145 tmpstr->str_ptr, tmpstr->str_ptr);
1147 str_set(str,tokenbuf);
1152 lparen = ""; /* set to parens if necessary */
1155 if (len == 3) { /* output redirection */
1156 tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MIN);
1157 tmp2str = walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1158 if (!do_fancy_opens) {
1159 t = tmpstr->str_ptr;
1160 if (*t == '"' || *t == '\'')
1161 t = cpytill(tokenbuf,t+1,*t);
1163 fatal("Internal error: OPRINT");
1165 s = savestr(tokenbuf);
1166 for (t = tokenbuf; *t; t++) {
1170 if (!isalpha(*t) && !isdigit(*t))
1173 if (!index(tokenbuf,'_'))
1175 tmp3str = hfetch(symtab,tokenbuf);
1177 str_cat(opens,"open(");
1178 str_cat(opens,tokenbuf);
1179 str_cat(opens,", ");
1182 str_scat(opens,tmp2str);
1183 str_cat(opens,tmpstr->str_ptr+1);
1184 if (*tmp2str->str_ptr == '|')
1185 str_cat(opens,") || die 'Cannot pipe to \"");
1187 str_cat(opens,") || die 'Cannot create file \"");
1189 str_cat(opens,"'.\"");
1192 str_cat(opens,"\".'");
1193 str_cat(opens,"\".';\n");
1194 hstore(symtab,tokenbuf,str_make("x"));
1202 sprintf(tokenbuf,"&Pick('%s', %s) &&\n",
1203 tmp2str->str_ptr, tmpstr->str_ptr);
1204 str_cat(str,tokenbuf);
1206 strcpy(tokenbuf,"$fh");
1214 strcpy(tokenbuf,"");
1215 str_cat(str,lparen); /* may be null */
1216 if (type == OPRINTF)
1217 str_cat(str,"printf");
1219 str_cat(str,"print");
1221 if (len == 3 || do_fancy_opens) {
1226 str_cat(str,tokenbuf);
1228 tmpstr = walk(1+(type==OPRINT),level,ops[node+1].ival,&numarg,P_MIN);
1229 if (!*tmpstr->str_ptr && lval_field) {
1230 t = saw_OFS ? "$," : "' '";
1231 if (split_to_array) {
1232 sprintf(tokenbuf,"join(%s,@Fld)",t);
1233 str_cat(tmpstr,tokenbuf);
1236 for (i = 1; i < maxfld; i++) {
1238 sprintf(tokenbuf,"$%s, ",nameary[i]);
1240 sprintf(tokenbuf,"$Fld%d, ",i);
1241 str_cat(tmpstr,tokenbuf);
1243 if (maxfld <= arymax)
1244 sprintf(tokenbuf,"$%s",nameary[maxfld]);
1246 sprintf(tokenbuf,"$Fld%d",maxfld);
1247 str_cat(tmpstr,tokenbuf);
1250 if (*tmpstr->str_ptr) {
1252 if (!saw_fh && *tmpstr->str_ptr == '(') {
1254 str_scat(str,tmpstr);
1258 str_scat(str,tmpstr);
1263 str_cat(str,rparen); /* may be null */
1267 str = str_make("rand(1)");
1270 str = str_make("srand(");
1273 str = str_make("atan2(");
1276 str = str_make("sin(");
1279 str = str_make("cos(");
1282 str = str_make("system(");
1285 str = str_make("length(");
1288 str = str_make("log(");
1291 str = str_make("exp(");
1294 str = str_make("sqrt(");
1297 str = str_make("int(");
1301 tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN);
1303 tmpstr = str_new(0);;
1304 if (!tmpstr->str_ptr || !*tmpstr->str_ptr) {
1306 t = saw_OFS ? "$," : "' '";
1307 if (split_to_array) {
1308 sprintf(tokenbuf,"join(%s,@Fld)",t);
1309 str_cat(tmpstr,tokenbuf);
1312 sprintf(tokenbuf,"join(%s, ",t);
1313 str_cat(tmpstr,tokenbuf);
1314 for (i = 1; i < maxfld; i++) {
1316 sprintf(tokenbuf,"$%s,",nameary[i]);
1318 sprintf(tokenbuf,"$Fld%d,",i);
1319 str_cat(tmpstr,tokenbuf);
1321 if (maxfld <= arymax)
1322 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1324 sprintf(tokenbuf,"$Fld%d)",maxfld);
1325 str_cat(tmpstr,tokenbuf);
1329 str_cat(tmpstr,"$_");
1331 if (strEQ(tmpstr->str_ptr,"$_")) {
1332 if (type == OLENGTH && !do_chop) {
1333 str = str_make("(length(");
1334 str_cat(tmpstr,") - 1");
1337 str_scat(str,tmpstr);
1343 str_set(str,"last");
1347 str_set(str,"next line");
1353 str_set(str,"exit");
1358 fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1));
1364 str_set(str,"$ExitValue = ");
1367 fstr=walk(1,level,ops[node+1].ival,&numarg,P_ASSIGN));
1371 str_cat(str,"last line");
1376 str_set(str,"next");
1382 str_set(str,"if (");
1383 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1386 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1389 i = ops[node+3].ival;
1391 if ((ops[i].ival & 255) == OBLOCK) {
1394 if ((ops[i].ival & 255) != OIF)
1403 str_scat(str,fstr=walk(0,level,i,&numarg,P_MIN));
1407 str_cat(str,"else ");
1408 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1415 str_set(str,"while (");
1416 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1419 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1425 str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1427 if (str->str_ptr[str->str_cur - 1] == '\n')
1429 str_cat(str," while (");
1430 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1436 str_set(str,"for (");
1437 str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1440 t = s = tmpstr->str_ptr;
1441 while (isalpha(*t) || isdigit(*t) || *t == '$' || *t == '_')
1448 fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN);
1449 if (i && (t = index(fstr->str_ptr,0377))) {
1450 if (strnEQ(fstr->str_ptr,s,i))
1457 str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN));
1460 str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN));
1464 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1465 d = index(tmpstr->str_ptr,'$');
1467 fatal("Illegal for loop: %s",tmpstr->str_ptr);
1472 fatal("Illegal for loop: %s",d);
1474 for (t = s; i = *t; t++) {
1476 if (i == '}' || i == ']')
1484 tmp2str = hfetch(symtab,str->str_ptr);
1485 if (tmp2str && atoi(tmp2str->str_ptr)) {
1487 "foreach %s ($[ .. $#%s) ",
1493 "foreach %s (keys %%%s) ",
1497 str_set(str,tokenbuf);
1498 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1505 if (len >= 2 && ops[node+2].ival) {
1506 str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN));
1509 fixtab(str,++level);
1510 str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN));
1513 fixtab(str,--level);
1517 str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN));
1525 fatal("Garbage length in walk");
1526 str = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1527 for (i = 2; i<= len; i++) {
1528 str_scat(str,fstr=walk(0,level,ops[node+i].ival,&numarg,P_MIN));
1540 if (useval && prec < minprec) { /* need parens? */
1541 fstr = str_new(str->str_cur+2);
1542 str_nset(fstr,"(",1);
1544 str_ncat(fstr,")",1);
1549 *numericptr = numeric;
1552 printf("%3d %5d %15s %d %4d ",level,node,opname[type],len,str->str_cur);
1553 for (t = str->str_ptr; *t && t - str->str_ptr < 40; t++)
1556 else if (*t == '\t')
1584 /* strip trailing white space */
1586 s = str->str_ptr+str->str_cur - 1;
1587 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1590 str->str_cur = s + 1 - str->str_ptr;
1591 if (s >= str->str_ptr && *s != '\n')
1602 s = str->str_ptr+str->str_cur - 1;
1603 while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n'))
1605 if (s >= str->str_ptr && *s != ';' && *s != '}')
1609 emit_split(str,level)
1616 str_cat(str,"@Fld");
1619 for (i = 1; i < maxfld; i++) {
1621 sprintf(tokenbuf,"$%s,",nameary[i]);
1623 sprintf(tokenbuf,"$Fld%d,",i);
1624 str_cat(str,tokenbuf);
1626 if (maxfld <= arymax)
1627 sprintf(tokenbuf,"$%s)",nameary[maxfld]);
1629 sprintf(tokenbuf,"$Fld%d)",maxfld);
1630 str_cat(str,tokenbuf);
1633 sprintf(tokenbuf," = split(/[%c\\n]/, $_, 9999);\n",const_FS);
1634 str_cat(str,tokenbuf);
1637 str_cat(str," = split($FS, $_, 9999);\n");
1639 str_cat(str," = split(' ', $_, 9999);\n");
1643 prewalk(numit,level,node,numericptr)
1655 int numeric = FALSE;
1663 type = ops[node].ival;
1668 prewalk(0,level,ops[node+1].ival,&numarg);
1669 if (ops[node+2].ival) {
1670 prewalk(0,level,ops[node+2].ival,&numarg);
1673 prewalk(0,level,ops[node+3].ival,&numarg);
1675 if (ops[node+3].ival) {
1676 prewalk(0,level,ops[node+4].ival,&numarg);
1680 prewalk(0,level,ops[node+1].ival,&numarg);
1681 prewalk(0,level,ops[node+2].ival,&numarg);
1683 prewalk(0,level,ops[node+3].ival,&numarg);
1687 prewalk(1,level,ops[node+1].ival,&numarg);
1688 prewalk(1,level,ops[node+2].ival,&numarg);
1693 prewalk(0,level,ops[node+1].ival,&numarg);
1697 prewalk(0,level,ops[node+1].ival,&numarg);
1700 i = prewalk(0,level,ops[node+1].ival,&numarg);
1703 prewalk(0,level,ops[node+2].ival,&numarg);
1707 prewalk(0,level,ops[node+2].ival,&numarg);
1712 prewalk(0,level,ops[node+1].ival,&numarg);
1715 prewalk(0,level,ops[node+1].ival,&numarg);
1716 prewalk(0,level,ops[node+2].ival,&numarg);
1719 prewalk(0,level,ops[node+1].ival,&numarg);
1720 prewalk(0,level,ops[node+2].ival,&numarg);
1723 prewalk(0,level,ops[node+1].ival,&numarg);
1726 prewalk(0,level,ops[node+1].ival,&numarg);
1730 prewalk(0,level,ops[node+1].ival,&numarg);
1732 prewalk(0,level,ops[node+2].ival,&numarg);
1735 prewalk(0,level,ops[node+1].ival,&numarg);
1737 prewalk(0,level,ops[node+2].ival,&numarg);
1740 prewalk(0,level,ops[node+1].ival,&numarg);
1744 prewalk(0,level,ops[node+2].ival,&numarg);
1746 prewalk(0,level,ops[node+1].ival,&numarg);
1747 prewalk(0,level,ops[node+3].ival,&numarg);
1752 prewalk(0,level,ops[node+1].ival,&numarg);
1756 prewalk(0,level,ops[node+2].ival,&numarg);
1757 prewalk(0,level,ops[node+1].ival,&numarg);
1758 prewalk(0,level,ops[node+3].ival,&numarg);
1762 prewalk(0,level,ops[node+1].ival,&numarg);
1766 prewalk(0,level,ops[node+1].ival,&numarg);
1767 prewalk(0,level,ops[node+2].ival,&numarg);
1770 prewalk(0,level,ops[node+2].ival,&numarg);
1771 prewalk(0,level,ops[node+1].ival,&numarg);
1772 prewalk(0,level,ops[node+3].ival,&numarg);
1773 if (numarg || strlen(ops[ops[node+1].ival+1].cval) > 1) {
1774 numericize(ops[node+2].ival);
1776 numericize(ops[node+3].ival);
1781 prewalk(1,level,ops[node+1].ival,&numarg);
1782 prewalk(1,level,ops[node+2].ival,&numarg);
1786 prewalk(1,level,ops[node+1].ival,&numarg);
1787 prewalk(1,level,ops[node+2].ival,&numarg);
1791 prewalk(1,level,ops[node+1].ival,&numarg);
1792 prewalk(1,level,ops[node+2].ival,&numarg);
1796 prewalk(1,level,ops[node+1].ival,&numarg);
1797 prewalk(1,level,ops[node+2].ival,&numarg);
1801 prewalk(1,level,ops[node+1].ival,&numarg);
1802 prewalk(1,level,ops[node+2].ival,&numarg);
1806 prewalk(1,level,ops[node+1].ival,&numarg);
1807 prewalk(1,level,ops[node+2].ival,&numarg);
1811 prewalk(1,level,ops[node+1].ival,&numarg);
1815 prewalk(1,level,ops[node+1].ival,&numarg);
1819 prewalk(1,level,ops[node+1].ival,&numarg);
1823 prewalk(1,level,ops[node+1].ival,&numarg);
1827 prewalk(1,level,ops[node+1].ival,&numarg);
1831 prewalk(1,level,ops[node+1].ival,&numarg);
1835 prewalk(0,level,ops[node+1].ival,&numarg);
1841 prewalk(0,level,ops[node+1].ival,&numarg);
1844 prewalk(0,level,ops[node+1].ival,&numarg);
1845 prewalk(1,level,ops[node+2].ival,&numarg);
1847 prewalk(1,level,ops[node+3].ival,&numarg);
1854 prewalk(0,level,ops[node+2].ival,&numarg);
1856 prewalk(0,level,ops[node+3].ival,&numarg);
1857 prewalk(0,level,ops[node+1].ival,&numarg);
1860 prewalk(0,level,ops[node+1].ival,&numarg);
1861 prewalk(0,level,ops[node+2].ival,&numarg);
1865 prewalk(0,level,ops[node+1].ival,&numarg);
1866 prewalk(0,level,ops[node+2].ival,&numarg);
1872 tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN);
1874 prewalk(0,level,ops[node+2].ival,&numarg);
1875 prewalk(0,level,ops[node+4].ival,&numarg);
1876 prewalk(0,level,ops[node+5].ival,&numarg);
1878 str_cat(tmpstr,"(");
1879 tmp2str = str_new(0);
1880 if (subretnum || numarg)
1881 str_set(tmp2str,"1");
1882 hstore(symtab,tmpstr->str_ptr,tmp2str);
1888 prewalk(0,level,ops[node+1].ival,&numarg);
1894 tmp2str = str_new(0);
1895 str_scat(tmp2str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN));
1896 fixrargs(tmpstr->str_ptr,ops[node+2].ival,0);
1898 str_cat(tmp2str,"(");
1899 tmpstr = hfetch(symtab,tmp2str->str_ptr);
1900 if (tmpstr && tmpstr->str_ptr)
1901 numeric |= atoi(tmpstr->str_ptr);
1902 prewalk(0,level,ops[node+2].ival,&numarg);
1908 prewalk(0,level,ops[node+3].ival,&numarg);
1909 prewalk(0,level,ops[ops[node+2].ival+1].ival,&numarg);
1910 prewalk(0,level,ops[node+1].ival,&numarg);
1914 prewalk(0,level,ops[node+1].ival,&numarg);
1918 prewalk(0,level,ops[node+1].ival,&numarg);
1924 prewalk(0,level,ops[node+1].ival,&numarg);
1930 prewalk(0,level,ops[node+2].ival,&numarg);
1934 prewalk(0,level,ops[node+1].ival,&numarg);
1937 i = ops[node+1].ival;
1938 prewalk(0,level,i,&numarg);
1951 prewalk(0,level,ops[node+1].ival,&numarg);
1952 prewalk(0,level,ops[node+2].ival,&numarg);
1953 prewalk(0,level,ops[node+3].ival,&numarg);
1958 prewalk(0,level,ops[node+1].ival,&numarg);
1959 prewalk(0,level,ops[node+2].ival,&numarg);
1963 prewalk(0,level,ops[node+1].ival,&numarg);
1965 prewalk(0,level,ops[node+2].ival,&numarg);
1970 prewalk(0,level,ops[node+1].ival,&numarg);
1974 if (len == 3) { /* output redirection */
1975 prewalk(0,level,ops[node+3].ival,&numarg);
1976 prewalk(0,level,ops[node+2].ival,&numarg);
1978 prewalk(0+(type==OPRINT),level,ops[node+1].ival,&numarg);
2004 prewalk(type != OLENGTH && type != OSYSTEM,
2005 level,ops[node+1].ival,&numarg);
2013 prewalk(1,level,ops[node+1].ival,&numarg);
2021 prewalk(0,level,ops[node+1].ival,&numarg);
2022 prewalk(0,level,ops[node+2].ival,&numarg);
2024 prewalk(0,level,ops[node+3].ival,&numarg);
2028 prewalk(0,level,ops[node+1].ival,&numarg);
2029 prewalk(0,level,ops[node+2].ival,&numarg);
2032 prewalk(0,level,ops[node+1].ival,&numarg);
2033 prewalk(0,level,ops[node+2].ival,&numarg);
2034 prewalk(0,level,ops[node+3].ival,&numarg);
2035 prewalk(0,level,ops[node+4].ival,&numarg);
2038 prewalk(0,level,ops[node+2].ival,&numarg);
2039 prewalk(0,level,ops[node+1].ival,&numarg);
2043 prewalk(0,level,ops[node+2].ival,&numarg);
2046 prewalk(0,level,ops[node+1].ival,&numarg);
2053 fatal("Garbage length in prewalk");
2054 prewalk(0,level,ops[node+1].ival,&numarg);
2055 for (i = 2; i<= len; i++) {
2056 prewalk(0,level,ops[node+i].ival,&numarg);
2061 *numericptr = numeric;
2075 type = ops[node].ival;
2078 if (type == OVAR && len == 1) {
2079 tmpstr=walk(0,0,ops[node+1].ival,&numarg,P_MIN);
2080 tmp2str = str_make("1");
2081 hstore(symtab,tmpstr->str_ptr,tmp2str);