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

📄 walk.c

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