|
|
1.1 ! root 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 provided ! 7: * that: (1) source distributions retain this entire copyright notice and ! 8: * comment, and (2) distributions including binaries display the following ! 9: * acknowledgement: ``This product includes software developed by the ! 10: * University of California, Berkeley and its contributors'' in the ! 11: * documentation or other materials provided with the distribution and in ! 12: * all advertising materials mentioning features or use of this software. ! 13: * Neither the name of the University nor the names of its contributors may ! 14: * be used to endorse or promote products derived from this software without ! 15: * specific prior written permission. ! 16: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 17: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 18: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 19: */ ! 20: ! 21: #ifndef lint ! 22: static char sccsid[] = "@(#)stab.c 5.7 (Berkeley) 6/1/90"; ! 23: #endif /* not lint */ ! 24: ! 25: # include "sendmail.h" ! 26: ! 27: /* ! 28: ** STAB -- manage the symbol table ! 29: ** ! 30: ** Parameters: ! 31: ** name -- the name to be looked up or inserted. ! 32: ** type -- the type of symbol. ! 33: ** op -- what to do: ! 34: ** ST_ENTER -- enter the name if not ! 35: ** already present. ! 36: ** ST_FIND -- find it only. ! 37: ** ! 38: ** Returns: ! 39: ** pointer to a STAB entry for this name. ! 40: ** NULL if not found and not entered. ! 41: ** ! 42: ** Side Effects: ! 43: ** can update the symbol table. ! 44: */ ! 45: ! 46: # define STABSIZE 400 ! 47: ! 48: static STAB *SymTab[STABSIZE]; ! 49: ! 50: STAB * ! 51: stab(name, type, op) ! 52: char *name; ! 53: int type; ! 54: int op; ! 55: { ! 56: register STAB *s; ! 57: register STAB **ps; ! 58: register int hfunc; ! 59: register char *p; ! 60: extern char lower(); ! 61: ! 62: if (tTd(36, 5)) ! 63: printf("STAB: %s %d ", name, type); ! 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: if (tTd(36, 9)) ! 76: printf("(hfunc=%d) ", hfunc); ! 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: if (tTd(36, 5)) ! 89: { ! 90: if (s == NULL) ! 91: printf("not found\n"); ! 92: else ! 93: { ! 94: long *lp = (long *) s->s_class; ! 95: ! 96: printf("type %d val %lx %lx %lx %lx\n", ! 97: s->s_type, lp[0], lp[1], lp[2], lp[3]); ! 98: } ! 99: } ! 100: return (s); ! 101: } ! 102: ! 103: /* ! 104: ** Make a new entry and link it in. ! 105: */ ! 106: ! 107: if (tTd(36, 5)) ! 108: printf("entered\n"); ! 109: ! 110: /* make new entry */ ! 111: s = (STAB *) xalloc(sizeof *s); ! 112: bzero((char *) s, sizeof *s); ! 113: s->s_name = newstr(name); ! 114: makelower(s->s_name); ! 115: s->s_type = type; ! 116: ! 117: /* link it in */ ! 118: *ps = s; ! 119: ! 120: return (s); ! 121: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.