⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 walk.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 4 页
字号:
}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 + -