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

📄 proc.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
📖 第 1 页 / 共 2 页
字号:
for(p = extsymtab ; p<nextext ; ++p)	prext( varstr(XL, p->extname), p->maxleng, p->extinit);}ftnint iarrlen(q)register struct nameblock *q;{ftnint leng;leng = typesize[q->vtype];if(leng <= 0)	return(-1);if(q->vdim)	if( ISICON(q->vdim->nelt) )		leng *= q->vdim->nelt->const.ci;	else	return(-1);if(q->vleng)	if( ISICON(q->vleng) )		leng *= q->vleng->const.ci;	else 	return(-1);return(leng);}LOCAL docommon(){register struct extsym *p;register chainp q;struct dimblock *t;expptr neltp;register struct nameblock *v;ftnint size;int type;for(p = extsymtab ; p<nextext ; ++p)	if(p->extstg==STGCOMMON)		{		for(q = p->extp ; q ; q = q->nextp)			{			v = q->datap;			if(v->vdcldone == NO)				vardcl(v);			type = v->vtype;			if(p->extleng % typealign[type] != 0)				{				dclerr("common alignment", v);				p->extleng = roundup(p->extleng, typealign[type]);				}			v->voffset = p->extleng;			v->vardesc.varno = p - extsymtab;			if(type == TYCHAR)				size = v->vleng->const.ci;			else	size = typesize[type];			if(t = v->vdim)				if( (neltp = t->nelt) && ISCONST(neltp) )					size *= neltp->const.ci;				else					dclerr("adjustable array in common", v);			p->extleng += size;			}		frchain( &(p->extp) );		}}LOCAL docomleng(){register struct extsym *p;for(p = extsymtab ; p < nextext ; ++p)	if(p->extstg == STGCOMMON)		{		if(p->maxleng!=0 && p->extleng!=0 && p->maxleng!=p->extleng &&		    !eqn(XL,"_BLNK__ ",p->extname) )			warn1("incompatible lengths for common block %s",				nounder(XL, p->extname) );		if(p->maxleng < p->extleng)			p->maxleng = p->extleng;		p->extleng = 0;	}}/* ROUTINES DEALING WITH AUTOMATIC AND TEMPORARY STORAGE */frtemp(p)struct addrblock *p;{holdtemps = mkchain(p, holdtemps);}/* allocate an automatic variable slot */struct addrblock *autovar(nelt, t, lengp)register int nelt, t;expptr lengp;{ftnint leng;register struct addrblock *q;if(t == TYCHAR)	if( ISICON(lengp) )		leng = lengp->const.ci;	else	{		fatal("automatic variable of nonconstant length");		}else	leng = typesize[t];autoleng = roundup( autoleng, typealign[t]);q = ALLOC(addrblock);q->tag = TADDR;q->vtype = t;if(t == TYCHAR)	q->vleng = ICON(leng);q->vstg = STGAUTO;q->ntempelt = nelt;#if TARGET==PDP11 || TARGET==VAX	/* stack grows downward */	autoleng += nelt*leng;	q->memoffset = ICON( - autoleng );#else	q->memoffset = ICON( autoleng );	autoleng += nelt*leng;#endifreturn(q);}struct addrblock *mktmpn(nelt, type, lengp)int nelt;register int type;expptr lengp;{ftnint leng;chainp p, oldp;register struct addrblock *q;if(type==TYUNKNOWN || type==TYERROR)	fatal1("mktmpn: invalid type %d", type);if(type==TYCHAR)	if( ISICON(lengp) )		leng = lengp->const.ci;	else	{		err("adjustable length");		return( errnode() );		}for(oldp = &templist ; p = oldp->nextp ; oldp = p)	{	q = p->datap;	if(q->vtype==type && q->ntempelt==nelt &&	    (type!=TYCHAR || q->vleng->const.ci==leng) )		{		oldp->nextp = p->nextp;		free(p);		return(q);		}	}q = autovar(nelt, type, lengp);q->istemp = YES;return(q);}struct addrblock *mktemp(type, lengp)int type;expptr lengp;{return( mktmpn(1,type,lengp) );}/* VARIOUS ROUTINES FOR PROCESSING DECLARATIONS */struct extsym *comblock(len, s)register int len;register char *s;{struct extsym *mkext(), *p;if(len == 0)	{	s = BLANKCOMMON;	len = strlen(s);	}p = mkext( varunder(len, s) );if(p->extstg == STGUNKNOWN)	p->extstg = STGCOMMON;else if(p->extstg != STGCOMMON)	{	err1("%s cannot be a common block name", s);	return(0);	}return( p );}incomm(c, v)struct extsym *c;struct nameblock *v;{if(v->vstg != STGUNKNOWN)	dclerr("incompatible common declaration", v);else	{	v->vstg = STGCOMMON;	c->extp = hookup(c->extp, mkchain(v,NULL) );	}}settype(v, type, length)register struct nameblock * v;register int type;register int length;{if(type == TYUNKNOWN)	return;if(type==TYSUBR && v->vtype!=TYUNKNOWN && v->vstg==STGARG)	{	v->vtype = TYSUBR;	frexpr(v->vleng);	}else if(type < 0)	/* storage class set */	{	if(v->vstg == STGUNKNOWN)		v->vstg = - type;	else if(v->vstg != -type)		dclerr("incompatible storage declarations", v);	}else if(v->vtype == TYUNKNOWN)	{	if( (v->vtype = lengtype(type, length))==TYCHAR && length!=0)		v->vleng = ICON(length);	}else if(v->vtype!=type || (type==TYCHAR && v->vleng->const.ci!=length) )	dclerr("incompatible type declarations", v);}lengtype(type, length)register int type;register int length;{switch(type)	{	case TYREAL:		if(length == 8)			return(TYDREAL);		if(length == 4)			goto ret;		break;	case TYCOMPLEX:		if(length == 16)			return(TYDCOMPLEX);		if(length == 8)			goto ret;		break;	case TYSHORT:	case TYDREAL:	case TYDCOMPLEX:	case TYCHAR:	case TYUNKNOWN:	case TYSUBR:	case TYERROR:		goto ret;	case TYLOGICAL:		if(length == 4)			goto ret;		break;	case TYLONG:		if(length == 0)			return(tyint);		if(length == 2)			return(TYSHORT);		if(length == 4)			goto ret;		break;	default:		fatal1("lengtype: invalid type %d", type);	}if(length != 0)	err("incompatible type-length combination");ret:	return(type);}setintr(v)register struct nameblock * v;{register int k;if(v->vstg == STGUNKNOWN)	v->vstg = STGINTR;else if(v->vstg!=STGINTR)	dclerr("incompatible use of intrinsic function", v);if(v->vclass==CLUNKNOWN)	v->vclass = CLPROC;if(v->vprocclass == PUNKNOWN)	v->vprocclass = PINTRINSIC;else if(v->vprocclass != PINTRINSIC)	dclerr("invalid intrinsic declaration", v);if(k = intrfunct(v->varname))	v->vardesc.varno = k;else	dclerr("unknown intrinsic function", v);}setext(v)register struct nameblock * v;{if(v->vclass == CLUNKNOWN)	v->vclass = CLPROC;else if(v->vclass != CLPROC)	dclerr("invalid external declaration", v);if(v->vprocclass == PUNKNOWN)	v->vprocclass = PEXTERNAL;else if(v->vprocclass != PEXTERNAL)	dclerr("invalid external declaration", v);}/* create dimensions block for array variable */setbound(v, nd, dims)register struct nameblock * v;int nd;struct { expptr lb, ub; } dims[ ];{register expptr q, t;register struct dimblock *p;int i;if(v->vclass == CLUNKNOWN)	v->vclass = CLVAR;else if(v->vclass != CLVAR)	{	dclerr("only variables may be arrays", v);	return;	}v->vdim = p = (struct dimblock *) ckalloc( sizeof(int) + (3+2*nd)*sizeof(expptr) );p->ndim = nd;p->nelt = ICON(1);for(i=0 ; i<nd ; ++i)	{	if( (q = dims[i].ub) == NULL)		{		if(i == nd-1)			{			frexpr(p->nelt);			p->nelt = NULL;			}		else			err("only last bound may be asterisk");		p->dims[i].dimsize = ICON(1);;		p->dims[i].dimexpr = NULL;		}	else		{		if(dims[i].lb)			{			q = mkexpr(OPMINUS, q, cpexpr(dims[i].lb));			q = mkexpr(OPPLUS, q, ICON(1) );			}		if( ISCONST(q) )			{			p->dims[i].dimsize = q;			p->dims[i].dimexpr = NULL;			}		else	{			p->dims[i].dimsize = autovar(1, tyint, NULL);			p->dims[i].dimexpr = q;			}		if(p->nelt)			p->nelt = mkexpr(OPSTAR, p->nelt, cpexpr(p->dims[i].dimsize));		}	}q = dims[nd-1].lb;if(q == NULL)	q = ICON(1);for(i = nd-2 ; i>=0 ; --i)	{	t = dims[i].lb;	if(t == NULL)		t = ICON(1);	if(p->dims[i].dimsize)		q = mkexpr(OPPLUS, t, mkexpr(OPSTAR, cpexpr(p->dims[i].dimsize), q) );	}if( ISCONST(q) )	{	p->baseoffset = q;	p->basexpr = NULL;	}else	{	p->baseoffset = autovar(1, tyint, NULL);	p->basexpr = q;	}}

⌨️ 快捷键说明

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