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

📄 walk.c

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