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

Defined functions

Defined variables

SccsId defined in line 12; never used
SymTab defined in line 38; used 1 times
  • in line 73

Defined macros

STABSIZE defined in line 36; used 2 times
Last modified: 1985-12-20
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 976
Valid CSS Valid XHTML 1.0 Strict