|
|
1.1 root 1: /*
2: * Copyright (c) 1982 Regents of the University of California
3: * @(#)assyms.h 4.5 6/30/83
4: */
5: /*
6: * To speed up walks through symbols defined in a particular
7: * segment, we buil up a table of pointers into the symbol table
8: * and a table of delimiters for each segment. The delimiter for
9: * the particular segment points to the first word in that segment.
10: */
11:
12: extern struct symtab **symptrs; /*dynamically allocated*/
13: extern struct symtab **symdelim[NLOC + NLOC + 1];
14: extern struct symtab **symptrub;
15: extern int nsyms; /*number in the symbol table*/
16: extern int njxxx; /*the number of jxxx entries in the table*/
17: extern int nforgotten; /*how many entries erroneously entered*/
18: extern int nlabels; /*how many labels in the symbol table*/
19: extern int hshused; /*how many hash slots used*/
20:
21: #define SEGITERATE(segno, start, end, copointer, walkpointer, ubpointer, direction) \
22: for(copointer = start == 0? symdelim[segno]:start,\
23: ubpointer = end == 0 ? *symdelim[segno+1] : *(symdelim[segno]-1),\
24: walkpointer = *copointer;\
25: walkpointer != ubpointer;\
26: walkpointer = * direction copointer)
27:
28: #define SYMITERATE(copointer, walkpointer) \
29: for(copointer = symptrs, \
30: walkpointer = *copointer; \
31: copointer < symptrub; \
32: walkpointer = * ++ copointer)
33: /*
34: * Symbols are allocated in non contiguous chunks by extending
35: * the data area.
36: */
37:
38: #define SYMDALLOP 200
39: struct allocbox{
40: struct allocbox *nextalloc;
41: struct symtab symslots[SYMDALLOP];
42: };
43:
44: /*
45: * Names are allocated in a dynamically extensible string pool.
46: */
47: struct strpool{
48: struct strpool *str_next;
49: int str_nalloc;
50: char str_names[STRPOOLDALLOP];
51: };
52:
53: extern struct strpool *strplhead;
54:
55: extern struct allocbox *allochead;
56: extern struct allocbox *alloctail;
57: extern struct symtab *nextsym;
58: extern struct allocbox *newbox;
59: extern char *namebuffer;
60: extern int symsleft;
61:
62: #define ALLOCQTY sizeof (struct allocbox)
63: /*
64: * Iterate through all symbols in the symbol table in declaration
65: * order
66: */
67: #define DECLITERATE(allocwalk, walkpointer, ubpointer) \
68: for(allocwalk = allochead; \
69: allocwalk != 0; \
70: allocwalk = allocwalk->nextalloc) \
71: for (walkpointer = &allocwalk->symslots[0],\
72: ubpointer = &allocwalk->symslots[SYMDALLOP], \
73: ubpointer = ubpointer > ( (struct symtab *)alloctail) \
74: ? nextsym : ubpointer ;\
75: walkpointer < ubpointer; \
76: walkpointer++ )
77: /*
78: * The hash table is segmented, and dynamically extendable.
79: * We have a linked list of hash table segments; within each
80: * segment we use a quadratic rehash that touches no more than 1/2
81: * of the buckets in the hash table when probing.
82: * If the probe does not find the desired symbol, it moves to the
83: * next segment, or allocates a new segment.
84: *
85: * Hash table segments are kept on the linked list with the first
86: * segment always first (that contains the reserved words) and
87: * the last added segment immediately after the first segment
88: * to hopefully gain something by locality of reference.
89: */
90: struct hashdallop {
91: int h_nused;
92: struct hashdallop *h_next;
93: struct symtab *h_htab[NHASH];
94: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.