|
|
1.1 ! root 1: #include "defs" ! 2: ! 3: ! 4: static char mess[ ] = "inconsistent attributes"; ! 5: ! 6: attatt(a1 , a2) ! 7: register struct atblock *a1, *a2; ! 8: { ! 9: #define MERGE1(x) {if(a1->x==0) a1->x = a2->x; else if(a2->x!=0 && a1->x!=a2->x) dclerr(mess,"x"+2); } ! 10: ! 11: MERGE1(attype); ! 12: MERGE1(attypep); ! 13: MERGE1(atprec); ! 14: MERGE1(atclass); ! 15: MERGE1(atext); ! 16: MERGE1(atcommon); ! 17: MERGE1(atdim); ! 18: ! 19: if(a1->atprec!=0 && (a1->attype==TYREAL || a1->attype==TYCOMPLEX) ) ! 20: a1->attype += (TYLREAL-TYREAL); ! 21: ! 22: cfree(a2); ! 23: } ! 24: ! 25: ! 26: ! 27: attvars(a , v) ! 28: register struct atblock * a; ! 29: register chainp v; ! 30: { ! 31: register chainp p; ! 32: ! 33: for(p=v; p!=0 ; p = p->nextp) ! 34: attvr1(a, p->datap); ! 35: ! 36: if(a->attype == TYFIELD) ! 37: cfree(a->attypep); ! 38: else if(a->attype == TYCHAR) ! 39: frexpr(a->attypep); ! 40: ! 41: cfree(a); ! 42: } ! 43: ! 44: #define MERGE(x,y) {if(v->y==0) v->y = a->x; else if(a->x!=0 && a->x!=v->y) dclerr(mess,"x"+2); } ! 45: ! 46: ! 47: ! 48: ! 49: ! 50: attvr1(a, v) ! 51: register struct atblock * a; ! 52: register struct varblock * v; ! 53: { ! 54: register chainp p; ! 55: ! 56: if(v->vdcldone) ! 57: { ! 58: dclerr("attempt to declare variable after use", v->sthead->namep); ! 59: return; ! 60: } ! 61: v->vdclstart = 1; ! 62: if(v->vclass == CLMOS) ! 63: dclerr("attempt to redefine structure member", v->sthead->namep); ! 64: if (v->vdim == 0) ! 65: v->vdim = a->atdim; ! 66: else if(!eqdim(a->atdim, v->vdim)) ! 67: dclerr("inconsistent dimensions", v->sthead->namep); ! 68: if(v->vprec == 0) ! 69: v->vprec = a->atprec; ! 70: ! 71: MERGE(attype,vtype); ! 72: ! 73: if(v->vtypep == 0) ! 74: { ! 75: if(a->attypep != 0) ! 76: if(a->attype == TYFIELD) ! 77: { ! 78: v->vtypep = ALLOC(fieldspec); ! 79: cpblock(a->attypep, v->vtypep, sizeof(struct fieldspec)); ! 80: } ! 81: else if(a->attype == TYCHAR) ! 82: v->vtypep = cpexpr(a->attypep); ! 83: else v->vtypep = a->attypep; ! 84: else if(a->attypep!=0 && a->attypep!=v->vtypep) ! 85: dclerr("inconsistent attributes", "typep"); ! 86: } ! 87: ! 88: if(v->vprec!=0 && (v->vtype==TYREAL || v->vtype==TYCOMPLEX) ) ! 89: v->vtype += (TYLREAL-TYREAL); ! 90: ! 91: if(a->atcommon) ! 92: if(v->vclass != 0) ! 93: dclerr("common variable already in common, argument list, or external", ! 94: v->sthead->namep); ! 95: else { ! 96: if(blklevel != a->atcommon->blklevel) ! 97: dclerr("inconsistent common block usage", ""); ! 98: for(p = &(a->atcommon->comchain) ; p->nextp!=0 ; p = p->nextp) ; ! 99: p->nextp = mkchain(v, PNULL); ! 100: } ! 101: ! 102: if(a->atext!=0 && v->vext==0) ! 103: { ! 104: v->vext = 1; ! 105: extname(v); ! 106: } ! 107: else if(a->atclass == CLVALUE) ! 108: if(v->vclass==CLARG || v->vclass==CLVALUE) ! 109: v->vclass = CLVALUE; ! 110: else dclerr("cannot value a non-argument variable",v->sthead->namep); ! 111: else MERGE(atclass,vclass); ! 112: if(v->vclass==CLCOMMON || v->vclass==CLVALUE || v->vclass==CLAUTO) ! 113: setvproc(v, PROCNO); ! 114: } ! 115: ! 116: ! 117: ! 118: ! 119: ! 120: eqdim(a,b) ! 121: register ptr a, b; ! 122: { ! 123: if(a==0 || b==0 || a==b) return(1); ! 124: ! 125: a = a->datap; ! 126: b = b->datap; ! 127: ! 128: while(a!=0 && b!=0) ! 129: { ! 130: if(!eqexpr(a->lowerb,b->lowerb) || !eqexpr(a->upperb,b->upperb)) ! 131: return(0); ! 132: ! 133: a = a->nextp; ! 134: b = b->nextp; ! 135: } ! 136: ! 137: return( a == b ); ! 138: } ! 139: ! 140: ! 141: eqexpr(a,b) ! 142: register ptr a, b; ! 143: { ! 144: if(a==b) return(1); ! 145: if(a==0 || b==0) return(0); ! 146: if(a->tag!=b->tag || a->subtype!=b->subtype) ! 147: return(0); ! 148: ! 149: switch(a->tag) ! 150: { ! 151: case TCONST: ! 152: return( equals(a->leftp, b->leftp) ); ! 153: ! 154: case TNAME: ! 155: return( a->sthead == b->sthead ); ! 156: ! 157: case TLIST: ! 158: a = a->leftp; ! 159: b = b->leftp; ! 160: ! 161: while(a!=0 && b!=0) ! 162: { ! 163: if(!eqexpr(a->datap,b->datap)) ! 164: return(0); ! 165: a = a->nextp; ! 166: b = b->nextp; ! 167: } ! 168: return( a == b ); ! 169: ! 170: case TAROP: ! 171: case TASGNOP: ! 172: case TLOGOP: ! 173: case TRELOP: ! 174: case TCALL: ! 175: case TREPOP: ! 176: return(eqexpr(a->leftp,b->leftp) && eqexpr(a->rightp,b->rightp)); ! 177: ! 178: case TNOTOP: ! 179: case TNEGOP: ! 180: return(eqexpr(a->leftp,b->leftp)); ! 181: ! 182: default: ! 183: badtag("eqexpr", a->tag); ! 184: } ! 185: /* NOTREACHED */ ! 186: } ! 187: ! 188: ! 189: ! 190: setimpl(type, c1, c2) ! 191: int type; ! 192: register int c1, c2; ! 193: { ! 194: register int i; ! 195: ! 196: if(c1<'a' || c2<c1 || c2>'z') ! 197: dclerr("bad implicit range", CNULL); ! 198: else if(type==TYUNDEFINED || type>TYLCOMPLEX) ! 199: dclerr("bad type in implicit statement", CNULL); ! 200: else ! 201: for(i = c1 ; i<=c2 ; ++i) ! 202: impltype[i-'a'] = type; ! 203: } ! 204: ! 205: doinits(p) ! 206: register ptr p; ! 207: { ! 208: register ptr q; ! 209: ! 210: for( ; p ; p = p->nextp) ! 211: if( (q = p->datap)->vinit) ! 212: { ! 213: mkinit(q, q->vinit); ! 214: q->vinit = 0; ! 215: } ! 216: } ! 217: ! 218: ! 219: ! 220: ! 221: mkinit(v, e) ! 222: register ptr v; ! 223: register ptr e; ! 224: { ! 225: if(v->vdcldone == 0) ! 226: dclit(v); ! 227: ! 228: swii(idfile); ! 229: ! 230: if(v->vtype!=TYCHAR && v->vtypep) ! 231: dclerr("structure initialization", v->sthead->namep); ! 232: else if(v->vdim==NULL || v->vsubs!=NULL) ! 233: { ! 234: if(e->tag==TLIST && (v->vtype==TYCOMPLEX || v->vtype==TYLCOMPLEX) ) ! 235: e = compconst(e); ! 236: valinit(v, e); ! 237: } ! 238: else ! 239: arrinit(v,e); ! 240: ! 241: swii(icfile); ! 242: ! 243: frexpr(e); ! 244: } ! 245: ! 246: ! 247: ! 248: ! 249: ! 250: valinit(v, e) ! 251: register ptr v; ! 252: register ptr e; ! 253: { ! 254: static char buf[4] = "1hX"; ! 255: int vt; ! 256: ! 257: vt = v->vtype; ! 258: /*check for special case of one-character initialization of ! 259: non-character datum ! 260: */ ! 261: if(vt==TYCHAR || e->vtype!=TYCHAR || !isconst(e) || strlen(e->leftp)!=1) ! 262: { ! 263: e = simple(RVAL, coerce(vt,e) ); ! 264: if(e->tag == TERROR) ! 265: return; ! 266: if( ! isconst(e) ) ! 267: { ! 268: dclerr("nonconstant initializer", v->sthead->namep); ! 269: return; ! 270: } ! 271: } ! 272: if(vt == TYCHAR) ! 273: { ! 274: charinit(v, e->leftp); ! 275: return; ! 276: } ! 277: prexpr( simple(LVAL,v) ); ! 278: putic(ICOP,OPSLASH); ! 279: if(e->vtype != TYCHAR) ! 280: prexpr(e); ! 281: else if(strlen(e->leftp) == 1) ! 282: { ! 283: buf[2] = e->leftp[0]; ! 284: putsii(ICCONST, buf); ! 285: } ! 286: else dclerr("character initialization of nonchar", v->sthead->namep); ! 287: putic(ICOP,OPSLASH); ! 288: putic(ICMARK,0); ! 289: } ! 290: ! 291: ! 292: ! 293: arrinit(v, e) ! 294: register ptr v; ! 295: register ptr e; ! 296: { ! 297: struct exprblock *listinit(), *firstelt(), *nextelt(); ! 298: ptr arrsize(); ! 299: ! 300: if(e->tag!=TLIST && e->tag!=TREPOP) ! 301: e = mknode(TREPOP, 0, arrsize(v), e); ! 302: if( listinit(v, firstelt(v), e) ) ! 303: warn("too few initializers"); ! 304: if(v->vsubs) ! 305: { ! 306: frexpr(v->vsubs); ! 307: v->vsubs = NULL; ! 308: } ! 309: } ! 310: ! 311: ! 312: ! 313: struct exprblock *listinit(v, subs, e) ! 314: register struct varblock *v; ! 315: struct exprblock *subs; ! 316: register ptr e; ! 317: { ! 318: struct varblock *vt; ! 319: register chainp p; ! 320: int n; ! 321: struct varblock *subscript(); ! 322: struct exprblock *nextelt(); ! 323: ! 324: switch(e->tag) ! 325: { ! 326: case TLIST: ! 327: for(p = e->leftp; p; p = p->nextp) ! 328: { ! 329: if(subs == NULL) ! 330: goto toomany; ! 331: subs = listinit(v, subs, p->datap); ! 332: } ! 333: return(subs); ! 334: ! 335: case TREPOP: ! 336: if( ! isicon(e->leftp, &n) ) ! 337: { ! 338: dclerr("nonconstant repetition factor"); ! 339: return(subs); ! 340: } ! 341: while(--n >= 0) ! 342: { ! 343: if(subs == NULL) ! 344: goto toomany; ! 345: subs = listinit(v, subs, e->rightp); ! 346: } ! 347: return(subs); ! 348: ! 349: default: ! 350: if(subs == NULL) ! 351: goto toomany; ! 352: vt = subscript(cpexpr(v), cpexpr(subs)); ! 353: valinit(vt, e); ! 354: frexpr(vt); ! 355: return( nextelt(v,subs) ); ! 356: ! 357: } ! 358: ! 359: toomany: ! 360: dclerr("too many initializers", NULL); ! 361: return(NULL); ! 362: } ! 363: ! 364: ! 365: ! 366: ! 367: charinit(v,e) ! 368: ptr v; ! 369: char *e; ! 370: { ! 371: register char *bp; ! 372: char buf[50]; ! 373: register int i, j; ! 374: int nwd, nch; ! 375: ! 376: v = cpexpr(v); ! 377: if(v->vsubs == 0) ! 378: v->vsubs = mknode(TLIST,0, mkchain(mkint(1),CHNULL), PNULL); ! 379: ! 380: nwd = ceil( nch = conval(v->vtypep) , tailor.ftnchwd); ! 381: sprintf(buf,"%dh", tailor.ftnchwd); ! 382: for(bp = buf ; *bp ; ++bp ) ! 383: ; ! 384: ! 385: ! 386: for(i = 0; i<nwd ; ++i) ! 387: { ! 388: if(i > 0) v->vsubs->leftp->datap = ! 389: mknode(TAROP,OPPLUS, v->vsubs->leftp->datap, mkint(1)); ! 390: prexpr( v = simple(LVAL,v) ); ! 391: ! 392: for(j = 0 ; j<tailor.ftnchwd && *e!='\0' && nch-->0 ; ) ! 393: bp[j++] = *e++; ! 394: while(j < tailor.ftnchwd) ! 395: { ! 396: bp[j++] = ' '; ! 397: nch--; ! 398: } ! 399: bp[j] = '\0'; ! 400: ! 401: putic(ICOP,OPSLASH); ! 402: putsii(ICCONST, buf); ! 403: putic(ICOP,OPSLASH); ! 404: putic(ICMARK,0); ! 405: } ! 406: ! 407: frexpr(v); ! 408: } ! 409: ! 410: ! 411: ! 412: ! 413: ! 414: ! 415: ! 416: struct exprblock *firstelt(v) ! 417: register struct varblock *v; ! 418: { ! 419: register struct dimblock *b; ! 420: register chainp s; ! 421: ptr t; ! 422: int junk; ! 423: ! 424: if(v->vdim==NULL || v->vsubs!=NULL) ! 425: fatal("firstelt: bad argument"); ! 426: s = NULL; ! 427: for(b = v->vdim->datap ; b; b = b->nextp) ! 428: { ! 429: t = (b->lowerb ? cpexpr(b->lowerb) : mkint(1) ); ! 430: s = hookup(s, mkchain(t,CHNULL) ); ! 431: if(!isicon(b->upperb,&junk) || (b->lowerb && !isicon(b->lowerb,&junk)) ) ! 432: dclerr("attempt to initialize adjustable array", ! 433: v->sthead->namep); ! 434: } ! 435: return( mknode(TLIST, 0, s, PNULL) ); ! 436: } ! 437: ! 438: ! 439: ! 440: ! 441: struct exprblock *nextelt(v,subs) ! 442: struct varblock *v; ! 443: struct exprblock *subs; ! 444: { ! 445: register struct dimblock *b; ! 446: register chainp *s; ! 447: int sv; ! 448: ! 449: if(v == NULL) ! 450: return(NULL); ! 451: ! 452: b = v->vdim->datap; ! 453: s = subs->leftp; ! 454: ! 455: while(b && s) ! 456: { ! 457: sv = conval(s->datap); ! 458: frexpr(s->datap); ! 459: if( sv < conval(b->upperb) ) ! 460: { ! 461: s->datap =mkint(sv+1); ! 462: return(subs); ! 463: } ! 464: s->datap = (b->lowerb ? cpexpr(b->lowerb) : mkint(1) ); ! 465: ! 466: b = b->nextp; ! 467: s = s->nextp; ! 468: } ! 469: ! 470: if(b || s) ! 471: fatal("nextelt: bad subscript count"); ! 472: return(NULL); ! 473: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.