📄 walk.c
字号:
}tab(str,lvl)register STR *str;register int lvl;{ while (lvl > 1) { str_cat(str,"\t"); lvl -= 2; } if (lvl) str_cat(str," ");}fixtab(str,lvl)register STR *str;register int lvl;{ register char *s; /* strip trailing white space */ s = str->str_ptr+str->str_cur - 1; while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n')) s--; s[1] = '\0'; str->str_cur = s + 1 - str->str_ptr; if (s >= str->str_ptr && *s != '\n') str_cat(str,"\n"); tab(str,lvl);}addsemi(str)register STR *str;{ register char *s; s = str->str_ptr+str->str_cur - 1; while (s >= str->str_ptr && (*s == ' ' || *s == '\t' || *s == '\n')) s--; if (s >= str->str_ptr && *s != ';' && *s != '}') str_cat(str,";");}emit_split(str,level)register STR *str;int level;{ register int i; if (split_to_array) str_cat(str,"@Fld"); else { str_cat(str,"("); for (i = 1; i < maxfld; i++) { if (i <= arymax) sprintf(tokenbuf,"$%s,",nameary[i]); else sprintf(tokenbuf,"$Fld%d,",i); str_cat(str,tokenbuf); } if (maxfld <= arymax) sprintf(tokenbuf,"$%s)",nameary[maxfld]); else sprintf(tokenbuf,"$Fld%d)",maxfld); str_cat(str,tokenbuf); } if (const_FS) { sprintf(tokenbuf," = split(/[%c\\n]/, $_, 9999);\n",const_FS); str_cat(str,tokenbuf); } else if (saw_FS) str_cat(str," = split($FS, $_, 9999);\n"); else str_cat(str," = split(' ', $_, 9999);\n"); tab(str,level);}prewalk(numit,level,node,numericptr)int numit;int level;register int node;int *numericptr;{ register int len; register int type; register int i; char *t; char *d, *s; int numarg; int numeric = FALSE; STR *tmpstr; STR *tmp2str; if (!node) { *numericptr = 0; return 0; } type = ops[node].ival; len = type >> 8; type &= 255; switch (type) { case OPROG: prewalk(0,level,ops[node+1].ival,&numarg); if (ops[node+2].ival) { prewalk(0,level,ops[node+2].ival,&numarg); } ++level; prewalk(0,level,ops[node+3].ival,&numarg); --level; if (ops[node+3].ival) { prewalk(0,level,ops[node+4].ival,&numarg); } break; case OHUNKS: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); if (len == 3) { prewalk(0,level,ops[node+3].ival,&numarg); } break; case ORANGE: prewalk(1,level,ops[node+1].ival,&numarg); prewalk(1,level,ops[node+2].ival,&numarg); break; case OPAT: goto def; case OREGEX: prewalk(0,level,ops[node+1].ival,&numarg); break; case OHUNK: if (len == 1) { prewalk(0,level,ops[node+1].ival,&numarg); } else { i = prewalk(0,level,ops[node+1].ival,&numarg); if (i) { ++level; prewalk(0,level,ops[node+2].ival,&numarg); --level; } else { prewalk(0,level,ops[node+2].ival,&numarg); } } break; case OPPAREN: prewalk(0,level,ops[node+1].ival,&numarg); break; case OPANDAND: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); break; case OPOROR: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); break; case OPNOT: prewalk(0,level,ops[node+1].ival,&numarg); break; case OCPAREN: prewalk(0,level,ops[node+1].ival,&numarg); numeric |= numarg; break; case OCANDAND: prewalk(0,level,ops[node+1].ival,&numarg); numeric = 1; prewalk(0,level,ops[node+2].ival,&numarg); break; case OCOROR: prewalk(0,level,ops[node+1].ival,&numarg); numeric = 1; prewalk(0,level,ops[node+2].ival,&numarg); break; case OCNOT: prewalk(0,level,ops[node+1].ival,&numarg); numeric = 1; break; case ORELOP: prewalk(0,level,ops[node+2].ival,&numarg); numeric |= numarg; prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+3].ival,&numarg); numeric |= numarg; numeric = 1; break; case ORPAREN: prewalk(0,level,ops[node+1].ival,&numarg); numeric |= numarg; break; case OMATCHOP: prewalk(0,level,ops[node+2].ival,&numarg); prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+3].ival,&numarg); numeric = 1; break; case OMPAREN: prewalk(0,level,ops[node+1].ival,&numarg); numeric |= numarg; break; case OCONCAT: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); break; case OASSIGN: prewalk(0,level,ops[node+2].ival,&numarg); prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+3].ival,&numarg); if (numarg || strlen(ops[ops[node+1].ival+1].cval) > 1) { numericize(ops[node+2].ival); if (!numarg) numericize(ops[node+3].ival); } numeric |= numarg; break; case OADD: prewalk(1,level,ops[node+1].ival,&numarg); prewalk(1,level,ops[node+2].ival,&numarg); numeric = 1; break; case OSUBTRACT: prewalk(1,level,ops[node+1].ival,&numarg); prewalk(1,level,ops[node+2].ival,&numarg); numeric = 1; break; case OMULT: prewalk(1,level,ops[node+1].ival,&numarg); prewalk(1,level,ops[node+2].ival,&numarg); numeric = 1; break; case ODIV: prewalk(1,level,ops[node+1].ival,&numarg); prewalk(1,level,ops[node+2].ival,&numarg); numeric = 1; break; case OPOW: prewalk(1,level,ops[node+1].ival,&numarg); prewalk(1,level,ops[node+2].ival,&numarg); numeric = 1; break; case OMOD: prewalk(1,level,ops[node+1].ival,&numarg); prewalk(1,level,ops[node+2].ival,&numarg); numeric = 1; break; case OPOSTINCR: prewalk(1,level,ops[node+1].ival,&numarg); numeric = 1; break; case OPOSTDECR: prewalk(1,level,ops[node+1].ival,&numarg); numeric = 1; break; case OPREINCR: prewalk(1,level,ops[node+1].ival,&numarg); numeric = 1; break; case OPREDECR: prewalk(1,level,ops[node+1].ival,&numarg); numeric = 1; break; case OUMINUS: prewalk(1,level,ops[node+1].ival,&numarg); numeric = 1; break; case OUPLUS: prewalk(1,level,ops[node+1].ival,&numarg); numeric = 1; break; case OPAREN: prewalk(0,level,ops[node+1].ival,&numarg); numeric |= numarg; break; case OGETLINE: break; case OSPRINTF: prewalk(0,level,ops[node+1].ival,&numarg); break; case OSUBSTR: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(1,level,ops[node+2].ival,&numarg); if (len == 3) { prewalk(1,level,ops[node+3].ival,&numarg); } break; case OSTRING: break; case OSPLIT: numeric = 1; prewalk(0,level,ops[node+2].ival,&numarg); if (len == 3) prewalk(0,level,ops[node+3].ival,&numarg); prewalk(0,level,ops[node+1].ival,&numarg); break; case OINDEX: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); numeric = 1; break; case OMATCH: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); numeric = 1; break; case OUSERDEF: subretnum = FALSE; --level; tmpstr = walk(0,level,ops[node+1].ival,&numarg,P_MIN); ++level; prewalk(0,level,ops[node+2].ival,&numarg); prewalk(0,level,ops[node+4].ival,&numarg); prewalk(0,level,ops[node+5].ival,&numarg); --level; str_cat(tmpstr,"("); tmp2str = str_new(0); if (subretnum || numarg) str_set(tmp2str,"1"); hstore(symtab,tmpstr->str_ptr,tmp2str); str_free(tmpstr); level++; break; case ORETURN: if (len > 0) { prewalk(0,level,ops[node+1].ival,&numarg); if (numarg) subretnum = TRUE; } break; case OUSERFUN: tmp2str = str_new(0); str_scat(tmp2str,tmpstr=walk(1,level,ops[node+1].ival,&numarg,P_MIN)); fixrargs(tmpstr->str_ptr,ops[node+2].ival,0); str_free(tmpstr); str_cat(tmp2str,"("); tmpstr = hfetch(symtab,tmp2str->str_ptr); if (tmpstr && tmpstr->str_ptr) numeric |= atoi(tmpstr->str_ptr); prewalk(0,level,ops[node+2].ival,&numarg); str_free(tmp2str); break; case OGSUB: case OSUB: if (len >= 3) prewalk(0,level,ops[node+3].ival,&numarg); prewalk(0,level,ops[ops[node+2].ival+1].ival,&numarg); prewalk(0,level,ops[node+1].ival,&numarg); numeric = 1; break; case ONUM: prewalk(0,level,ops[node+1].ival,&numarg); numeric = 1; break; case OSTR: prewalk(0,level,ops[node+1].ival,&numarg); break; case ODEFINED: case ODELETE: case OSTAR: case OVAR: prewalk(0,level,ops[node+1].ival,&numarg); if (len == 1) { if (numit) numericize(node); } else { prewalk(0,level,ops[node+2].ival,&numarg); } break; case OFLD: prewalk(0,level,ops[node+1].ival,&numarg); break; case OVFLD: i = ops[node+1].ival; prewalk(0,level,i,&numarg); break; case OJUNK: goto def; case OSNEWLINE: break; case ONEWLINE: break; case OSCOMMENT: break; case OCOMMENT: break; case OCOMMA: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); prewalk(0,level,ops[node+3].ival,&numarg); break; case OSEMICOLON: break; case OSTATES: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); break; case OSTATE: if (len >= 1) { prewalk(0,level,ops[node+1].ival,&numarg); if (len >= 2) { prewalk(0,level,ops[node+2].ival,&numarg); } } break; case OCLOSE: prewalk(0,level,ops[node+1].ival,&numarg); break; case OPRINTF: case OPRINT: if (len == 3) { /* output redirection */ prewalk(0,level,ops[node+3].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); } prewalk(0+(type==OPRINT),level,ops[node+1].ival,&numarg); break; case ORAND: break; case OSRAND: goto maybe0; case OATAN2: goto maybe0; case OSIN: goto maybe0; case OCOS: goto maybe0; case OSYSTEM: goto maybe0; case OLENGTH: goto maybe0; case OLOG: goto maybe0; case OEXP: goto maybe0; case OSQRT: goto maybe0; case OINT: maybe0: numeric = 1; if (len > 0) prewalk(type != OLENGTH && type != OSYSTEM, level,ops[node+1].ival,&numarg); break; case OBREAK: break; case ONEXT: break; case OEXIT: if (len == 1) { prewalk(1,level,ops[node+1].ival,&numarg); } break; case OCONTINUE: break; case OREDIR: goto def; case OIF: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); if (len == 3) { prewalk(0,level,ops[node+3].ival,&numarg); } break; case OWHILE: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); break; case OFOR: prewalk(0,level,ops[node+1].ival,&numarg); prewalk(0,level,ops[node+2].ival,&numarg); prewalk(0,level,ops[node+3].ival,&numarg); prewalk(0,level,ops[node+4].ival,&numarg); break; case OFORIN: prewalk(0,level,ops[node+2].ival,&numarg); prewalk(0,level,ops[node+1].ival,&numarg); break; case OBLOCK: if (len == 2) { prewalk(0,level,ops[node+2].ival,&numarg); } ++level; prewalk(0,level,ops[node+1].ival,&numarg); --level; break; default: def: if (len) { if (len > 5) fatal("Garbage length in prewalk"); prewalk(0,level,ops[node+1].ival,&numarg); for (i = 2; i<= len; i++) { prewalk(0,level,ops[node+i].ival,&numarg); } } break; } *numericptr = numeric; return 1;}numericize(node)register int node;{ register int len; register int type; register int i; STR *tmpstr; STR *tmp2str; int numarg; type = ops[node].ival; len = type >> 8; type &= 255; if (type == OVAR && len == 1) { tmpstr=walk(0,0,ops[node+1].ival,&numarg,P_MIN); tmp2str = str_make("1"); hstore(symtab,tmpstr->str_ptr,tmp2str); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -