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

📄 sub.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 3 页
字号:
	TIND,		0,	"IND",	TFUNC,		0,	"FUNC",	TARRAY,		0,	"ARRAY",	TVOID,		0,	"VOID",	TSTRUCT,	0,	"STRUCT",	TUNION,		0,	"UNION",	TENUM,		0,	"ENUM",	TAUTO,		0,	"AUTO",	TEXTERN,	0,	"EXTERN",	TSTATIC,	0,	"STATIC",	TTYPEDEF,	0,	"TYPEDEF",	TTYPESTR,	0,	"TYPESTR",	TREGISTER,	0,	"REGISTER",	TCONSTNT,	0,	"CONSTNT",	TVOLATILE,	0,	"VOLATILE",	TUNSIGNED,	0,	"UNSIGNED",	TSIGNED,	0,	"SIGNED",	TDOT,		0,	"DOT",	TFILE,		0,	"FILE",	TOLD,		0,	"OLD",	-1,		0,	0,};char*	cnames[NCTYPES];Init	cnamesinit[] ={	CXXX,		0,	"CXXX",	CAUTO,		0,	"AUTO",	CEXTERN,	0,	"EXTERN",	CGLOBL,		0,	"GLOBL",	CSTATIC,	0,	"STATIC",	CLOCAL,		0,	"LOCAL",	CTYPEDEF,	0,	"TYPEDEF",	CTYPESTR,	0,	"TYPESTR",	CPARAM,		0,	"PARAM",	CSELEM,		0,	"SELEM",	CLABEL,		0,	"LABEL",	CEXREG,		0,	"EXREG",	-1,		0,	0,};char*	onames[OEND+1];Init	onamesinit[] ={	OXXX,		0,	"OXXX",	OADD,		0,	"ADD",	OADDR,		0,	"ADDR",	OAND,		0,	"AND",	OANDAND,	0,	"ANDAND",	OARRAY,		0,	"ARRAY",	OAS,		0,	"AS",	OASI,		0,	"ASI",	OASADD,		0,	"ASADD",	OASAND,		0,	"ASAND",	OASASHL,	0,	"ASASHL",	OASASHR,	0,	"ASASHR",	OASDIV,		0,	"ASDIV",	OASHL,		0,	"ASHL",	OASHR,		0,	"ASHR",	OASLDIV,	0,	"ASLDIV",	OASLMOD,	0,	"ASLMOD",	OASLMUL,	0,	"ASLMUL",	OASLSHR,	0,	"ASLSHR",	OASMOD,		0,	"ASMOD",	OASMUL,		0,	"ASMUL",	OASOR,		0,	"ASOR",	OASSUB,		0,	"ASSUB",	OASXOR,		0,	"ASXOR",	OBIT,		0,	"BIT",	OBREAK,		0,	"BREAK",	OCASE,		0,	"CASE",	OCAST,		0,	"CAST",	OCOMMA,		0,	"COMMA",	OCOND,		0,	"COND",	OCONST,		0,	"CONST",	OCONTINUE,	0,	"CONTINUE",	ODIV,		0,	"DIV",	ODOT,		0,	"DOT",	ODOTDOT,	0,	"DOTDOT",	ODWHILE,	0,	"DWHILE",	OENUM,		0,	"ENUM",	OEQ,		0,	"EQ",	OFOR,		0,	"FOR",	OFUNC,		0,	"FUNC",	OGE,		0,	"GE",	OGOTO,		0,	"GOTO",	OGT,		0,	"GT",	OHI,		0,	"HI",	OHS,		0,	"HS",	OIF,		0,	"IF",	OIND,		0,	"IND",	OINDREG,	0,	"INDREG",	OINIT,		0,	"INIT",	OLABEL,		0,	"LABEL",	OLDIV,		0,	"LDIV",	OLE,		0,	"LE",	OLIST,		0,	"LIST",	OLMOD,		0,	"LMOD",	OLMUL,		0,	"LMUL",	OLO,		0,	"LO",	OLS,		0,	"LS",	OLSHR,		0,	"LSHR",	OLT,		0,	"LT",	OMOD,		0,	"MOD",	OMUL,		0,	"MUL",	ONAME,		0,	"NAME",	ONE,		0,	"NE",	ONOT,		0,	"NOT",	OOR,		0,	"OR",	OOROR,		0,	"OROR",	OPOSTDEC,	0,	"POSTDEC",	OPOSTINC,	0,	"POSTINC",	OPREDEC,	0,	"PREDEC",	OPREINC,	0,	"PREINC",	OPROTO,		0,	"PROTO",	OREGISTER,	0,	"REGISTER",	ORETURN,	0,	"RETURN",	OSET,		0,	"SET",	OSIGN,		0,	"SIGN",	OSIZE,		0,	"SIZE",	OSTRING,	0,	"STRING",	OLSTRING,	0,	"LSTRING",	OSTRUCT,	0,	"STRUCT",	OSUB,		0,	"SUB",	OSWITCH,	0,	"SWITCH",	OUNION,		0,	"UNION",	OUSED,		0,	"USED",	OWHILE,		0,	"WHILE",	OXOR,		0,	"XOR",	OPOS,		0,	"POS",	ONEG,		0,	"NEG",	OCOM,		0,	"COM",	OELEM,		0,	"ELEM",	OTST,		0,	"TST",	OINDEX,		0,	"INDEX",	OFAS,		0,	"FAS",	OREGPAIR,	0,	"REGPAIR",	OEND,		0,	"END",	-1,		0,	0,};/*	OEQ, ONE, OLE, OLS, OLT, OLO, OGE, OHS, OGT, OHI */char	comrel[12] ={	ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,};char	invrel[12] ={	OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,};char	logrel[12] ={	OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,};char	typei[NTYPE];int	typeiinit[] ={	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,};char	typeu[NTYPE];int	typeuinit[] ={	TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,};char	typesuv[NTYPE];int	typesuvinit[] ={	TVLONG, TUVLONG, TSTRUCT, TUNION, -1,};char	typeilp[NTYPE];int	typeilpinit[] ={	TINT, TUINT, TLONG, TULONG, TIND, -1};char	typechl[NTYPE];char	typechlv[NTYPE];char typechlvp[NTYPE];int	typechlinit[] ={	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,};char	typechlp[NTYPE];int	typechlpinit[] ={	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,};char	typechlpfd[NTYPE];int	typechlpfdinit[] ={	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,};char	typec[NTYPE];int	typecinit[] ={	TCHAR, TUCHAR, -1};char	typeh[NTYPE];int	typehinit[] ={	TSHORT, TUSHORT, -1,};char	typeil[NTYPE];int	typeilinit[] ={	TINT, TUINT, TLONG, TULONG, -1,};char	typev[NTYPE];int	typevinit[] ={	TVLONG,	TUVLONG, -1,};char	typefd[NTYPE];int	typefdinit[] ={	TFLOAT, TDOUBLE, -1,};char	typeaf[NTYPE];int	typeafinit[] ={	TFUNC, TARRAY, -1,};char	typesu[NTYPE];int	typesuinit[] ={	TSTRUCT, TUNION, -1,};long	tasign[NTYPE];Init	tasigninit[] ={	TCHAR,		BNUMBER,	0,	TUCHAR,		BNUMBER,	0,	TSHORT,		BNUMBER,	0,	TUSHORT,	BNUMBER,	0,	TINT,		BNUMBER,	0,	TUINT,		BNUMBER,	0,	TLONG,		BNUMBER,	0,	TULONG,		BNUMBER,	0,	TVLONG,		BNUMBER,	0,	TUVLONG,	BNUMBER,	0,	TFLOAT,		BNUMBER,	0,	TDOUBLE,	BNUMBER,	0,	TIND,		BIND,		0,	TSTRUCT,	BSTRUCT,	0,	TUNION,		BUNION,		0,	-1,		0,		0,};long	tasadd[NTYPE];Init	tasaddinit[] ={	TCHAR,		BNUMBER,	0,	TUCHAR,		BNUMBER,	0,	TSHORT,		BNUMBER,	0,	TUSHORT,	BNUMBER,	0,	TINT,		BNUMBER,	0,	TUINT,		BNUMBER,	0,	TLONG,		BNUMBER,	0,	TULONG,		BNUMBER,	0,	TVLONG,		BNUMBER,	0,	TUVLONG,	BNUMBER,	0,	TFLOAT,		BNUMBER,	0,	TDOUBLE,	BNUMBER,	0,	TIND,		BINTEGER,	0,	-1,		0,		0,};long	tcast[NTYPE];Init	tcastinit[] ={	TCHAR,		BNUMBER|BIND|BVOID,	0,	TUCHAR,		BNUMBER|BIND|BVOID,	0,	TSHORT,		BNUMBER|BIND|BVOID,	0,	TUSHORT,	BNUMBER|BIND|BVOID,	0,	TINT,		BNUMBER|BIND|BVOID,	0,	TUINT,		BNUMBER|BIND|BVOID,	0,	TLONG,		BNUMBER|BIND|BVOID,	0,	TULONG,		BNUMBER|BIND|BVOID,	0,	TVLONG,		BNUMBER|BIND|BVOID,	0,	TUVLONG,	BNUMBER|BIND|BVOID,	0,	TFLOAT,		BNUMBER|BVOID,		0,	TDOUBLE,	BNUMBER|BVOID,		0,	TIND,		BINTEGER|BIND|BVOID,	0,	TVOID,		BVOID,			0,	TSTRUCT,	BSTRUCT|BVOID,		0,	TUNION,		BUNION|BVOID,		0,	-1,		0,			0,};long	tadd[NTYPE];Init	taddinit[] ={	TCHAR,		BNUMBER|BIND,	0,	TUCHAR,		BNUMBER|BIND,	0,	TSHORT,		BNUMBER|BIND,	0,	TUSHORT,	BNUMBER|BIND,	0,	TINT,		BNUMBER|BIND,	0,	TUINT,		BNUMBER|BIND,	0,	TLONG,		BNUMBER|BIND,	0,	TULONG,		BNUMBER|BIND,	0,	TVLONG,		BNUMBER|BIND,	0,	TUVLONG,	BNUMBER|BIND,	0,	TFLOAT,		BNUMBER,	0,	TDOUBLE,	BNUMBER,	0,	TIND,		BINTEGER,	0,	-1,		0,		0,};long	tsub[NTYPE];Init	tsubinit[] ={	TCHAR,		BNUMBER,	0,	TUCHAR,		BNUMBER,	0,	TSHORT,		BNUMBER,	0,	TUSHORT,	BNUMBER,	0,	TINT,		BNUMBER,	0,	TUINT,		BNUMBER,	0,	TLONG,		BNUMBER,	0,	TULONG,		BNUMBER,	0,	TVLONG,		BNUMBER,	0,	TUVLONG,	BNUMBER,	0,	TFLOAT,		BNUMBER,	0,	TDOUBLE,	BNUMBER,	0,	TIND,		BINTEGER|BIND,	0,	-1,		0,		0,};long	tmul[NTYPE];Init	tmulinit[] ={	TCHAR,		BNUMBER,	0,	TUCHAR,		BNUMBER,	0,	TSHORT,		BNUMBER,	0,	TUSHORT,	BNUMBER,	0,	TINT,		BNUMBER,	0,	TUINT,		BNUMBER,	0,	TLONG,		BNUMBER,	0,	TULONG,		BNUMBER,	0,	TVLONG,		BNUMBER,	0,	TUVLONG,	BNUMBER,	0,	TFLOAT,		BNUMBER,	0,	TDOUBLE,	BNUMBER,	0,	-1,		0,		0,};long	tand[NTYPE];Init	tandinit[] ={	TCHAR,		BINTEGER,	0,	TUCHAR,		BINTEGER,	0,	TSHORT,		BINTEGER,	0,	TUSHORT,	BINTEGER,	0,	TINT,		BNUMBER,	0,	TUINT,		BNUMBER,	0,	TLONG,		BINTEGER,	0,	TULONG,		BINTEGER,	0,	TVLONG,		BINTEGER,	0,	TUVLONG,	BINTEGER,	0,	-1,		0,		0,};long	trel[NTYPE];Init	trelinit[] ={	TCHAR,		BNUMBER,	0,	TUCHAR,		BNUMBER,	0,	TSHORT,		BNUMBER,	0,	TUSHORT,	BNUMBER,	0,	TINT,		BNUMBER,	0,	TUINT,		BNUMBER,	0,	TLONG,		BNUMBER,	0,	TULONG,		BNUMBER,	0,	TVLONG,		BNUMBER,	0,	TUVLONG,	BNUMBER,	0,	TFLOAT,		BNUMBER,	0,	TDOUBLE,	BNUMBER,	0,	TIND,		BIND,		0,	-1,		0,		0,};long	tfunct[1] ={	BFUNC,};long	tindir[1] ={	BIND,};long	tdot[1] ={	BSTRUCT|BUNION,};long	tnot[1] ={	BNUMBER|BIND,};long	targ[1] ={	BNUMBER|BIND|BSTRUCT|BUNION,};char	tab[NTYPE][NTYPE] ={/*TXXX*/	{ 0,		},/*TCHAR*/	{ 0,	TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG,			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,		},/*TUCHAR*/	{ 0,	TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,		},/*TSHORT*/	{ 0,	TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG,			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,		},/*TUSHORT*/	{ 0,	TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,		},/*TINT*/	{ 0,	TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG,			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,		},/*TUINT*/	{ 0,	TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG,			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,		},/*TLONG*/	{ 0,	TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG,			TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,		},/*TULONG*/	{ 0,	TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG,			TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,		},/*TVLONG*/	{ 0,	TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG,			TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,		},/*TUVLONG*/	{ 0,	TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG,			TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,		},/*TFLOAT*/	{ 0,	TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT,			TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND,		},/*TDOUBLE*/	{ 0,	TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE,			TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND,		},/*TIND*/	{ 0,	TIND, TIND, TIND, TIND, TIND, TIND, TIND,			 TIND, TIND, TIND, TIND, TIND, TIND,		},};voidurk(char *name, int max, int i){	if(i >= max) {		fprint(2, "bad tinit: %s %d>=%d\n", name, i, max);		exits("init");	}}voidtinit(void){	int *ip;	Init *p;	for(p=thashinit; p->code >= 0; p++) {		urk("thash", nelem(thash), p->code);		thash[p->code] = p->value;	}	for(p=bnamesinit; p->code >= 0; p++) {		urk("bnames", nelem(bnames), p->code);		bnames[p->code] = p->s;	}	for(p=tnamesinit; p->code >= 0; p++) {		urk("tnames", nelem(tnames), p->code);		tnames[p->code] = p->s;	}	for(p=gnamesinit; p->code >= 0; p++) {		urk("gnames", nelem(gnames), p->code);		gnames[p->code] = p->s;	}	for(p=qnamesinit; p->code >= 0; p++) {		urk("qnames", nelem(qnames), p->code);		qnames[p->code] = p->s;	}	for(p=cnamesinit; p->code >= 0; p++) {		urk("cnames", nelem(cnames), p->code);		cnames[p->code] = p->s;	}	for(p=onamesinit; p->code >= 0; p++) {		urk("onames", nelem(onames), p->code);		onames[p->code] = p->s;	}	for(ip=typeiinit; *ip>=0; ip++) {		urk("typei", nelem(typei), *ip);		typei[*ip] = 1;	}	for(ip=typeuinit; *ip>=0; ip++) {		urk("typeu", nelem(typeu), *ip);		typeu[*ip] = 1;	}	for(ip=typesuvinit; *ip>=0; ip++) {		urk("typesuv", nelem(typesuv), *ip);		typesuv[*ip] = 1;	}	for(ip=typeilpinit; *ip>=0; ip++) {		urk("typeilp", nelem(typeilp), *ip);		typeilp[*ip] = 1;	}	for(ip=typechlinit; *ip>=0; ip++) {		urk("typechl", nelem(typechl), *ip);		typechl[*ip] = 1;		typechlv[*ip] = 1;		typechlvp[*ip] = 1;	}	for(ip=typechlpinit; *ip>=0; ip++) {		urk("typechlp", nelem(typechlp), *ip);		typechlp[*ip] = 1;		typechlvp[*ip] = 1;	}	for(ip=typechlpfdinit; *ip>=0; ip++) {		urk("typechlpfd", nelem(typechlpfd), *ip);		typechlpfd[*ip] = 1;	}	for(ip=typecinit; *ip>=0; ip++) {		urk("typec", nelem(typec), *ip);		typec[*ip] = 1;	}	for(ip=typehinit; *ip>=0; ip++) {		urk("typeh", nelem(typeh), *ip);		typeh[*ip] = 1;	}	for(ip=typeilinit; *ip>=0; ip++) {		urk("typeil", nelem(typeil), *ip);		typeil[*ip] = 1;	}	for(ip=typevinit; *ip>=0; ip++) {		urk("typev", nelem(typev), *ip);		typev[*ip] = 1;		typechlv[*ip] = 1;		typechlvp[*ip] = 1;	}	for(ip=typefdinit; *ip>=0; ip++) {		urk("typefd", nelem(typefd), *ip);		typefd[*ip] = 1;	}	for(ip=typeafinit; *ip>=0; ip++) {		urk("typeaf", nelem(typeaf), *ip);		typeaf[*ip] = 1;	}	for(ip=typesuinit; *ip >= 0; ip++) {		urk("typesu", nelem(typesu), *ip);		typesu[*ip] = 1;	}	for(p=tasigninit; p->code >= 0; p++) {		urk("tasign", nelem(tasign), p->code);		tasign[p->code] = p->value;	}	for(p=tasaddinit; p->code >= 0; p++) {		urk("tasadd", nelem(tasadd), p->code);		tasadd[p->code] = p->value;	}	for(p=tcastinit; p->code >= 0; p++) {		urk("tcast", nelem(tcast), p->code);		tcast[p->code] = p->value;	}	for(p=taddinit; p->code >= 0; p++) {		urk("tadd", nelem(tadd), p->code);		tadd[p->code] = p->value;	}	for(p=tsubinit; p->code >= 0; p++) {		urk("tsub", nelem(tsub), p->code);		tsub[p->code] = p->value;	}	for(p=tmulinit; p->code >= 0; p++) {		urk("tmul", nelem(tmul), p->code);		tmul[p->code] = p->value;	}	for(p=tandinit; p->code >= 0; p++) {		urk("tand", nelem(tand), p->code);		tand[p->code] = p->value;	}	for(p=trelinit; p->code >= 0; p++) {		urk("trel", nelem(trel), p->code);		trel[p->code] = p->value;	}		/* 32-bit defaults */	typeword = typechlp;	typecmplx = typesuv;}/* * return 1 if it is impossible to jump into the middle of n. */static intdeadhead(Node *n, int caseok){loop:	if(n == Z)		return 1;	switch(n->op) {	case OLIST:		if(!deadhead(n->left, caseok))			return 0;	rloop:		n = n->right;		goto loop;	case ORETURN:		break;	case OLABEL:		return 0;	case OGOTO:		break;	case OCASE:		if(!caseok)			return 0;		goto rloop;	case OSWITCH:		return deadhead(n->right, 1);	case OWHILE:	case ODWHILE:		goto rloop;	case OFOR:		goto rloop;	case OCONTINUE:		break;	case OBREAK:		break;	case OIF:		return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok);	case OSET:	case OUSED:		break;	}	return 1;}intdeadheads(Node *c){	return deadhead(c->left, 0) && deadhead(c->right, 0);}intmixedasop(Type *l, Type *r){	return !typefd[l->etype] && typefd[r->etype];}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -