ex_index() { struct item *p, *q; int i, j, f, n, lv; n = *pcp++; f = *pcp; p = sp[-1]; if(f == ASGN) { pcp++; if(p->type != LV) error("indexed assign value"); if(((struct nlist *)p)->use != DA) fetch1(); /* error("used before set"); */ q = ((struct nlist *)p)->itemp; } else q = fetch1(); if(q->rank != n) error("subscript C"); idx.rank = 0; for(i=0; i<n; i++) { p = sp[-i-2]; if(p->type == EL) { idx.dim[idx.rank++] = q->dim[i]; continue; } p = fetch(p); sp[-i-2] = p; for(j=0; j<p->rank; j++) idx.dim[idx.rank++] = p->dim[j]; } size(); if(f == ASGN) { p = fetch(sp[-n-2]); sp[-n-2] = p; if (p->size > 1) { if(idx.size != p->size) error("assign C"); f = 1; /* v[i] <- v */ } else { if (idx.size && !p->size) error("assign C"); /* Note -- for idx.size = 0, no assign occurs * anyway, so it is safe to set "datum" to 0 */ datum = p->size ? getdat(p) : 0; f = 2; /* v[i] <- s */ } ex_elid(); } else { p = newdat(q->type, idx.rank, idx.size); copy(IN, idx.dim, p->dim, idx.rank); *sp++ = p; f = 0; /* v[i] */ } bidx(q); index1(0, f); if(f == 0) { p = sp[-1]; sp--; for(i=0; i<=n; i++) pop(); *sp++ = p; } else { pop(); /* pop ELID */ sp--; /* skip over LV */ for(i=0; i<n; i++) pop(); } }
void ex_index() { struct item *p, *q; int i, j, f, n; n = *gsip->ptr++; f = *gsip->ptr; p = sp[-1]; if (f == ASGN) { gsip->ptr++; if (p->itemType != LV) error(ERR_value, "not a local variable"); if (((SymTabEntry*)p)->entryUse != DA) fetch1(); q = ((SymTabEntry*)p)->itemp; } else q = fetch1(); if (q->rank != n) error(ERR_index, ""); idx.rank = 0; for (i = 0; i < n; i++) { p = sp[-i - 2]; if (p->itemType == EL) { idx.dim[idx.rank++] = q->dim[i]; continue; } p = fetch(p); sp[-i - 2] = p; for (j = 0; j < p->rank; j++) idx.dim[idx.rank++] = p->dim[j]; } size(); if (f == ASGN) { p = fetch(sp[-n - 2]); sp[-n - 2] = p; if (p->size > 1) { if (idx.size != p->size) error(ERR_length, ""); f = 1; /* v[i] <- v */ } else { if (idx.size && !p->size) error(ERR_length, ""); /* Note -- for idx.size = 0, no assign occurs * anyway, so it is safe to set "datum" to 0 */ datum = p->size ? getdat(p) : 0; f = 2; /* v[i] <- s */ } ex_elid(); } else { p = newdat(q->itemType, idx.rank, idx.size); copy(IN, (char*)idx.dim, (char*)p->dim, idx.rank); *sp++ = p; f = 0; /* v[i] */ } bidx(q); index1(0, f); if (f == 0) { p = sp[-1]; sp--; for (i = 0; i <= n; i++) pop(); *sp++ = p; } else { pop(); /* pop ELID */ sp--; /* skip over LV */ for (i = 0; i < n; i++) pop(); } }