|
|
1.1 root 1: #include "asm.h"
2:
3: /*
4: * This routine is called early in the
5: * game to set up the hashtable. First all
6: * buckets in the table are cleared.
7: * Then a pass is made through the builtin
8: * symbols, linking them into their hash
9: * buckets.
10: */
11: syminit()
12: {
13: register struct sym *sp;
14: struct sym **spp;
15: int ht;
16: register char *p1;
17: register nc;
18:
19: spp = &symhash[0];
20: while (spp < &symhash[NHASH])
21: *spp++ = NULL;
22: sp = &sym[0];
23: for (;;) {
24: ht = 0;
25: nc = NCPLN;
26: p1 = sp->s_id;
27: do {
28: ht += *p1++;
29: } while (--nc);
30: sp->s_total = ht;
31: ht &= HMASK;
32: sp->s_sp = symhash[ht];
33: symhash[ht] = sp;
34: if ((sp->s_flag&S_END) != 0)
35: break;
36: ++sp;
37: }
38: }
39:
40: /*
41: * Mark all symbols of type `S_NEW'
42: * global. Called at the end of pass
43: * 0 if `-g'.
44: */
45: symglob()
46: {
47: register struct sym *sp;
48: register i;
49:
50: for (i=0; i<NHASH; ++i) {
51: sp = symhash[i];
52: while (sp != NULL) {
53: if (sp->s_kind == S_NEW)
54: sp->s_flag |= S_GBL;
55: sp = sp->s_sp;
56: }
57: }
58: }
59:
60:
61: /*
62: * Allocate a block of space.
63: * Leave if there is no space left
64: * at all.
65: */
66: char *
67: new(n)
68: {
69: register char *p;
70:
71: if ((p = malloc(n)) == NULL) {
72: fprintf(stderr, "Out of space.\n");
73: exit(1);
74: }
75: return (p);
76: }
77:
78: /*
79: * Copy a name.
80: */
81: symcopy(p1, p2)
82: register char *p1, *p2;
83: {
84: register n;
85:
86: n = NCPLN;
87: do {
88: *p1++ = *p2++;
89: } while (--n);
90: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.