home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume17 / cproto / part02 / symbol.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-03-25  |  1.9 KB  |  89 lines

  1. /* $Id: symbol.c 2.1 91/02/28 11:16:35 cthuang Exp $
  2.  *
  3.  * Symbol table maintenance. Implements an abstract data type called
  4.  * the symbol table.
  5.  */
  6. #include <stdio.h>
  7. #include "config.h"
  8. #include "symbol.h"
  9.  
  10. /* Create a symbol table.
  11.  * Return a pointer to the symbol table or NULL if an error occurs.
  12.  */
  13. SymbolTable *
  14. create_symbol_table ()
  15. {
  16.     SymbolTable *symtab;
  17.     int i;
  18.  
  19.     if ((symtab = (SymbolTable *)malloc(sizeof(SymbolTable))) != NULL) {
  20.     for (i = 0; i < SYM_MAX_HASH; ++i)
  21.         symtab->bucket[i] = NULL;
  22.     }
  23.     return symtab;
  24. }
  25.  
  26.  
  27. /* This is a simple hash function mapping a symbol name to a hash bucket. */
  28.  
  29. static int
  30. hash (name)
  31. char *name;
  32. {
  33.     return (name[0] + name[1] + strlen(name)) % SYM_MAX_HASH;
  34. }
  35.  
  36.  
  37. /* Search the list of symbols <list> for the symbol <name>.
  38.  * Return a pointer to the symbol or NULL if not found.
  39.  */
  40. static Symbol *
  41. search_symbol_list (list, name)
  42. Symbol *list;
  43. char *name;
  44. {
  45.     Symbol *sym;
  46.  
  47.     for (sym = list; sym != NULL; sym = sym->next) {
  48.     if (strcmp(sym->name, name) == 0)
  49.         return sym;
  50.     }
  51.     return NULL;
  52. }
  53.  
  54.  
  55. /* Look for symbol <name> in symbol table <symtab>.
  56.  * Return a pointer to the symbol or NULL if not found.
  57.  */
  58. Symbol *
  59. find_symbol (symtab, name)
  60. SymbolTable *symtab;
  61. char *name;
  62. {
  63.     return search_symbol_list(symtab->bucket[hash(name)], name);
  64. }
  65.  
  66.  
  67. /* If the symbol <name> does not already exist in symbol table <symtab>,
  68.  * then add the symbol to the symbol table.
  69.  * Return a pointer to the symbol or NULL on an error.
  70.  */
  71. Symbol *
  72. new_symbol (symtab, name)
  73. SymbolTable *symtab;    /* symbol table */
  74. char *name;        /* symbol name */
  75. {
  76.     Symbol *sym;
  77.     int i;
  78.  
  79.     if ((sym = find_symbol(symtab, name)) == NULL) {
  80.     if ((sym = (Symbol *)malloc(sizeof(Symbol))) != NULL) {
  81.         sym->name = strdup(name);
  82.         i = hash(name);
  83.         sym->next = symtab->bucket[i];
  84.         symtab->bucket[i] = sym;
  85.     }
  86.     }
  87.     return sym;
  88. }
  89.