1 /* 2 * Copyright (c) 1983 Eric P. Allman 3 * Copyright (c) 1988 Regents of the University of California. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms are permitted 7 * provided that the above copyright notice and this paragraph are 8 * duplicated in all such forms and that any documentation, 9 * advertising materials, and other materials related to such 10 * distribution and use acknowledge that the software was developed 11 * by the University of California, Berkeley. The name of the 12 * University may not be used to endorse or promote products derived 13 * from this software without specific prior written permission. 14 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 16 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 17 */ 18 19 #ifndef lint 20 static char sccsid[] = "@(#)stab.c 5.5 (Berkeley) 06/30/88"; 21 #endif /* not lint */ 22 23 # include "sendmail.h" 24 25 /* 26 ** STAB -- manage the symbol table 27 ** 28 ** Parameters: 29 ** name -- the name to be looked up or inserted. 30 ** type -- the type of symbol. 31 ** op -- what to do: 32 ** ST_ENTER -- enter the name if not 33 ** already present. 34 ** ST_FIND -- find it only. 35 ** 36 ** Returns: 37 ** pointer to a STAB entry for this name. 38 ** NULL if not found and not entered. 39 ** 40 ** Side Effects: 41 ** can update the symbol table. 42 */ 43 44 # define STABSIZE 400 45 46 static STAB *SymTab[STABSIZE]; 47 48 STAB * 49 stab(name, type, op) 50 char *name; 51 int type; 52 int op; 53 { 54 register STAB *s; 55 register STAB **ps; 56 register int hfunc; 57 register char *p; 58 extern char lower(); 59 60 # ifdef DEBUG 61 if (tTd(36, 5)) 62 printf("STAB: %s %d ", name, type); 63 # endif DEBUG 64 65 /* 66 ** Compute the hashing function 67 ** 68 ** We could probably do better.... 69 */ 70 71 hfunc = type; 72 for (p = name; *p != '\0'; p++) 73 hfunc = (((hfunc << 7) | lower(*p)) & 077777) % STABSIZE; 74 75 # ifdef DEBUG 76 if (tTd(36, 9)) 77 printf("(hfunc=%d) ", hfunc); 78 # endif DEBUG 79 80 ps = &SymTab[hfunc]; 81 while ((s = *ps) != NULL && (strcasecmp(name, s->s_name) || s->s_type != type)) 82 ps = &s->s_next; 83 84 /* 85 ** Dispose of the entry. 86 */ 87 88 if (s != NULL || op == ST_FIND) 89 { 90 # ifdef DEBUG 91 if (tTd(36, 5)) 92 { 93 if (s == NULL) 94 printf("not found\n"); 95 else 96 { 97 long *lp = (long *) s->s_class; 98 99 printf("type %d val %lx %lx %lx %lx\n", 100 s->s_type, lp[0], lp[1], lp[2], lp[3]); 101 } 102 } 103 # endif DEBUG 104 return (s); 105 } 106 107 /* 108 ** Make a new entry and link it in. 109 */ 110 111 # ifdef DEBUG 112 if (tTd(36, 5)) 113 printf("entered\n"); 114 # endif DEBUG 115 116 /* make new entry */ 117 s = (STAB *) xalloc(sizeof *s); 118 bzero((char *) s, sizeof *s); 119 s->s_name = newstr(name); 120 makelower(s->s_name); 121 s->s_type = type; 122 123 /* link it in */ 124 *ps = s; 125 126 return (s); 127 } 128