📄 walk.c
字号:
case OVFLD: str = str_new(0); str_set(str,"$Fld["); i = ops[node+1].ival; if ((ops[i].ival & 255) == OPAREN) i = ops[i+1].ival; tmpstr=walk(1,level,i,&numarg,P_MIN); str_scat(str,tmpstr); str_free(tmpstr); str_cat(str,"]"); break; case OJUNK: goto def; case OSNEWLINE: str = str_new(2); str_set(str,";\n"); tab(str,level); break; case ONEWLINE: str = str_new(1); str_set(str,"\n"); tab(str,level); break; case OSCOMMENT: str = str_new(0); str_set(str,";"); tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN); for (s = tmpstr->str_ptr; *s && *s != '\n'; s++) *s += 128; str_scat(str,tmpstr); str_free(tmpstr); tab(str,level); break; case OCOMMENT: str = str_new(0); tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN); for (s = tmpstr->str_ptr; *s && *s != '\n'; s++) *s += 128; str_scat(str,tmpstr); str_free(tmpstr); tab(str,level); break; case OCOMMA: prec = P_COMMA; str = walk(1,level,ops[node+1].ival,&numarg,prec); str_cat(str,", "); str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN)); str_free(fstr); str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,prec+1)); str_free(fstr); break; case OSEMICOLON: str = str_new(1); str_set(str,";\n"); tab(str,level); break; case OSTATES: str = walk(0,level,ops[node+1].ival,&numarg,P_MIN); str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN)); str_free(fstr); break; case OSTATE: str = str_new(0); if (len >= 1) { str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN)); str_free(fstr); if (len >= 2) { tmpstr = walk(0,level,ops[node+2].ival,&numarg,P_MIN); if (*tmpstr->str_ptr == ';') { addsemi(str); str_cat(str,tmpstr->str_ptr+1); } str_free(tmpstr); } } break; case OCLOSE: str = str_make("close("); tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN); if (!do_fancy_opens) { t = tmpstr->str_ptr; if (*t == '"' || *t == '\'') t = cpytill(tokenbuf,t+1,*t); else fatal("Internal error: OCLOSE %s",t); s = savestr(tokenbuf); for (t = tokenbuf; *t; t++) { *t &= 127; if (islower(*t)) *t = toupper(*t); if (!isalpha(*t) && !isdigit(*t)) *t = '_'; } if (!index(tokenbuf,'_')) strcpy(t,"_FH"); str_free(tmpstr); safefree(s); str_set(str,"close "); str_cat(str,tokenbuf); } else { sprintf(tokenbuf,"delete $opened{%s} && close(%s)", tmpstr->str_ptr, tmpstr->str_ptr); str_free(tmpstr); str_set(str,tokenbuf); } break; case OPRINTF: case OPRINT: lparen = ""; /* set to parens if necessary */ rparen = ""; str = str_new(0); if (len == 3) { /* output redirection */ tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MIN); tmp2str = walk(1,level,ops[node+2].ival,&numarg,P_MIN); if (!do_fancy_opens) { t = tmpstr->str_ptr; if (*t == '"' || *t == '\'') t = cpytill(tokenbuf,t+1,*t); else fatal("Internal error: OPRINT"); d = savestr(t); s = savestr(tokenbuf); for (t = tokenbuf; *t; t++) { *t &= 127; if (islower(*t)) *t = toupper(*t); if (!isalpha(*t) && !isdigit(*t)) *t = '_'; } if (!index(tokenbuf,'_')) strcpy(t,"_FH"); tmp3str = hfetch(symtab,tokenbuf); if (!tmp3str) { str_cat(opens,"open("); str_cat(opens,tokenbuf); str_cat(opens,", "); d[1] = '\0'; str_cat(opens,d); str_scat(opens,tmp2str); str_cat(opens,tmpstr->str_ptr+1); if (*tmp2str->str_ptr == '|') str_cat(opens,") || die 'Cannot pipe to \""); else str_cat(opens,") || die 'Cannot create file \""); if (*d == '"') str_cat(opens,"'.\""); str_cat(opens,s); if (*d == '"') str_cat(opens,"\".'"); str_cat(opens,"\".';\n"); hstore(symtab,tokenbuf,str_make("x")); } str_free(tmpstr); str_free(tmp2str); safefree(s); safefree(d); } else { sprintf(tokenbuf,"&Pick('%s', %s) &&\n", tmp2str->str_ptr, tmpstr->str_ptr); str_cat(str,tokenbuf); tab(str,level+1); strcpy(tokenbuf,"$fh"); str_free(tmpstr); str_free(tmp2str); lparen = "("; rparen = ")"; } } else strcpy(tokenbuf,""); str_cat(str,lparen); /* may be null */ if (type == OPRINTF) str_cat(str,"printf"); else str_cat(str,"print"); saw_fh = 0; if (len == 3 || do_fancy_opens) { if (*tokenbuf) { str_cat(str," "); saw_fh = 1; } str_cat(str,tokenbuf); } tmpstr = walk(1+(type==OPRINT),level,ops[node+1].ival,&numarg,P_MIN); if (!*tmpstr->str_ptr && lval_field) { t = saw_OFS ? "$," : "' '"; if (split_to_array) { sprintf(tokenbuf,"join(%s,@Fld)",t); str_cat(tmpstr,tokenbuf); } else { for (i = 1; i < maxfld; i++) { if (i <= arymax) sprintf(tokenbuf,"$%s, ",nameary[i]); else sprintf(tokenbuf,"$Fld%d, ",i); str_cat(tmpstr,tokenbuf); } if (maxfld <= arymax) sprintf(tokenbuf,"$%s",nameary[maxfld]); else sprintf(tokenbuf,"$Fld%d",maxfld); str_cat(tmpstr,tokenbuf); } } if (*tmpstr->str_ptr) { str_cat(str," "); if (!saw_fh && *tmpstr->str_ptr == '(') { str_cat(str,"("); str_scat(str,tmpstr); str_cat(str,")"); } else str_scat(str,tmpstr); } else { str_cat(str," $_"); } str_cat(str,rparen); /* may be null */ str_free(tmpstr); break; case ORAND: str = str_make("rand(1)"); break; case OSRAND: str = str_make("srand("); goto maybe0; case OATAN2: str = str_make("atan2("); goto maybe0; case OSIN: str = str_make("sin("); goto maybe0; case OCOS: str = str_make("cos("); goto maybe0; case OSYSTEM: str = str_make("system("); goto maybe0; case OLENGTH: str = str_make("length("); goto maybe0; case OLOG: str = str_make("log("); goto maybe0; case OEXP: str = str_make("exp("); goto maybe0; case OSQRT: str = str_make("sqrt("); goto maybe0; case OINT: str = str_make("int("); maybe0: numeric = 1; if (len > 0) tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN); else tmpstr = str_new(0);; if (!tmpstr->str_ptr || !*tmpstr->str_ptr) { if (lval_field) { t = saw_OFS ? "$," : "' '"; if (split_to_array) { sprintf(tokenbuf,"join(%s,@Fld)",t); str_cat(tmpstr,tokenbuf); } else { sprintf(tokenbuf,"join(%s, ",t); str_cat(tmpstr,tokenbuf); for (i = 1; i < maxfld; i++) { if (i <= arymax) sprintf(tokenbuf,"$%s,",nameary[i]); else sprintf(tokenbuf,"$Fld%d,",i); str_cat(tmpstr,tokenbuf); } if (maxfld <= arymax) sprintf(tokenbuf,"$%s)",nameary[maxfld]); else sprintf(tokenbuf,"$Fld%d)",maxfld); str_cat(tmpstr,tokenbuf); } } else str_cat(tmpstr,"$_"); } if (strEQ(tmpstr->str_ptr,"$_")) { if (type == OLENGTH && !do_chop) { str = str_make("(length("); str_cat(tmpstr,") - 1"); } } str_scat(str,tmpstr); str_free(tmpstr); str_cat(str,")"); break; case OBREAK: str = str_new(0); str_set(str,"last"); break; case ONEXT: str = str_new(0); str_set(str,"next line"); break; case OEXIT: str = str_new(0); if (realexit) { prec = P_UNI; str_set(str,"exit"); if (len == 1) { str_cat(str," "); exitval = TRUE; str_scat(str, fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1)); str_free(fstr); } } else { if (len == 1) { str_set(str,"$ExitValue = "); exitval = TRUE; str_scat(str, fstr=walk(1,level,ops[node+1].ival,&numarg,P_ASSIGN)); str_free(fstr); str_cat(str,"; "); } str_cat(str,"last line"); } break; case OCONTINUE: str = str_new(0); str_set(str,"next"); break; case OREDIR: goto def; case OIF: str = str_new(0); str_set(str,"if ("); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); str_free(fstr); str_cat(str,") "); str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN)); str_free(fstr); if (len == 3) { i = ops[node+3].ival; if (i) { if ((ops[i].ival & 255) == OBLOCK) { i = ops[i+1].ival; if (i) { if ((ops[i].ival & 255) != OIF) i = 0; } } else i = 0; } if (i) { str_cat(str,"els"); str_scat(str,fstr=walk(0,level,i,&numarg,P_MIN)); str_free(fstr); } else { str_cat(str,"else "); str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN)); str_free(fstr); } } break; case OWHILE: str = str_new(0); str_set(str,"while ("); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); str_free(fstr); str_cat(str,") "); str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN)); str_free(fstr); break; case ODO: str = str_new(0); str_set(str,"do "); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); str_free(fstr); if (str->str_ptr[str->str_cur - 1] == '\n') --str->str_cur;; str_cat(str," while ("); str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN)); str_free(fstr); str_cat(str,");"); break; case OFOR: str = str_new(0); str_set(str,"for ("); str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); i = numarg; if (i) { t = s = tmpstr->str_ptr; while (isalpha(*t) || isdigit(*t) || *t == '$' || *t == '_') t++; i = t - s; if (i < 2) i = 0; } str_cat(str,"; "); fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN); if (i && (t = index(fstr->str_ptr,0377))) { if (strnEQ(fstr->str_ptr,s,i)) *t = ' '; } str_scat(str,fstr); str_free(fstr); str_free(tmpstr); str_cat(str,"; "); str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN)); str_free(fstr); str_cat(str,") "); str_scat(str,fstr=walk(0,level,ops[node+4].ival,&numarg,P_MIN)); str_free(fstr); break; case OFORIN: tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN); d = index(tmpstr->str_ptr,'$'); if (!d) fatal("Illegal for loop: %s",tmpstr->str_ptr); s = index(d,'{'); if (!s) s = index(d,'['); if (!s) fatal("Illegal for loop: %s",d); *s++ = '\0'; for (t = s; i = *t; t++) { i &= 127; if (i == '}' || i == ']') break; } if (*t) *t = '\0'; str = str_new(0); str_set(str,d+1); str_cat(str,"[]"); tmp2str = hfetch(symtab,str->str_ptr); if (tmp2str && atoi(tmp2str->str_ptr)) { sprintf(tokenbuf, "foreach %s ($[ .. $#%s) ", s, d+1); } else { sprintf(tokenbuf, "foreach %s (keys %%%s) ", s, d+1); } str_set(str,tokenbuf); str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN)); str_free(fstr); str_free(tmpstr); break; case OBLOCK: str = str_new(0); str_set(str,"{"); if (len >= 2 && ops[node+2].ival) { str_scat(str,fstr=walk(0,level,ops[node+2].ival,&numarg,P_MIN)); str_free(fstr); } fixtab(str,++level); str_scat(str,fstr=walk(0,level,ops[node+1].ival,&numarg,P_MIN)); str_free(fstr); addsemi(str); fixtab(str,--level); str_cat(str,"}\n"); tab(str,level); if (len >= 3) { str_scat(str,fstr=walk(0,level,ops[node+3].ival,&numarg,P_MIN)); str_free(fstr); } break; default: def: if (len) { if (len > 5) fatal("Garbage length in walk"); str = walk(0,level,ops[node+1].ival,&numarg,P_MIN); for (i = 2; i<= len; i++) { str_scat(str,fstr=walk(0,level,ops[node+i].ival,&numarg,P_MIN)); str_free(fstr); } } else { str = Nullstr; } break; } if (!str) str = str_new(0); if (useval && prec < minprec) { /* need parens? */ fstr = str_new(str->str_cur+2); str_nset(fstr,"(",1); str_scat(fstr,str); str_ncat(fstr,")",1); str_free(str); str = fstr; } *numericptr = numeric;#ifdef DEBUGGING if (debug & 4) { printf("%3d %5d %15s %d %4d ",level,node,opname[type],len,str->str_cur); for (t = str->str_ptr; *t && t - str->str_ptr < 40; t++) if (*t == '\n') printf("\\n"); else if (*t == '\t') printf("\\t"); else putchar(*t); putchar('\n'); }#endif return str;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -