1 /* 2 * Copyright (c) 1998 Sendmail, Inc. All rights reserved. 3 * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. 4 * Copyright (c) 1988, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * By using this file, you agree to the terms and conditions set 8 * forth in the LICENSE file which can be found at the top level of 9 * the sendmail distribution. 10 * 11 */ 12 13 #ifndef lint 14 static char sccsid[] = "@(#)stab.c 8.19 (Berkeley) 5/19/1998"; 15 #endif /* not lint */ 16 17 # include "sendmail.h" 18 19 /* 20 ** STAB -- manage the symbol table 21 ** 22 ** Parameters: 23 ** name -- the name to be looked up or inserted. 24 ** type -- the type of symbol. 25 ** op -- what to do: 26 ** ST_ENTER -- enter the name if not 27 ** already present. 28 ** ST_FIND -- find it only. 29 ** 30 ** Returns: 31 ** pointer to a STAB entry for this name. 32 ** NULL if not found and not entered. 33 ** 34 ** Side Effects: 35 ** can update the symbol table. 36 */ 37 38 # define STABSIZE 2003 39 40 static STAB *SymTab[STABSIZE]; 41 42 STAB * 43 stab(name, type, op) 44 char *name; 45 int type; 46 int op; 47 { 48 register STAB *s; 49 register STAB **ps; 50 register int hfunc; 51 register char *p; 52 int len; 53 extern char lower __P((char)); 54 55 if (tTd(36, 5)) 56 printf("STAB: %s %d ", name, type); 57 58 /* 59 ** Compute the hashing function 60 */ 61 62 hfunc = type; 63 for (p = name; *p != '\0'; p++) 64 hfunc = ((hfunc << 1) ^ (lower(*p) & 0377)) % STABSIZE; 65 66 if (tTd(36, 9)) 67 printf("(hfunc=%d) ", hfunc); 68 69 ps = &SymTab[hfunc]; 70 if (type == ST_MACRO || type == ST_RULESET) 71 { 72 while ((s = *ps) != NULL && 73 (s->s_type != type || strcmp(name, s->s_name))) 74 ps = &s->s_next; 75 } 76 else 77 { 78 while ((s = *ps) != NULL && 79 (s->s_type != type || strcasecmp(name, s->s_name))) 80 ps = &s->s_next; 81 } 82 83 /* 84 ** Dispose of the entry. 85 */ 86 87 if (s != NULL || op == ST_FIND) 88 { 89 if (tTd(36, 5)) 90 { 91 if (s == NULL) 92 printf("not found\n"); 93 else 94 { 95 long *lp = (long *) s->s_class; 96 97 printf("type %d val %lx %lx %lx %lx\n", 98 s->s_type, lp[0], lp[1], lp[2], lp[3]); 99 } 100 } 101 return (s); 102 } 103 104 /* 105 ** Make a new entry and link it in. 106 */ 107 108 if (tTd(36, 5)) 109 printf("entered\n"); 110 111 /* determine size of new entry */ 112 #if _FFR_MEMORY_MISER 113 switch (type) 114 { 115 case ST_CLASS: 116 len = sizeof s->s_class; 117 break; 118 119 case ST_ADDRESS: 120 len = sizeof s->s_address; 121 break; 122 123 case ST_MAILER: 124 len = sizeof s->s_mailer; 125 126 case ST_ALIAS: 127 len = sizeof s->s_alias; 128 break; 129 130 case ST_MAPCLASS: 131 len = sizeof s->s_mapclass; 132 break; 133 134 case ST_MAP: 135 len = sizeof s->s_map; 136 break; 137 138 case ST_HOSTSIG: 139 len = sizeof s->s_hostsig; 140 break; 141 142 case ST_NAMECANON: 143 len = sizeof s->s_namecanon; 144 break; 145 146 case ST_MACRO: 147 len = sizeof s->s_macro; 148 break; 149 150 case ST_RULESET: 151 len = sizeof s->s_ruleset; 152 break; 153 154 case ST_SERVICE: 155 len = sizeof s->s_service; 156 break; 157 158 case ST_HEADER: 159 len = sizeof s->s_header; 160 break; 161 162 default: 163 if (type >= ST_MCI) 164 len = sizeof s->s_mci; 165 else 166 { 167 syserr("stab: unknown symbol type %d", type); 168 len = sizeof s->s_value; 169 } 170 break; 171 } 172 len += sizeof *s - sizeof s->s_value; 173 #else 174 len = sizeof *s; 175 #endif 176 177 /* make new entry */ 178 s = (STAB *) xalloc(len); 179 bzero((char *) s, len); 180 s->s_name = newstr(name); 181 s->s_type = type; 182 s->s_len = len; 183 184 /* link it in */ 185 *ps = s; 186 187 return (s); 188 } 189 /* 190 ** STABAPPLY -- apply function to all stab entries 191 ** 192 ** Parameters: 193 ** func -- the function to apply. It will be given one 194 ** parameter (the stab entry). 195 ** arg -- an arbitrary argument, passed to func. 196 ** 197 ** Returns: 198 ** none. 199 */ 200 201 void 202 stabapply(func, arg) 203 void (*func)__P((STAB *, int)); 204 int arg; 205 { 206 register STAB **shead; 207 register STAB *s; 208 209 for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) 210 { 211 for (s = *shead; s != NULL; s = s->s_next) 212 { 213 if (tTd(36, 90)) 214 printf("stabapply: trying %d/%s\n", 215 s->s_type, s->s_name); 216 func(s, arg); 217 } 218 } 219 } 220