memname(int stg, long mem) #endif { static char s[20]; switch(stg) { case STGCOMMON: case STGEXT: sprintf(s, "_%s", extsymtab[mem].cextname); break; case STGBSS: case STGINIT: sprintf(s, "v.%ld", mem); break; case STGCONST: sprintf(s, "L%ld", mem); break; case STGEQUIV: sprintf(s, "q.%ld", mem+eqvstart); break; default: badstg("memname", stg); } return(s); }
eqvcommon(struct Equivblock *p, int comno, ftnint comoffset) #endif { int ovarno; ftnint k, offq; register Namep np; register struct Eqvchain *q; if(comoffset + p->eqvbottom < 0) { errstr("attempt to extend common %s backward", extsymtab[comno].fextname); freqchain(p); return; } if( (k = comoffset + p->eqvtop) > extsymtab[comno].extleng) extsymtab[comno].extleng = k; for(q = p->equivs ; q ; q = q->eqvnextp) if(np = q->eqvitem.eqvname) { switch(np->vstg) { case STGUNKNOWN: case STGBSS: np->vstg = STGCOMMON; np->vcommequiv = 1; np->vardesc.varno = comno; /* np -> voffset will point to the base of the array */ np->voffset = comoffset - q->eqvoffset; break; case STGEQUIV: ovarno = np->vardesc.varno; /* offq will point to the current element, even if it's in an array */ offq = comoffset - q->eqvoffset - np->voffset; np->vstg = STGCOMMON; np->vcommequiv = 1; np->vardesc.varno = comno; /* np -> voffset will point to the base of the array */ np->voffset += offq; if(ovarno != (p - eqvclass)) eqvcommon(&eqvclass[ovarno], comno, offq); break; case STGCOMMON: if(comno != np->vardesc.varno || comoffset != np->voffset+q->eqvoffset) dclerr("inconsistent common usage", np); break; default: badstg("eqvcommon", np->vstg); } } freqchain(p); p->eqvbottom = p->eqvtop = 0; }