|
|
1.1 root 1: /* Copyright Bell Telephone Laboratories Whippany, N.J.
2:
3: * /////////////////////////////////////
4: * /////////////////////////////////////
5: * //////////// variable.c /////////////
6: * /// J. P. Hawkins WH X4610 8C-001 ///
7: * ///// Fri Aug 24 17:00:44 1979 //////
8: * /////////////////////////////////////
9: * /////////////////////////////////////
10:
11: *
12: * Variable Allocation and Fetch routines
13: * For BITE
14: *
15: */
16: /* "@(#) variable.c: V 1.2 3/4/81" */
17: #include "bas.h"
18: union VARIABLE varbyts;
19: /*
20: * this is the symbol table (table of pointers) for numerical
21: * variables. The first subscript 'j' is calculated by the
22: * alpha name, the second subscript 'k' is calculated by the
23: * numeric part + 1. If no numeric is specified, k = 0
24: */
25: char *hicore; /* pointer lowest used corespace from
26: top of user area */
27:
28:
29: /*
30: * //////// FETCH VALUE OF VARIABLE ////////
31: *
32: * calling format:
33: *
34: * getvar(vstr, &value);
35: *
36: * where: vstr = string containing VALID variable name
37: * i.e. [a-z] or a[0-9] - z[0-9]
38: * float value = where actual value is returned to
39: */
40: getvar(vstr,valptr)
41: char vstr[];
42: double *valptr;
43: {
44: int j,k; /* symbol table indicies */
45: register char i; /* index to float bytes */
46: register char *ptr; /* pointer register used to copy bytes */
47:
48: j = vstr[0] - 'a'; /* compute j subscript */
49:
50: /*
51: * compute k subscript
52: */
53: if(vstr[1] == '\0') /* if no numeric part */
54: k = 0; /* then k = 0th column */
55: else
56: k = vstr[1] - '0' + 1; /* use numeric + 1th column */
57:
58: if(symtab[j][k] == 0) /*if no pointer for this variable */
59: /* (not allocated, yet) */
60: {
61: error2(inst.thing.linno,7,' '); /* UNNASSIGNED VARIABLE */
62: printf("- '%s'\n",vstr); /* print variable name */
63: *valptr = 0.0; /* return zero anyway */
64: return(-1);
65: }
66: else
67: {
68: ptr = symtab[j][k]; /* set byte copy ptr to data location */
69:
70: for(i=PREC-1; i >= 0; --i) /* copy the float byte-by byte */
71: varbyts.var4th[i] = *--ptr;
72:
73: *valptr = varbyts.var; /* now pass the value back to
74: the calling routine */
75: }
76: return(0);
77: }
78: /*
79: *
80: * //// ASSIGN A VALUE TO A VARIABLE ////
81: * /////// ALLOCATE SPACE IF NEC. ///////
82: *
83: * put the value into the allocated location.
84: * allocate a location if not already allocated
85: * calling format:
86: *
87: * putvar(vstr, value);
88: *
89: * where: vstr = string pointer to VALID variable name
90: * value = value to be assigned
91: */
92: putvar(vstr,value)
93: char vstr[]; /* valid variable string (name) */
94: double value; /* value to be assigned */
95: {
96: register char *ptr; /* pointer register used to copy bytes */
97: register char i; /* index to float bytes */
98: int j,k; /* symbol table indicies */
99:
100: j = vstr[0] - 'a'; /* compute j subscript */
101:
102: /*
103: * compute k subscript
104: */
105: if(vstr[1] == '\0') /* if no numeric part */
106: k = 0; /* then k = 0th column */
107: else
108: k = vstr[1] - '0' + 1;
109:
110: varbyts.var = value; /* stuff the float number (2 words)
111: in the float template to be copied
112: into data area byte-by-byte */
113: if(symtab[j][k] == 0) /* if no space yet allocated */
114: alloc(&symtab[j][k], PREC); /* then allocate space and
115: return pointer to symbol tab */
116: ptr = symtab[j][k]; /* set copy register to data address */
117:
118: for(i=PREC-1; i>=0; --i) /* copy into storage byte-by-byte */
119: *--ptr = varbyts.var4th[i];
120: }
121: /*
122: *
123: * //// INITIALIZE VARIABLES ////
124: */
125: initvar()
126: {
127: extern char txtbuf[];
128: hicore = &txtbuf[PGSIZ*NMPAG]; /* init pointer to top of user
129: data space */
130: }
131: /*
132: *
133: * //// ALLOCATE STORAGE FOR SPECIFIED BYTES ////
134: * return starting address of allocated space
135: *
136: * The data area is a TOP-DOWN allocation technique which follows
137: * rules that are inverse to BOTTOM-UP allocation or storage.
138: * The address of a datum is actually the address of the next higher
139: * core byte. When data is retrieved or stored, a pointer to that address
140: * is obtained, then each byte is retrieved or stored by first
141: * decrementing the pointer, THEN retrieving or inserting the byte in
142: * quiestion. Unlike bottom-up storage, the beginning of the area
143: * is always one address above-it and the end of the area is the last
144: * byte stored.
145: * In a bottom-up storage the beginning of data IS the first byte
146: * and the end of the area or piece of data or entire data area is
147: * AFTER the end of the data area or datum.
148: * These rules are consistant with the hardware of the PDP-11
149: * albeit auto-increment/decrement data retrieval and takes maximum
150: * advantage of the harware, thus producing the least amount of code.
151: *
152: * If these rules are adhered to at all times, there will be no error
153: * in data storage or retrieval.
154: *
155: * In light of the above, the value 'hicore' reflects the last byte
156: * occupied by the top-down storage area/txtbuf/stack or whatever.
157: */
158: alloc(datadr, numbyts)
159: char **datadr; /* pointer to symbol table entry */
160: int numbyts; /* number of bytes to be allocated */
161: {
162: *datadr = hicore; /* set symtab entry to loc of data */
163: hicore -= numbyts; /* bump down pointer to point to
164: lowest occupied data space */
165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.