diff options
author | Martin Liska <mliska@suse.cz> | 2020-08-18 10:49:16 +0200 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2020-08-20 10:56:07 +0930 |
commit | 8d32ded0b1c339f561f0fa8ba8afb9d69f25f684 (patch) | |
tree | 0563d1a1f73132d5a18955d1f59b3e3e93b94836 | |
parent | d3b740ca99953440d0868b6741d7ea1c7cc03300 (diff) | |
download | gdb-8d32ded0b1c339f561f0fa8ba8afb9d69f25f684.zip gdb-8d32ded0b1c339f561f0fa8ba8afb9d69f25f684.tar.gz gdb-8d32ded0b1c339f561f0fa8ba8afb9d69f25f684.tar.bz2 |
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.
-rw-r--r-- | gas/ChangeLog | 12 | ||||
-rw-r--r-- | gas/hash.h | 79 |
2 files changed, 91 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index aaa5d16..78d34e1 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,17 @@ 2020-08-20 Martin Liska <mliska@suse.cz> + * 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 <mliska@suse.cz> + * symbols.c (struct symbol_entry): New. (hash_symbol_entry): Likewise. (eq_symbol_entry): Likewise. @@ -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 */ |