|
|
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.