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