X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/cd3001477e8cada39b9db728f65ff610d89a8895..d94be36654214c09fa6510611658325a84d5cfa7:/sym.c diff --git a/sym.c b/sym.c index 3bf52f3..4e11fba 100644 --- a/sym.c +++ b/sym.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: sym.c,v 1.9 1999/10/22 22:36:37 mdw Exp $ + * $Id: sym.c,v 1.11 2000/06/17 10:37:39 mdw Exp $ * * Symbol table management * @@ -30,6 +30,12 @@ /*----- Revision history --------------------------------------------------* * * $Log: sym.c,v $ + * Revision 1.11 2000/06/17 10:37:39 mdw + * Add support for arena management. + * + * Revision 1.10 1999/12/10 23:42:04 mdw + * Change header file guard names. + * * Revision 1.9 1999/10/22 22:36:37 mdw * New test structure for symbol tables. * @@ -71,13 +77,13 @@ /* --- Local headers --- */ #include "alloc.h" +#include "arena.h" #include "bits.h" #include "crc32.h" #include "exc.h" #include "hash.h" #include "sub.h" #include "sym.h" -#include "track.h" /*----- Tuning parameters -------------------------------------------------*/ @@ -114,11 +120,9 @@ void sym_create(sym_table *t) { - TRACK_CTX("symbol table creation"); - TRACK_PUSH; hash_create(&t->t, SYM_INITSZ); + t->s = &sub_global; t->load = SYM_LIMIT(SYM_INITSZ); - TRACK_POP; } /* --- @sym_destroy@ --- * @@ -135,9 +139,6 @@ void sym_destroy(sym_table *t) { sym_iter i; - TRACK_CTX("symbol table destruction"); - TRACK_PUSH; - SYM_MKITER(&i, t); for (;;) { sym_base *p; @@ -145,12 +146,10 @@ void sym_destroy(sym_table *t) if (!p) break; if (p->len > SYM_BUFSZ) - sub_free(p->name.p, p->len); - free(p); + subarena_free(t->s, p->name.p, p->len); + x_free(t->t.a, p); } hash_destroy(&t->t); - - TRACK_POP; } /* --- @sym_find@ --- * @@ -227,30 +226,17 @@ void *sym_find(sym_table *t, const char *n, long l, size_t sz, unsigned *f) /* --- Create a new symbol block and initialize it --- */ - { - TRACK_CTX("new symbol creation"); - TRACK_PUSH; - - q = xmalloc(sz); - q->b.next = *bin; - q->b.hash = hash; - q->len = len; - if (n) { - if (len <= SYM_BUFSZ) - memcpy(q->name.b, n, len); - else { - TRY { - q->name.p = sub_alloc(len); - memcpy(q->name.p, n, len); - } CATCH { - free(q); - TRACK_POP; - RETHROW; - } END_TRY; - } + q = x_alloc(t->t.a, sz); + q->b.next = *bin; + q->b.hash = hash; + q->len = len; + if (n) { + if (len <= SYM_BUFSZ) + memcpy(q->name.b, n, len); + else { + q->name.p = subarena_alloc(t->s, len); + memcpy(q->name.p, n, len); } - - TRACK_POP; } *bin = &q->b; @@ -269,7 +255,7 @@ void *sym_find(sym_table *t, const char *n, long l, size_t sz, unsigned *f) /* --- @sym_remove@ --- * * - * Arguments: @sym_table *i@ = pointer to a symbol table object + * Arguments: @sym_table *t@ = pointer to a symbol table object * @void *p@ = pointer to symbol table entry * * Returns: --- @@ -284,8 +270,8 @@ void sym_remove(sym_table *t, void *p) sym_base *q = p; hash_remove(&t->t, &q->b); if (q->len > SYM_BUFSZ) - sub_free(q->name.p, q->len); - free(q); + subarena_free(t->s, q->name.p, q->len); + xfree(q); t->load++; }