|
|
1.1 ! root 1: #include "defs" ! 2: ! 3: struct varblock *subscript(v,s) ! 4: register ptr v,s; ! 5: { ! 6: ptr p; ! 7: register ptr q; ! 8: ptr bounds, subs; ! 9: int size, align, mask; ! 10: ! 11: if(v->tag == TERROR) ! 12: goto ret; ! 13: if(v->tag!=TNAME && v->tag!=TTEMP) ! 14: badtag("subscript", v->tag); ! 15: if(s->tag == TERROR) ! 16: { ! 17: v->vsubs = 0; ! 18: goto ret; ! 19: } ! 20: ! 21: if(s->tag != TLIST) ! 22: badtag("subscript", s->tag); ! 23: sizalign(v, &size, &align, &mask); ! 24: if(bounds = v->vdim) ! 25: bounds = bounds->datap; ! 26: subs = s->leftp; ! 27: ! 28: while ( bounds && subs) ! 29: { ! 30: if(bounds->lowerb) ! 31: { ! 32: p = mknode(TAROP,OPMINUS,mkint(1),cpexpr(bounds->lowerb)); ! 33: subs->datap = mknode(TAROP,OPPLUS, subs->datap, p); ! 34: } ! 35: bounds = bounds->nextp; ! 36: subs = subs->nextp; ! 37: } ! 38: v->vdim = 0; ! 39: if(bounds || subs) ! 40: { ! 41: exprerr("subscript and bounds of different length", CNULL); ! 42: v->vsubs = 0; ! 43: goto ret; ! 44: } ! 45: ! 46: if(v->vsubs) ! 47: { /* special case of subscripted type element */ ! 48: if(s->leftp==0 || ((struct dimblock *)(s->leftp))->nextp!=0) ! 49: { ! 50: exprerr("not exactly one subscript on type member", CNULL); ! 51: v->vsubs = 0; ! 52: goto ret; ! 53: } ! 54: q = mknode(TAROP,OPMINUS,((struct chain *)(s->leftp))->datap, mkint(1) ); ! 55: q = mknode(TAROP,OPSTAR, mkint(size), q); ! 56: if(v->voffset) ! 57: v->voffset = mknode(TAROP,OPPLUS,v->voffset, q); ! 58: else v->voffset = q; ! 59: goto ret; ! 60: } ! 61: ! 62: v->vsubs = s; ! 63: ! 64: if(v->vtype==TYCHAR || v->vtype==TYSTRUCT || ! 65: (v->vtype==TYLCOMPLEX && tailor.lngcxtype==NULL) ) ! 66: { /* add an initial unit subscript */ ! 67: s->leftp = (int *)mkchain(mkint(1), s->leftp); ! 68: } ! 69: ! 70: else { /* add to offset, set first subscript to 1 */ ! 71: q = mknode(TAROP,OPMINUS,((struct chain *)(s->leftp))->datap, mkint(1) ); ! 72: q = mknode(TAROP,OPSTAR, mkint(size), q); ! 73: if(v->voffset) ! 74: v->voffset = mknode(TAROP,OPPLUS,v->voffset, q); ! 75: else v->voffset = q; ! 76: ! 77: ((struct chain *)(s->leftp))->datap = (int *)mkint(1); ! 78: } ! 79: ret: ! 80: return((struct varblock *)v); ! 81: } ! 82: ! 83: ! 84: ! 85: ! 86: ! 87: ptr strucelt(var, subelt) ! 88: register ptr var; ! 89: ptr subelt; ! 90: { ! 91: register ptr p, q; ! 92: ! 93: if(var->tag == TERROR) ! 94: return(var); ! 95: if(var->vtype!=TYSTRUCT || var->vtypep==0 || var->vdim!=0) ! 96: { ! 97: exprerr("attempt to find a member in an array or non-structure", CNULL); ! 98: return(errnode()); ! 99: } ! 100: if(subelt->tag == TLABEL) ! 101: { ! 102: exprerr("attempt to use label name as structure member", CNULL); ! 103: return(errnode()); ! 104: } ! 105: for(p = ((struct typeblock *)var->vtypep)->strdesc ; p ; p = p->nextp) ! 106: if(subelt == ((struct defblock *)p->datap)->sthead) break; ! 107: if(p == 0) ! 108: { ! 109: exprerr("%s is not in structure\n", subelt->namep); ! 110: return(errnode()); ! 111: } ! 112: q = p->datap; ! 113: var->vdim = q->vdim; ! 114: var->vtypep = q->vtypep; ! 115: if(q->voffset) ! 116: if(var->voffset) ! 117: var->voffset = mknode(TAROP,OPPLUS,var->voffset,cpexpr(q->voffset)); ! 118: else { ! 119: var->voffset = cpexpr(q->voffset); ! 120: } ! 121: if( (var->vtype = q->vtype) != TYSTRUCT) ! 122: convtype(var); ! 123: return(var); ! 124: } ! 125: ! 126: ! 127: ! 128: convtype(p) ! 129: register ptr p; ! 130: { ! 131: register int i, k; ! 132: ptr mksub1(); ! 133: ! 134: switch(p->vtype) ! 135: { ! 136: case TYFIELD: ! 137: case TYINT: ! 138: case TYCHAR: ! 139: case TYREAL: ! 140: case TYLREAL: ! 141: case TYCOMPLEX: ! 142: case TYLOG: ! 143: k = eflftn[p->vtype]; ! 144: break; ! 145: ! 146: default: ! 147: fatal("convtype: impossible type"); ! 148: } ! 149: ! 150: for(i=0; i<NFTNTYPES; ++i) ! 151: if(i != k) p->vbase[i] = 0; ! 152: else if(p->vbase[i]==0) ! 153: { ! 154: exprerr("illegal combination of array and dot",CNULL); ! 155: mvexpr(errnode(), p); ! 156: return; ! 157: } ! 158: ! 159: if(p->vsubs == 0) ! 160: p->vsubs = mksub1(); ! 161: ! 162: } ! 163: ! 164: ! 165: ! 166: fixsubs(p) ! 167: register ptr p; ! 168: { ! 169: ptr q, *firstsub; ! 170: int size,align,mask; ! 171: ! 172: if(p->voffset) ! 173: { ! 174: firstsub = &(((struct chain *)(((struct exprblock *)p->vsubs)->leftp))->datap); ! 175: sizalign(p, &size,&align,&mask); ! 176: if(p->vtype == TYCHAR) ! 177: size = tailor.ftnsize[FTNINT]; ! 178: ! 179: q = mknode(TAROP,OPSLASH,p->voffset,mkint(size)); ! 180: *firstsub = mknode(TAROP,OPPLUS, q, *firstsub); ! 181: p->voffset = 0; ! 182: } ! 183: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.