/*---------------------------------------------------------------------- File : symtab.h Contents: symbol table management Author : Christian Borgelt History : 22.10.1995 file created 30.10.1995 functions made independent of symbol data 26.11.1995 symbol types and visibility levels added 04.01.1996 st_clear added 27.02.1996 st_insert modified, st_name and st_type added 26.03.1996 insertion into hash bucket simplified 28.06.1996 dynamic bucket vector enlargement added 01.04.1997 functions st_clear and st_remove combined 31.05.1998 list of all symbols removed 20.06.1998 deletion function moved to st_create 28.09.1998 types ULONG and CCHAR removed, st_stats added 04.02.1999 long int changed to int ----------------------------------------------------------------------*/ #ifndef __SYMTAB__ #define __SYMTAB__ /*---------------------------------------------------------------------- Preprocessor Definitions ----------------------------------------------------------------------*/ #define EXISTS ((void*)-1) /* symbol exists already */ /*---------------------------------------------------------------------- Type Definitions ----------------------------------------------------------------------*/ typedef unsigned int HASHFN (const char *s, int type); typedef void SYMFN (void *data); typedef struct _ste { /* --- symbol table element --- */ struct _ste *succ; /* successor in hash bucket */ char *name; /* symbol name */ int type; /* symbol type */ int level; /* visibility level */ } STE; /* (symbol table element) */ typedef struct { /* --- symbol table --- */ int cnt; /* current number of symbols */ int level; /* current visibility level */ int size; /* current hash table size */ int max; /* maximal hash table size */ HASHFN *hash; /* hash function */ SYMFN *delfn; /* symbol deletion function */ STE **bvec; /* bucket vector */ } SYMTAB; /* (symbol table) */ /*---------------------------------------------------------------------- Functions ----------------------------------------------------------------------*/ extern SYMTAB* st_create (int init, int max, HASHFN hash, SYMFN delfn); extern void st_delete (SYMTAB *tab); extern void* st_insert (SYMTAB *tab, const char *name, int type, unsigned int size); extern int st_remove (SYMTAB *tab, const char *name, int type); extern void* st_lookup (SYMTAB *tab, const char *name, int type); extern void st_begblk (SYMTAB *tab); extern void st_endblk (SYMTAB *tab); extern int st_symcnt (const SYMTAB *tab); extern const char* st_name (const void *data); extern int st_type (const void *data); #ifndef NDEBUG extern void st_stats (const SYMTAB *tab); #endif /*---------------------------------------------------------------------- Preprocessor Definitions ----------------------------------------------------------------------*/ #define st_begblk(t) ((t)->level++) #define st_symcnt(t) ((t)->cnt) #define st_name(d) ((const char*)((STE*)(d)-1)->name) #define st_type(d) (((STE*)(d)-1)->type) #endif