|
|
1.1 ! root 1: /* Copyright Bell Telephone Laboratories Whippany, N.J. ! 2: ! 3: * ///////////////////////////////////// ! 4: * ///////////////////////////////////// ! 5: * ////////////// avars.c ////////////// ! 6: * /// J. P. Hawkins WH X4610 8C-001 /// ! 7: * ///// Fri Aug 24 17:11:02 1979 ////// ! 8: * ///////////////////////////////////// ! 9: * ///////////////////////////////////// ! 10: ! 11: * ! 12: * Process ARRAY (subscripted) VARABLES ! 13: * STORAGE & FETCH ROUTINES ! 14: */ ! 15: /* "@(#) avars.c: V 1.2 3/4/81" */ ! 16: #include "bas.h" ! 17: char * asymtab[26][11]; /* symbol table */ ! 18: /* ! 19: * STORE ARRAY VARIABLE ! 20: */ ! 21: aputvar(vstr, value) ! 22: char vstr[]; ! 23: double value; ! 24: { ! 25: char *addr; /* address of data */ ! 26: char *putflot(); ! 27: ! 28: if(getaddr(vstr, &addr) < 0) ! 29: return(-1); ! 30: ! 31: putflot(value, addr); /* store the number in the array location */ ! 32: return(0); ! 33: } ! 34: ! 35: /* ! 36: * FETCH ARRAY VARIABLE ! 37: */ ! 38: agetvar(vstr, value) ! 39: char vstr[]; ! 40: double *value; ! 41: { ! 42: char * addr; ! 43: char *getflot(); ! 44: ! 45: if(getaddr(vstr, &addr) < 0) ! 46: return(-1); ! 47: ! 48: getflot(value, addr); ! 49: return(0); ! 50: } ! 51: /* ! 52: * ! 53: * ////// CALCULATE ARRAY VARIABLE ADDRESS ////// ! 54: * ! 55: * ! 56: */ ! 57: getaddr(vstr, addr) ! 58: char vstr[]; /* subscripted variable string */ ! 59: char **addr; /* addres of subscripted variable */ ! 60: { ! 61: char arname[3]; /* array name */ ! 62: char *ptr; /* location pointer */ ! 63: char *getflot(),*putflot(); ! 64: int offset; /* offset to data point */ ! 65: int asize; /* actual number of dims stored */ ! 66: double dasize; /* actual number of dims stored */ ! 67: double rsize; /* number of dims in request */ ! 68: double adims[MAXDIM]; /* actual dims */ ! 69: double rdims[MAXDIM]; /* requested dims */ ! 70: double acons[MAXDIM-1]; /* actual constants */ ! 71: register i; /* counter */ ! 72: int j,k; ! 73: int amax; /* integer form of size */ ! 74: ! 75: /* ! 76: * GET REQUESTED PARAMS ! 77: */ ! 78: if(getdims(vstr, arname, &rsize, rdims) < 0) ! 79: return(-1); /* error in spec */ ! 80: ! 81: j = arname[0] - 'a'; ! 82: /* ! 83: * compute k subscript ! 84: */ ! 85: if(arname[1] == '\0') ! 86: k = 0; ! 87: else ! 88: k = arname [1] - '0' + 1; ! 89: ! 90: if(asymtab[j][k] == 0) /* If not dimensioned, complain */ ! 91: { ! 92: error(inst.thing.linno, 25); /* NOT DIMENSIONED */ ! 93: return(-1); ! 94: } ! 95: ! 96: ptr = asymtab[j][k]; /* get pointer to header */ ! 97: ptr = getflot(&dasize, ptr); /* get actual size */ ! 98: ! 99: if(dasize != rsize) /* error if mismatch in actual to ! 100: requested size */ ! 101: { ! 102: error(inst.thing.linno, 26); /* WRONG NUMBER OF DIMS */ ! 103: return(-1); ! 104: } ! 105: amax = asize = dasize; /* convert size to integer */ ! 106: for(i=0; i<amax; i++) ! 107: { ! 108: ptr = getflot(&adims[i], ptr); ! 109: if((rdims[i] ) > adims[i]) /* make spec start with 1 */ ! 110: { ! 111: error(inst.thing.linno, 27); /* DIM LARGER THAN ACTUAL */ ! 112: return(-1); ! 113: } ! 114: rdims[i] -= 1; /* actual number used starts at 0 */ ! 115: } ! 116: /* ! 117: * GET CONSTANTS ! 118: */ ! 119: for(i=0; i<(amax-1); i++) ! 120: ptr = getflot(&acons[i], ptr); ! 121: acons[i] = 0.0; /* null terminate */ ! 122: ! 123: /* ! 124: * CALCULATE BYTE OFFSET IN A POSITIVE SENSE ! 125: */ ! 126: for(i=0, offset = 0; acons[i] != 0.0; i++) ! 127: { ! 128: offset += acons[i] * rdims[i]; ! 129: } ! 130: offset += rdims[i] + 2 * asize; ! 131: offset *= PREC; ! 132: *addr = asymtab[j][k] - offset; ! 133: return(0); ! 134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.