|
|
1.1 root 1: /*
2: * Memory initialization and allocation for the translator.
3: */
4:
5: #include "itran.h"
6: #include "sym.h"
7: #include "tree.h"
8: #include "../h/memsize.h"
9:
10: struct lentry **lhash; /* hash area for local table */
11: struct gentry **ghash; /* hash area for global table */
12: struct centry **chash; /* hash area for constant table */
13: struct ientry **ihash; /* hash area for identifier table */
14:
15: nodeptr tree; /* parse tree space */
16: nodeptr tend; /* end of parse tree space */
17: struct lentry *ltable; /* local table */
18: struct gentry *gtable; /* global table */
19: struct centry *ctable; /* constant table */
20: struct ientry *itable; /* identifier table */
21:
22: char *strings; /* string space */
23: char *send; /* end of string space */
24:
25: nodeptr tfree; /* free pointer for parse tree space */
26: struct lentry *lfree; /* free pointer for local table */
27: struct gentry *gfree; /* free pointer for global table */
28: struct centry *ctfree; /* free pointer to constant table */
29: struct ientry *ifree; /* free pointer for identifier table */
30: char *strfree; /* free pointer for string space */
31:
32: int tsize = TSize; /* initial size of parse tree space */
33: int lsize = LSize; /* initial size of local table */
34: int gsize = GSize; /* initial size of global table */
35: int csize = CSize; /* initial size of constant table */
36: int isize = ISize; /* initial size of identifier table */
37: int ssize = SSize; /* initial size of string space */
38: int lhsize = LhSize; /* initial size of local hash table */
39: int ghsize = GhSize; /* initial size of global hash table */
40: int chsize = ChSize; /* initial size of constant hash table */
41: int ihsize = IhSize; /* initial size of identifier hash table */
42: int lmask; /* mask for local table hash */
43: int gmask; /* mask for global table hash */
44: int cmask; /* mask for constant table hash */
45: int imask; /* mask for identifier table hash */
46:
47: int memsetd;
48:
49: /*
50: * meminit does per-file initialization of various data structures used
51: * by the translator.
52: */
53: meminit()
54: {
55: register *p;
56:
57: if (!memsetd)
58: memalloc(); /* allocate data regions for first file */
59: /*
60: * Reset the free pointer for each region.
61: */
62: lfree = ltable;
63: gfree = gtable;
64: ctfree = ctable;
65: ifree = itable;
66: strfree = strings;
67: tfree = tree;
68: /*
69: * Zero out the hash tables.
70: */
71: for (p = (int *)lhash; p < (int *)&lhash[lhsize]; p++)
72: *p = NULL;
73: for (p = (int *)ghash; p < (int *)&ghash[ghsize]; p++)
74: *p = NULL;
75: for (p = (int *)chash; p < (int *)&chash[chsize]; p++)
76: *p = NULL;
77: for (p = (int *)ihash; p < (int *)&ihash[ihsize]; p++)
78: *p = NULL;
79:
80: /*
81: * Vestigial structures - these flags are only incremented after
82: * a call to syserr. Idea was apparently to count number of
83: * entries in an overflowing table, but wasn't completely
84: * implemented.
85: */
86: alclflg = 0;
87: alcgflg = 0;
88: alccflg = 0;
89: }
90:
91: /*
92: * allocate gets n*size bytes of storage and returns a pointer to it.
93: */
94:
95: char *allocate(n, size)
96: int n, size;
97: {
98: #ifndef MSDOS
99: return (char *)malloc(n*size);
100: #else MSDOS
101: return (char *)calloc(n,size);
102: #endif MSDOS
103: }
104:
105: /*
106: * memalloc computes sizes of data regions needed by the translator
107: * obtains space for them, and initializes pointers to them
108: */
109:
110: memalloc()
111: {
112: register int i;
113: char *allocate();
114:
115: /*
116: * Round sizes of hash tables for locals, globals, constants, and
117: * identifiers to next larger power of two. The corresponding
118: * mask values are set to one less than the hash table size so that
119: * an integer value can be &'d with the mask to produce a hash value.
120: * (See [lgc]hasher in sym.h.)
121: */
122: for (i = 1; i < lhsize; i <<= 1) ;
123: lhsize = i;
124: lmask = i - 1;
125: for (i = 1; i < ghsize; i <<= 1) ;
126: ghsize = i;
127: gmask = i - 1;
128: for (i = 1; i < chsize; i <<= 1) ;
129: chsize = i;
130: cmask = i - 1;
131: for (i = 1; i < ihsize; i <<= 1) ;
132: ihsize = i;
133: imask = i - 1;
134:
135: /*
136: * Allocate the various data structures.
137: */
138: lhash = (struct lentry **) allocate(lhsize, sizeof(struct lentry *));
139: ghash = (struct gentry **) allocate(ghsize, sizeof(struct gentry *));
140: chash = (struct centry **) allocate(chsize, sizeof(struct centry *));
141: ihash = (struct ientry **) allocate(ihsize, sizeof(struct ientry *));
142: ltable = (struct lentry *) allocate(lsize, sizeof(struct lentry));
143: gtable = (struct gentry *) allocate(gsize, sizeof(struct gentry));
144: ctable = (struct centry *) allocate(csize, sizeof(struct centry));
145: itable = (struct ientry *) allocate(isize, sizeof(struct ientry));
146: tree = (nodeptr) allocate(tsize, sizeof(int));
147: strings = allocate(ssize, sizeof(char));
148: tend = (nodeptr)((int *)tree + tsize);
149: send = strings + ssize;
150: /*
151: * Check to see if there was enough memory. This assumes that the
152: * allocation for strings fails if any of the other allocations
153: * failed. Apparent bug - That assumption is not necessarily valid.
154: */
155: if (strings == NULL) {
156: fprintf(stderr, "Can't get enough memory\n");
157: exit(ErrorExit);
158: }
159:
160: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.