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