symtab.h
上传用户:lengbin
上传日期:2010-03-31
资源大小:121k
文件大小:5k
开发平台:

C/C++

  1. /*----------------------------------------------------------------------
  2.   File    : symtab.h
  3.   Contents: symbol table and name/identifier map management
  4.   Author  : Christian Borgelt
  5.   History : 22.10.1995 file created
  6.             30.10.1995 functions made independent of symbol data
  7.             26.11.1995 symbol types and visibility levels added
  8.             04.01.1996 st_clear added
  9.             27.02.1996 st_insert modified, st_name and st_type added
  10.             26.03.1996 insertion into hash bucket simplified
  11.             28.06.1996 dynamic bucket vector enlargement added
  12.             01.04.1997 functions st_clear and st_remove combined
  13.             31.05.1998 list of all symbols removed
  14.             20.06.1998 deletion function moved to st_create
  15.             28.09.1998 types ULONG and CCHAR removed, st_stats added
  16.             04.02.1999 long int changed to int
  17.             10.11.1999 name/identifier map management added
  18.             15.12.2004 function nim_trunc added
  19. ----------------------------------------------------------------------*/
  20. #ifndef __SYMTAB__
  21. #define __SYMTAB__
  22. /*----------------------------------------------------------------------
  23.   Preprocessor Definitions
  24. ----------------------------------------------------------------------*/
  25. #define EXISTS  ((void*)-1)     /* symbol exists already */
  26. #define NIMAP   SYMTAB          /* name/id maps are special sym.tabs. */
  27. /*----------------------------------------------------------------------
  28.   Type Definitions
  29. ----------------------------------------------------------------------*/
  30. typedef unsigned HASHFN   (const char *name, int type);
  31. typedef void     SYMFN    (void *data);
  32. typedef int      SYMCMPFN (const void *s1, const void *s2, void *data);
  33. typedef struct _ste {           /* --- symbol table element --- */
  34.   struct _ste *succ;            /* successor in hash bucket */
  35.   char        *name;            /* symbol name */
  36.   int         type;             /* symbol type */
  37.   int         level;            /* visibility level */
  38. } STE;                          /* (symbol table element) */
  39. typedef struct {                /* --- symbol table --- */
  40.   int         cnt;              /* current number of symbols */
  41.   int         level;            /* current visibility level */
  42.   int         size;             /* current hash table size */
  43.   int         max;              /* maximal hash table size */
  44.   HASHFN      *hash;            /* hash function */
  45.   SYMFN       *delfn;           /* symbol deletion function */
  46.   STE         **bvec;           /* bucket vector */
  47.   int         vsz;              /* size of identifier vector */
  48.   int         **ids;            /* identifier vector */
  49. } SYMTAB;                       /* (symbol table) */
  50. /*----------------------------------------------------------------------
  51.   Symbol Table Functions
  52. ----------------------------------------------------------------------*/
  53. extern SYMTAB*     st_create  (int init, int max,
  54.                                HASHFN hash, SYMFN delfn);
  55. extern void        st_delete  (SYMTAB *tab);
  56. extern void*       st_insert  (SYMTAB *tab, const char *name, int type,
  57.                                unsigned size);
  58. extern int         st_remove  (SYMTAB *tab, const char *name, int type);
  59. extern void*       st_lookup  (SYMTAB *tab, const char *name, int type);
  60. extern void        st_begblk  (SYMTAB *tab);
  61. extern void        st_endblk  (SYMTAB *tab);
  62. extern int         st_symcnt  (const SYMTAB *tab);
  63. extern const char* st_name    (const void *data);
  64. extern int         st_type    (const void *data);
  65. #ifndef NDEBUG
  66. extern void        st_stats   (const SYMTAB *tab);
  67. #endif
  68. /*----------------------------------------------------------------------
  69.   Name/Identifier Map Functions
  70. ----------------------------------------------------------------------*/
  71. #ifdef NIMAPFN
  72. extern NIMAP*      nim_create (int init, int max,
  73.                                HASHFN hash, SYMFN delfn);
  74. extern void        nim_delete (NIMAP *nim);
  75. extern void*       nim_add    (NIMAP *nim, const char *name,
  76.                                unsigned size);
  77. extern void*       nim_byname (NIMAP *nim, const char *name);
  78. extern void*       nim_byid   (NIMAP *nim, int id);
  79. extern const char* nim_name   (const void *data);
  80. extern int         nim_cnt    (const NIMAP *nim);
  81. extern void        nim_sort   (NIMAP *nim, SYMCMPFN cmpfn, void *data,
  82.                                int *map, int dir);
  83. extern void        nim_trunc  (NIMAP *nim, int n);
  84. #ifndef NDEBUG
  85. extern void        nim_stats  (const NIMAP *nimap);
  86. #endif
  87. #endif
  88. /*----------------------------------------------------------------------
  89.   Preprocessor Definitions
  90. ----------------------------------------------------------------------*/
  91. #define st_begblk(t)      ((t)->level++)
  92. #define st_symcnt(t)      ((t)->cnt)
  93. #define st_name(d)        ((const char*)((STE*)(d)-1)->name)
  94. #define st_type(d)        (((STE*)(d)-1)->type)
  95. /*--------------------------------------------------------------------*/
  96. #ifdef NIMAPFN
  97. #define nim_delete(m)     st_delete(m)
  98. #define nim_add(m,n,s)    st_insert(m,n,0,s)
  99. #define nim_byname(m,n)   st_lookup(m,n,0)
  100. #define nim_byid(m,i)     ((void*)(m)->ids[i])
  101. #define nim_name(d)       st_name(d)
  102. #define nim_cnt(m)        st_symcnt(m)
  103. #ifndef NDEBUG
  104. #define nim_stats(m)      st_stats(m)
  105. #endif
  106. #endif
  107. #endif