📄 proc.c
字号:
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 + -