From: Martin Liska Date: Tue, 18 Aug 2020 08:49:16 +0000 (+0200) Subject: Add new string hash table based on htab_t. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8d32ded0b1c339f561f0fa8ba8afb9d69f25f684;p=binutils-gdb.git Add new string hash table based on htab_t. * hash.h (struct string_tuple): New. (hash_string_tuple): Likewise. (eq_string_tuple): Likewise. (string_tuple_alloc): Likewise. (str_hash_find): Likewise. (str_hash_find_n): Likewise. (str_hash_delete): Likewise. (str_hash_insert): Likewise. (str_htab_create): Likewise. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index aaa5d16b727..78d34e1572f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,15 @@ +2020-08-20 Martin Liska + + * hash.h (struct string_tuple): New. + (hash_string_tuple): Likewise. + (eq_string_tuple): Likewise. + (string_tuple_alloc): Likewise. + (str_hash_find): Likewise. + (str_hash_find_n): Likewise. + (str_hash_delete): Likewise. + (str_hash_insert): Likewise. + (str_htab_create): Likewise. + 2020-08-20 Martin Liska * symbols.c (struct symbol_entry): New. diff --git a/gas/hash.h b/gas/hash.h index f78cb73b0d3..3bdd3220923 100644 --- a/gas/hash.h +++ b/gas/hash.h @@ -93,4 +93,83 @@ extern void htab_insert (htab_t, void *); extern void htab_print_statistics (FILE *f, const char *name, htab_t table); +/* String hash table functions. */ + +struct string_tuple +{ + const char *key; + char *value; +}; + +typedef struct string_tuple string_tuple_t; + +/* Hash function for a string_tuple. */ + +static hashval_t +hash_string_tuple (const void *e) +{ + string_tuple_t *tuple = (string_tuple_t *) e; + return htab_hash_string (tuple->key); +} + +/* Equality function for a string_tuple. */ + +static int +eq_string_tuple (const void *a, const void *b) +{ + const string_tuple_t *ea = (const string_tuple_t *) a; + const string_tuple_t *eb = (const string_tuple_t *) b; + + return strcmp (ea->key, eb->key) == 0; +} + +static inline string_tuple_t * +string_tuple_alloc (const char *key, char *value) +{ + string_tuple_t *tuple = XNEW (string_tuple_t); + tuple->key = key; + tuple->value = value; + return tuple; +} + +static inline void * +str_hash_find (htab_t table, const char *key) +{ + string_tuple_t needle = { key, NULL }; + string_tuple_t *tuple = htab_find (table, &needle); + return tuple != NULL ? tuple->value : NULL; +} + +static inline void * +str_hash_find_n (htab_t table, const char *key, size_t n) +{ + char *tmp = XNEWVEC (char, n + 1); + memcpy (tmp, key, n); + tmp[n] = '\0'; + string_tuple_t needle = { tmp, NULL }; + string_tuple_t *tuple = htab_find (table, &needle); + free (tmp); + return tuple != NULL ? tuple->value : NULL; +} + +static inline void +str_hash_delete (htab_t table, const char *key) +{ + string_tuple_t needle = { key, NULL }; + htab_remove_elt (table, &needle); +} + +static inline void +str_hash_insert (htab_t table, const char *key, void *value) +{ + htab_insert (table, string_tuple_alloc (key, value)); +} + +static inline htab_t +str_htab_create (void) +{ + return htab_create_alloc (16, hash_string_tuple, eq_string_tuple, + NULL, xcalloc, free); +} + #endif /* HASH_H */