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

📄 data.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#include "defs"/* ROUTINES CALLED DURING DATA STATEMENT PROCESSING */static char datafmt[] = "%s\t%05ld\t%05ld\t%d" ;/* another initializer, called from parser */dataval(repp, valp)register struct constblock *repp, *valp;{int i, nrep;ftnint elen, vlen;register struct addrblock *p;struct addrblock *nextdata();if(repp == NULL)	nrep = 1;else if (ISICON(repp) && repp->const.ci >= 0)	nrep = repp->const.ci;else	{	err("invalid repetition count in DATA statement");	frexpr(repp);	goto ret;	}frexpr(repp);if( ! ISCONST(valp) )	{	err("non-constant initializer");	goto ret;	}if(toomanyinit) goto ret;for(i = 0 ; i < nrep ; ++i)	{	p = nextdata(&elen, &vlen);	if(p == NULL)		{		err("too many initializers");		toomanyinit = YES;		goto ret;		}	setdata(p, valp, elen, vlen);	frexpr(p);	}ret:	frexpr(valp);}struct addrblock *nextdata(elenp, vlenp)ftnint *elenp, *vlenp;{register struct impldoblock *ip;struct primblock *pp;register struct nameblock *np;register struct rplblock *rp;tagptr p;expptr neltp;register expptr q;int skip;ftnint off;struct constblock *mkintcon();while(curdtp)	{	p = curdtp->datap;	if(p->tag == TIMPLDO)		{		ip = p;		if(ip->implb==NULL || ip->impub==NULL || ip->varnp==NULL)			fatal1("bad impldoblock 0%o", ip);		if(ip->isactive)			ip->varvp->const.ci += ip->impdiff;		else			{			q = fixtype(cpexpr(ip->implb));			if( ! ISICON(q) )				goto doerr;			ip->varvp = q;			if(ip->impstep)				{				q = fixtype(cpexpr(ip->impstep));				if( ! ISICON(q) )					goto doerr;				ip->impdiff = q->const.ci;				frexpr(q);				}			else				ip->impdiff = 1;			q = fixtype(cpexpr(ip->impub));			if(! ISICON(q))				goto doerr;			ip->implim = q->const.ci;			frexpr(q);			ip->isactive = YES;			rp = ALLOC(rplblock);			rp->nextp = rpllist;			rpllist = rp;			rp->rplnp = ip->varnp;			rp->rplvp = ip->varvp;			rp->rpltag = TCONST;			}		if( (ip->impdiff>0 && (ip->varvp->const.ci <= ip->implim))		 || (ip->impdiff<0 && (ip->varvp->const.ci >= ip->implim)) )			{ /* start new loop */			curdtp = ip->datalist;			goto next;			}		/* clean up loop */		popstack(&rpllist);		frexpr(ip->varvp);		ip->isactive = NO;		curdtp = curdtp->nextp;		goto next;		}	pp = p;	np = pp->namep;	skip = YES;	if(p->argsp==NULL && np->vdim!=NULL)		{   /* array initialization */		q = mkaddr(np);		off = typesize[np->vtype] * curdtelt;		if(np->vtype == TYCHAR)			off *= np->vleng->const.ci;		q->memoffset = mkexpr(OPPLUS, q->memoffset, mkintcon(off) );		if( (neltp = np->vdim->nelt) && ISCONST(neltp))			{			if(++curdtelt < neltp->const.ci)				skip = NO;			}		else			err("attempt to initialize adjustable array");		}	else		q = mklhs( cpexpr(pp) );	if(skip)		{		curdtp = curdtp->nextp;		curdtelt = 0;		}	if(q->vtype == TYCHAR)		if(ISICON(q->vleng))			*elenp = q->vleng->const.ci;		else	{			err("initialization of string of nonconstant length");			continue;			}	else	*elenp = typesize[q->vtype];	if(np->vstg == STGCOMMON)		*vlenp = extsymtab[np->vardesc.varno].maxleng;	else if(np->vstg == STGEQUIV)		*vlenp = eqvclass[np->vardesc.varno].eqvleng;	else	{		*vlenp =  (np->vtype==TYCHAR ?				np->vleng->const.ci : typesize[np->vtype]);		if(np->vdim)			*vlenp *= np->vdim->nelt->const.ci;		}	return(q);doerr:		err("nonconstant implied DO parameter");		frexpr(q);		curdtp = curdtp->nextp;next:	curdtelt = 0;	}return(NULL);}LOCAL setdata(varp, valp, elen, vlen)struct addrblock *varp;ftnint elen, vlen;struct constblock *valp;{union constant con;int i, k;int stg, type, valtype;ftnint offset;register char *s, *t;char *memname();static char varname[XL+2];/* output form of name is padded with blanks and preceded   with a storage class digit*/stg = varp->vstg;varname[0] = (stg==STGCOMMON ? '2' : (stg==STGEQUIV ? '1' : '0') );s = memname(stg, varp->memno);for(t = varname+1 ; *s ; )	*t++ = *s++;while(t < varname+XL+1)	*t++ = ' ';varname[XL+1] = '\0';offset = varp->memoffset->const.ci;type = varp->vtype;valtype = valp->vtype;if(type!=TYCHAR && valtype==TYCHAR)	{	if(! ftn66flag)		warn("non-character datum initialized with character string");	varp->vleng = ICON(typesize[type]);	varp->vtype = type = TYCHAR;	}else if( (type==TYCHAR && valtype!=TYCHAR) ||	 (cktype(OPASSIGN,type,valtype) == TYERROR) )	{	err("incompatible types in initialization");	return;	}if(type != TYCHAR)	if(valtype == TYUNKNOWN)		con.ci = valp->const.ci;	else	consconv(type, &con, valtype, &valp->const);k = 1;switch(type)	{	case TYLOGICAL:		type = tylogical;	case TYSHORT:	case TYLONG:		fprintf(initfile, datafmt, varname, offset, vlen, type);		prconi(initfile, type, con.ci);		break;	case TYCOMPLEX:		k = 2;		type = TYREAL;	case TYREAL:		goto flpt;	case TYDCOMPLEX:		k = 2;		type = TYDREAL;	case TYDREAL:	flpt:		for(i = 0 ; i < k ; ++i)			{			fprintf(initfile, datafmt, varname, offset, vlen, type);			prconr(initfile, type, con.cd[i]);			offset += typesize[type];			}		break;	case TYCHAR:		k = valp->vleng->const.ci;		if(elen < k)			k = elen;		for(i = 0 ; i < k ; ++i)			{			fprintf(initfile, datafmt, varname, offset++, vlen, TYCHAR);			fprintf(initfile, "\t%d\n", valp->const.ccp[i]);			}		k = elen - valp->vleng->const.ci;		while( k-- > 0)			{			fprintf(initfile, datafmt, varname, offset++, vlen, TYCHAR);			fprintf(initfile, "\t%d\n", ' ');			}		break;	default:		fatal1("setdata: impossible type %d", type);	}}frdata(p0)chainp p0;{register chainp p;register tagptr q;for(p = p0 ; p ; p = p->nextp)	{	q = p->datap;	if(q->tag == TIMPLDO)		{		if(q->isbusy)			return;	/* circular chain completed */		q->isbusy = YES;		frdata(q->datalist);		free(q);		}	else		frexpr(q);	}frchain( &p0);}

⌨️ 快捷键说明

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