📄 walk.c
字号:
str_free(fstr); numeric = 1; break; case OPOSTINCR: prec = P_AUTO; str = walk(1,level,ops[node+1].ival,&numarg,prec+1); str_cat(str,"++"); numeric = 1; break; case OPOSTDECR: prec = P_AUTO; str = walk(1,level,ops[node+1].ival,&numarg,prec+1); str_cat(str,"--"); numeric = 1; break; case OPREINCR: prec = P_AUTO; str = str_new(0); str_set(str,"++"); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1)); str_free(fstr); numeric = 1; break; case OPREDECR: prec = P_AUTO; str = str_new(0); str_set(str,"--"); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec+1)); str_free(fstr); numeric = 1; break; case OUMINUS: prec = P_UNARY; str = str_new(0); str_set(str,"-"); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,prec)); str_free(fstr); numeric = 1; break; case OUPLUS: numeric = 1; goto def; case OPAREN: str = str_new(0); str_set(str,"("); str_scat(str, fstr=walk(useval != 0,level,ops[node+1].ival,&numarg,P_MIN)); str_free(fstr); str_cat(str,")"); numeric |= numarg; break; case OGETLINE: str = str_new(0); if (useval) str_cat(str,"("); if (len > 0) { str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); if (!*fstr->str_ptr) { str_cat(str,"$_"); len = 2; /* a legal fiction */ } str_free(fstr); } else str_cat(str,"$_"); if (len > 1) { tmpstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN); fstr=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: OGETLINE %s", t); 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) { do_opens = TRUE; str_cat(opens,"open("); str_cat(opens,tokenbuf); str_cat(opens,", "); d[1] = '\0'; str_cat(opens,d); str_cat(opens,tmpstr->str_ptr+1); opens->str_cur--; if (*fstr->str_ptr == '|') str_cat(opens,"|"); str_cat(opens,d); if (*fstr->str_ptr == '|') str_cat(opens,") || die 'Cannot pipe from \""); else str_cat(opens,") || die 'Cannot open 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")); } safefree(s); safefree(d); str_set(tmpstr,"'"); str_cat(tmpstr,tokenbuf); str_cat(tmpstr,"'"); } if (*fstr->str_ptr == '|') str_cat(tmpstr,", '|'"); str_free(fstr); } else tmpstr = str_make(""); sprintf(tokenbuf," = &Getline%d(%s)",len,tmpstr->str_ptr); str_cat(str,tokenbuf); str_free(tmpstr); if (useval) str_cat(str,",$getline_ok)"); saw_getline |= 1 << len; break; case OSPRINTF: str = str_new(0); str_set(str,"sprintf("); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); str_free(fstr); str_cat(str,")"); break; case OSUBSTR: str = str_new(0); str_set(str,"substr("); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1)); str_free(fstr); str_cat(str,", "); str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1)); str_free(fstr); str_cat(str,", "); if (len == 3) { str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1)); str_free(fstr); } else str_cat(str,"999999"); str_cat(str,")"); break; case OSTRING: str = str_new(0); str_set(str,ops[node+1].cval); break; case OSPLIT: str = str_new(0); limit = ", 9999)"; numeric = 1; tmpstr = walk(1,level,ops[node+2].ival,&numarg,P_MIN); if (useval) str_set(str,"(@"); else str_set(str,"@"); str_scat(str,tmpstr); str_cat(str," = split("); if (len == 3) { fstr = walk(1,level,ops[node+3].ival,&numarg,P_COMMA+1); if (str_len(fstr) == 3 && *fstr->str_ptr == '\'') { i = fstr->str_ptr[1] & 127; if (index("*+?.[]()|^$\\",i)) sprintf(tokenbuf,"/\\%c/",i); else if (i == ' ') sprintf(tokenbuf,"' '"); else sprintf(tokenbuf,"/%c/",i); str_cat(str,tokenbuf); } else str_scat(str,fstr); str_free(fstr); } else if (const_FS) { sprintf(tokenbuf,"/[%c\\n]/",const_FS); str_cat(str,tokenbuf); } else if (saw_FS) str_cat(str,"$FS"); else { str_cat(str,"' '"); limit = ")"; } str_cat(str,", "); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1)); str_free(fstr); str_cat(str,limit); if (useval) { str_cat(str,")"); } str_free(tmpstr); break; case OINDEX: str = str_new(0); str_set(str,"index("); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_COMMA+1)); str_free(fstr); str_cat(str,", "); str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_COMMA+1)); str_free(fstr); str_cat(str,")"); numeric = 1; break; case OMATCH: str = str_new(0); prec = P_ANDAND; str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MATCH+1)); str_free(fstr); str_cat(str," =~ "); str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MATCH+1)); str_free(fstr); str_cat(str," && ($RLENGTH = length($&), $RSTART = length($`)+1)"); numeric = 1; break; case OUSERDEF: str = str_new(0); subretnum = FALSE; fstr=walk(1,level-1,ops[node+2].ival,&numarg,P_MIN); curargs = str_new(0); str_sset(curargs,fstr); str_cat(curargs,","); tmp2str=walk(1,level,ops[node+5].ival,&numarg,P_MIN); str_free(curargs); curargs = Nullstr; level--; subretnum |= numarg; s = Nullch; t = tmp2str->str_ptr; while (t = instr(t,"return ")) s = t++; if (s) { i = 0; for (t = s+7; *t; t++) { if (*t == ';' || *t == '}') i++; } if (i == 1) { strcpy(s,s+7); tmp2str->str_cur -= 7; } } str_set(str,"\n"); tab(str,level); str_cat(str,"sub "); str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); str_cat(str," {\n"); tab(str,++level); if (fstr->str_cur) { str_cat(str,"local("); str_scat(str,fstr); str_cat(str,") = @_;"); } str_free(fstr); str_scat(str,fstr=walk(1,level,ops[node+3].ival,&numarg,P_MIN)); str_free(fstr); fixtab(str,level); str_scat(str,fstr=walk(1,level,ops[node+4].ival,&numarg,P_MIN)); str_free(fstr); fixtab(str,level); str_scat(str,tmp2str); str_free(tmp2str); fixtab(str,--level); str_cat(str,"}\n"); tab(str,level); str_scat(subs,str); str_set(str,""); str_cat(tmpstr,"("); tmp2str = str_new(0); if (subretnum) str_set(tmp2str,"1"); hstore(symtab,tmpstr->str_ptr,tmp2str); str_free(tmpstr); level++; break; case ORETURN: str = str_new(0); if (len > 0) { str_cat(str,"return "); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_UNI+1)); str_free(fstr); if (numarg) subretnum = TRUE; } else str_cat(str,"return"); break; case OUSERFUN: str = str_new(0); str_set(str,"&"); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); str_free(fstr); str_cat(str,"("); tmpstr = hfetch(symtab,str->str_ptr+3); if (tmpstr && tmpstr->str_ptr) numeric |= atoi(tmpstr->str_ptr); str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN)); str_free(fstr); str_cat(str,")"); break; case OGSUB: case OSUB: if (type == OGSUB) s = "g"; else s = ""; str = str_new(0); tmpstr = str_new(0); i = 0; if (len == 3) { tmpstr = walk(1,level,ops[node+3].ival,&numarg,P_MATCH+1); if (strNE(tmpstr->str_ptr,"$_")) { str_cat(tmpstr, " =~ s"); i++; } else str_set(tmpstr, "s"); } else str_set(tmpstr, "s"); type = ops[ops[node+2].ival].ival; len = type >> 8; type &= 255; tmp3str = str_new(0); if (type == OSTR) { tmp2str=walk(1,level,ops[ops[node+2].ival+1].ival,&numarg,P_MIN); for (t = tmp2str->str_ptr, d=tokenbuf; *t; d++,t++) { if (*t == '&') *d++ = '$' + 128; else if (*t == '$') *d++ = '\\' + 128; *d = *t + 128; } *d = '\0'; str_set(tmp2str,tokenbuf); } else { tmp2str=walk(1,level,ops[node+2].ival,&numarg,P_MIN); str_set(tmp3str,"($s_ = '\"'.("); str_scat(tmp3str,tmp2str); str_cat(tmp3str,").'\"') =~ s/&/\\$&/g, "); str_set(tmp2str,"eval $s_"); s = (*s == 'g' ? "ge" : "e"); i++; } type = ops[ops[node+1].ival].ival; len = type >> 8; type &= 255; fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN); if (type == OREGEX) { if (useval && i) str_cat(str,"("); str_scat(str,tmp3str); str_scat(str,tmpstr); str_scat(str,fstr); str_scat(str,tmp2str); str_cat(str,"/"); str_cat(str,s); } else if ((type == OFLD && !split_to_array) || (type == OVAR && len == 1)) { if (useval && i) str_cat(str,"("); str_scat(str,tmp3str); str_scat(str,tmpstr); str_cat(str,"/"); str_scat(str,fstr); str_cat(str,"/"); str_scat(str,tmp2str); str_cat(str,"/"); str_cat(str,s); } else { i++; if (useval) str_cat(str,"("); str_cat(str,"$s = "); str_scat(str,fstr); str_cat(str,", "); str_scat(str,tmp3str); str_scat(str,tmpstr); str_cat(str,"/$s/"); str_scat(str,tmp2str); str_cat(str,"/"); str_cat(str,s); } if (useval && i) str_cat(str,")"); str_free(fstr); str_free(tmpstr); str_free(tmp2str); str_free(tmp3str); numeric = 1; break; case ONUM: str = walk(1,level,ops[node+1].ival,&numarg,P_MIN); numeric = 1; break; case OSTR: tmpstr = walk(1,level,ops[node+1].ival,&numarg,P_MIN); s = "'"; for (t = tmpstr->str_ptr, d=tokenbuf; *t; d++,t++) { if (*t == '\'') s = "\""; else if (*t == '\\') { s = "\""; *d++ = *t++ + 128; switch (*t) { case '\\': case '"': case 'n': case 't': case '$': break; default: /* hide this from perl */ *d++ = '\\' + 128; } } *d = *t + 128; } *d = '\0'; str = str_new(0); str_set(str,s); str_cat(str,tokenbuf); str_free(tmpstr); str_cat(str,s); break; case ODEFINED: prec = P_UNI; str = str_new(0); str_set(str,"defined $"); goto addvar; case ODELETE: str = str_new(0); str_set(str,"delete $"); goto addvar; case OSTAR: str = str_new(0); str_set(str,"*"); goto addvar; case OVAR: str = str_new(0); str_set(str,"$"); addvar: str_scat(str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); if (len == 1) { tmp2str = hfetch(symtab,tmpstr->str_ptr); if (tmp2str && atoi(tmp2str->str_ptr)) numeric = 2; if (strEQ(str->str_ptr,"$FNR")) { numeric = 1; saw_FNR++; str_set(str,"($.-$FNRbase)"); } else if (strEQ(str->str_ptr,"$NR")) { numeric = 1; str_set(str,"$."); } else if (strEQ(str->str_ptr,"$NF")) { numeric = 1; str_set(str,"$#Fld"); } else if (strEQ(str->str_ptr,"$0")) str_set(str,"$_"); else if (strEQ(str->str_ptr,"$ARGC")) str_set(str,"($#ARGV+1)"); } else {#ifdef NOTDEF if (curargs) { sprintf(tokenbuf,"$%s,",tmpstr->str_ptr); ??? if (instr(curargs->str_ptr,tokenbuf)) str_cat(str,"\377"); /* can't translate yet */ }#endif str_cat(tmpstr,"[]"); tmp2str = hfetch(symtab,tmpstr->str_ptr); if (tmp2str && atoi(tmp2str->str_ptr)) str_cat(str,"["); else str_cat(str,"{"); str_scat(str,fstr=walk(1,level,ops[node+2].ival,&numarg,P_MIN)); str_free(fstr); if (strEQ(str->str_ptr,"$ARGV[0")) { str_set(str,"$ARGV0"); saw_argv0++; } else { if (tmp2str && atoi(tmp2str->str_ptr)) strcpy(tokenbuf,"]"); else strcpy(tokenbuf,"}"); *tokenbuf += 128; str_cat(str,tokenbuf); } } str_free(tmpstr); break; case OFLD: str = str_new(0); if (split_to_array) { str_set(str,"$Fld"); str_cat(str,"["); str_scat(str,fstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); str_free(fstr); str_cat(str,"]"); } else { i = atoi(walk(1,level,ops[node+1].ival,&numarg,P_MIN)->str_ptr); if (i <= arymax) sprintf(tokenbuf,"$%s",nameary[i]); else sprintf(tokenbuf,"$Fld%d",i); str_set(str,tokenbuf); } break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -