00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00124 #ifndef _LIBUTIL_HASH_H_
00125 #define _LIBUTIL_HASH_H_
00126
00127
00128 #include <sphinxbase_export.h>
00129 #include <prim_type.h>
00130 #include <glist.h>
00131
00132 #ifdef __cplusplus
00133 extern "C" {
00134 #endif
00135 #if 0
00136
00137 }
00138 #endif
00139
00149 typedef struct hash_entry_s {
00150 const char *key;
00153 size_t len;
00155 void *val;
00156 struct hash_entry_s *next;
00157 } hash_entry_t;
00158
00159 typedef struct {
00160 hash_entry_t *table;
00161 int32 size;
00164 int32 inuse;
00165 int32 nocase;
00166 } hash_table_t;
00167
00168 typedef struct hash_iter_s {
00169 hash_table_t *ht;
00170 hash_entry_t *ent;
00171 size_t idx;
00172 } hash_iter_t;
00173
00175 #define hash_entry_val(e) ((e)->val)
00176 #define hash_entry_key(e) ((e)->key)
00177 #define hash_entry_len(e) ((e)->len)
00178 #define hash_table_inuse(h) ((h)->inuse)
00179 #define hash_table_size(h) ((h)->size)
00180
00181
00190 SPHINXBASE_EXPORT
00191 hash_table_t * hash_table_new(int32 size,
00192 int32 casearg
00195 );
00196
00197 #define HASH_CASE_YES 0
00198 #define HASH_CASE_NO 1
00199
00204 SPHINXBASE_EXPORT
00205 void hash_table_free(hash_table_t *h
00206 );
00207
00208
00215 SPHINXBASE_EXPORT
00216 void *hash_table_enter(hash_table_t *h,
00217 const char *key,
00219 void *val
00220 );
00221
00228 #define hash_table_enter_int32(h,k,v) \
00229 ((int32)(long)hash_table_enter((h),(k),(void *)(long)(v)))
00230
00244 SPHINXBASE_EXPORT
00245 void *hash_table_replace(hash_table_t *h,
00246 const char *key,
00248 void *val
00249 );
00250
00257 #define hash_table_replace_int32(h,k,v) \
00258 ((int32)(long)hash_table_replace((h),(k),(void *)(long)(v)))
00259
00265 SPHINXBASE_EXPORT
00266 void *hash_table_delete(hash_table_t *h,
00268 const char *key
00270 );
00271
00275 SPHINXBASE_EXPORT
00276 void hash_table_empty(hash_table_t *h
00277 );
00278
00286 SPHINXBASE_EXPORT
00287 void *hash_table_enter_bkey(hash_table_t *h,
00289 const char *key,
00290 size_t len,
00291 void *val
00292 );
00293
00300 #define hash_table_enter_bkey_int32(h,k,l,v) \
00301 ((int32)(long)hash_table_enter_bkey((h),(k),(l),(void *)(long)(v)))
00302
00303
00309 SPHINXBASE_EXPORT
00310 int32 hash_table_lookup(hash_table_t *h,
00311 const char *key,
00312 void **val
00314 );
00315
00322 SPHINXBASE_EXPORT
00323 int32 hash_table_lookup_int32(hash_table_t *h,
00324 const char *key,
00325 int32 *val
00327 );
00328
00335 SPHINXBASE_EXPORT
00336 int32 hash_table_lookup_bkey(hash_table_t *h,
00337 const char *key,
00338 size_t len,
00339 void **val
00341 );
00342
00349 SPHINXBASE_EXPORT
00350 int32 hash_table_lookup_bkey_int32(hash_table_t *h,
00351 const char *key,
00352 size_t len,
00353 int32 *val
00355 );
00356
00360 SPHINXBASE_EXPORT
00361 hash_iter_t *hash_table_iter(hash_table_t *h);
00362
00371 SPHINXBASE_EXPORT
00372 hash_iter_t *hash_table_iter_next(hash_iter_t *itor);
00373
00377 SPHINXBASE_EXPORT
00378 void hash_table_iter_free(hash_iter_t *itor);
00379
00383 SPHINXBASE_EXPORT
00384 glist_t hash_table_tolist(hash_table_t *h,
00385 int32 *count
00388 );
00389
00395 SPHINXBASE_EXPORT
00396 void hash_table_display(hash_table_t *h,
00397 int32 showkey
00400 );
00401
00402 #ifdef __cplusplus
00403 }
00404 #endif
00405
00406 #endif