Commit | Line | Data |
---|---|---|
f70ab843 RH |
1 | /* |
2 | * Copyright (c) 1982 Regents of the University of California | |
3 | * @(#)assyms.h 4.3 %G% | |
4 | */ | |
7c81b4f2 BJ |
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. This way, it is extremely easy to | |
36 | * allow virtual memory temporary files, change the length | |
37 | * of NCPS, and allows for a much more flexible storage | |
38 | * allocation | |
39 | */ | |
40 | ||
41 | #define SYMDALLOP 200 | |
42 | struct allocbox{ | |
43 | struct allocbox *nextalloc; | |
44 | struct symtab symslots[SYMDALLOP]; | |
7c81b4f2 BJ |
45 | }; |
46 | ||
47 | #ifdef FLEXNAMES | |
48 | /* | |
49 | * Names are allocated in a string pool. String pools are linked | |
50 | * together and are allocated dynamically by Calloc. | |
51 | */ | |
52 | #define STRPOOLDALLOP NCPS | |
53 | struct strpool{ | |
54 | struct strpool *str_next; | |
55 | int str_nalloc; | |
56 | char str_names[STRPOOLDALLOP]; | |
57 | }; | |
58 | ||
59 | extern struct strpool *strplhead; | |
60 | #endif | |
61 | ||
62 | extern struct allocbox *allochead; | |
63 | extern struct allocbox *alloctail; | |
64 | extern struct symtab *nextsym; | |
65 | extern struct allocbox *newbox; | |
66 | extern char *namebuffer; | |
67 | extern int symsleft; | |
68 | ||
69 | #define ALLOCQTY sizeof (struct allocbox) | |
70 | /* | |
71 | * Iterate through all symbols in the symbol table in declaration | |
72 | * order | |
73 | */ | |
74 | #define DECLITERATE(allocwalk, walkpointer, ubpointer) \ | |
75 | for(allocwalk = allochead; \ | |
76 | allocwalk != 0; \ | |
77 | allocwalk = allocwalk->nextalloc) \ | |
78 | for (walkpointer = &allocwalk->symslots[0],\ | |
79 | ubpointer = &allocwalk->symslots[SYMDALLOP], \ | |
80 | ubpointer = ubpointer > ( (struct symtab *)alloctail) \ | |
81 | ? nextsym : ubpointer ;\ | |
82 | walkpointer < ubpointer; \ | |
83 | walkpointer++ ) | |
84 | /* | |
85 | * The hash table is segmented, and dynamically extendable. | |
86 | * We have a linked list of hash table segments; within each | |
87 | * segment we use a quadratic rehash that touches no more than 1/2 | |
88 | * of the buckets in the hash table when probing. | |
89 | * If the probe does not find the desired symbol, it moves to the | |
90 | * next segment, or allocates a new segment. | |
91 | * | |
92 | * Hash table segments are kept on the linked list with the first | |
93 | * segment always first (that contains the reserved words) and | |
94 | * the last added segment immediately after the first segment | |
95 | * to hopefully gain something by locality of reference. | |
96 | */ | |
97 | struct hashdallop { | |
98 | int h_nused; | |
99 | struct hashdallop *h_next; | |
100 | struct symtab *h_htab[NHASH]; | |
101 | }; |