1 # include "sendmail.h" 2 3 SCCSID(@(#)stab.c 4.1 07/25/83); 4 5 /* 6 ** STAB -- manage the symbol table 7 ** 8 ** Parameters: 9 ** name -- the name to be looked up or inserted. 10 ** type -- the type of symbol. 11 ** op -- what to do: 12 ** ST_ENTER -- enter the name if not 13 ** already present. 14 ** ST_FIND -- find it only. 15 ** 16 ** Returns: 17 ** pointer to a STAB entry for this name. 18 ** NULL if not found and not entered. 19 ** 20 ** Side Effects: 21 ** can update the symbol table. 22 */ 23 24 # define STABSIZE 400 25 26 static STAB *SymTab[STABSIZE]; 27 28 STAB * 29 stab(name, type, op) 30 char *name; 31 int type; 32 int op; 33 { 34 register STAB *s; 35 register STAB **ps; 36 extern bool sameword(); 37 register int hfunc; 38 register char *p; 39 extern char lower(); 40 41 # ifdef DEBUG 42 if (tTd(36, 5)) 43 printf("STAB: %s %d ", name, type); 44 # endif DEBUG 45 46 /* 47 ** Compute the hashing function 48 ** 49 ** We could probably do better.... 50 */ 51 52 hfunc = type; 53 for (p = name; *p != '\0'; p++) 54 hfunc = (((hfunc << 7) | lower(*p)) & 077777) % STABSIZE; 55 56 # ifdef DEBUG 57 if (tTd(36, 9)) 58 printf("(hfunc=%d) ", hfunc); 59 # endif DEBUG 60 61 ps = &SymTab[hfunc]; 62 while ((s = *ps) != NULL && (!sameword(name, s->s_name) || s->s_type != type)) 63 ps = &s->s_next; 64 65 /* 66 ** Dispose of the entry. 67 */ 68 69 if (s != NULL || op == ST_FIND) 70 { 71 # ifdef DEBUG 72 if (tTd(36, 5)) 73 { 74 if (s == NULL) 75 printf("not found\n"); 76 else 77 { 78 long *lp = (long *) s->s_class; 79 80 printf("type %d val %lx %lx %lx %lx\n", 81 s->s_type, lp[0], lp[1], lp[2], lp[3]); 82 } 83 } 84 # endif DEBUG 85 return (s); 86 } 87 88 /* 89 ** Make a new entry and link it in. 90 */ 91 92 # ifdef DEBUG 93 if (tTd(36, 5)) 94 printf("entered\n"); 95 # endif DEBUG 96 97 /* make new entry */ 98 s = (STAB *) xalloc(sizeof *s); 99 clear((char *) s, sizeof *s); 100 s->s_name = newstr(name); 101 makelower(s->s_name); 102 s->s_type = type; 103 104 /* link it in */ 105 *ps = s; 106 107 return (s); 108 } 109