1 /* Copyright (c) 1980 Regents of the University of California */ 2 /* "@(#)assyms.h 4.2 08/15/80" */ 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]; 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 }; 100