symtab.c

Go to the documentation of this file.
00001 #include "defs.h"
00002 
00003 
00004 /* TABLE_SIZE is the number of entries in the symbol table. */
00005 /* TABLE_SIZE must be a power of two.                       */
00006 
00007 #define TABLE_SIZE 1024
00008 
00009 
00010 bucket **symbol_table;
00011 bucket *first_symbol;
00012 bucket *last_symbol;
00013 
00014 
00015 int
00016 hash(name)
00017 char *name;
00018 {
00019     register char *s;
00020     register int c, k;
00021 
00022     assert(name && *name);
00023     s = name;
00024     k = *s;
00025     while (c = *++s)
00026         k = (31*k + c) & (TABLE_SIZE - 1);
00027 
00028     return (k);
00029 }
00030 
00031 
00032 bucket *
00033 make_bucket(name)
00034 char *name;
00035 {
00036     register bucket *bp;
00037 
00038     assert(name);
00039     bp = (bucket *) MALLOC(sizeof(bucket));
00040     if (bp == 0) no_space();
00041     bp->link = 0;
00042     bp->next = 0;
00043     bp->name = MALLOC(strlen(name) + 1);
00044     if (bp->name == 0) no_space();
00045     bp->tag = 0;
00046     bp->value = UNDEFINED;
00047     bp->index = 0;
00048     bp->prec = 0;
00049     bp-> class = UNKNOWN;
00050     bp->assoc = TOKEN;
00051 
00052     if (bp->name == 0) no_space();
00053     strcpy(bp->name, name);
00054 
00055     return (bp);
00056 }
00057 
00058 
00059 bucket *
00060 lookup(name)
00061 char *name;
00062 {
00063     register bucket *bp, **bpp;
00064 
00065     bpp = symbol_table + hash(name);
00066     bp = *bpp;
00067 
00068     while (bp)
00069     {
00070         if (strcmp(name, bp->name) == 0) return (bp);
00071         bpp = &bp->link;
00072         bp = *bpp;
00073     }
00074 
00075     *bpp = bp = make_bucket(name);
00076     last_symbol->next = bp;
00077     last_symbol = bp;
00078 
00079     return (bp);
00080 }
00081 
00082 
00083 create_symbol_table()
00084 {
00085     register int i;
00086     register bucket *bp;
00087 
00088     symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
00089     if (symbol_table == 0) no_space();
00090     for (i = 0; i < TABLE_SIZE; i++)
00091         symbol_table[i] = 0;
00092 
00093     bp = make_bucket("error");
00094     bp->index = 1;
00095     bp->class = TERM;
00096 
00097     first_symbol = bp;
00098     last_symbol = bp;
00099     symbol_table[hash("error")] = bp;
00100 }
00101 
00102 
00103 free_symbol_table()
00104 {
00105     FREE(symbol_table);
00106     symbol_table = 0;
00107 }
00108 
00109 
00110 free_symbols()
00111 {
00112     register bucket *p, *q;
00113 
00114     for (p = first_symbol; p; p = q)
00115     {
00116         q = p->next;
00117         FREE(p);
00118     }
00119 }

Generated on Fri Apr 14 22:56:45 2006 for minix by  doxygen 1.4.6