1 /* 2 * Copyright (c) 1988 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that this notice is preserved and that due credit is given 7 * to the University of California at Berkeley. The name of the University 8 * may not be used to endorse or promote products derived from this 9 * software without specific prior written permission. This software 10 * is provided ``as is'' without express or implied warranty. 11 * 12 * Sendmail 13 * Copyright (c) 1983 Eric P. Allman 14 * Berkeley, California 15 */ 16 17 #ifndef lint 18 static char sccsid[] = "@(#)stab.c 5.4 (Berkeley) 03/13/88"; 19 #endif /* not lint */ 20 21 # include "sendmail.h" 22 23 /* 24 ** STAB -- manage the symbol table 25 ** 26 ** Parameters: 27 ** name -- the name to be looked up or inserted. 28 ** type -- the type of symbol. 29 ** op -- what to do: 30 ** ST_ENTER -- enter the name if not 31 ** already present. 32 ** ST_FIND -- find it only. 33 ** 34 ** Returns: 35 ** pointer to a STAB entry for this name. 36 ** NULL if not found and not entered. 37 ** 38 ** Side Effects: 39 ** can update the symbol table. 40 */ 41 42 # define STABSIZE 400 43 44 static STAB *SymTab[STABSIZE]; 45 46 STAB * 47 stab(name, type, op) 48 char *name; 49 int type; 50 int op; 51 { 52 register STAB *s; 53 register STAB **ps; 54 register int hfunc; 55 register char *p; 56 extern char lower(); 57 58 # ifdef DEBUG 59 if (tTd(36, 5)) 60 printf("STAB: %s %d ", name, type); 61 # endif DEBUG 62 63 /* 64 ** Compute the hashing function 65 ** 66 ** We could probably do better.... 67 */ 68 69 hfunc = type; 70 for (p = name; *p != '\0'; p++) 71 hfunc = (((hfunc << 7) | lower(*p)) & 077777) % STABSIZE; 72 73 # ifdef DEBUG 74 if (tTd(36, 9)) 75 printf("(hfunc=%d) ", hfunc); 76 # endif DEBUG 77 78 ps = &SymTab[hfunc]; 79 while ((s = *ps) != NULL && (strcasecmp(name, s->s_name) || s->s_type != type)) 80 ps = &s->s_next; 81 82 /* 83 ** Dispose of the entry. 84 */ 85 86 if (s != NULL || op == ST_FIND) 87 { 88 # ifdef DEBUG 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 # endif DEBUG 102 return (s); 103 } 104 105 /* 106 ** Make a new entry and link it in. 107 */ 108 109 # ifdef DEBUG 110 if (tTd(36, 5)) 111 printf("entered\n"); 112 # endif DEBUG 113 114 /* make new entry */ 115 s = (STAB *) xalloc(sizeof *s); 116 bzero((char *) s, sizeof *s); 117 s->s_name = newstr(name); 118 makelower(s->s_name); 119 s->s_type = type; 120 121 /* link it in */ 122 *ps = s; 123 124 return (s); 125 } 126