From 8d32ded0b1c339f561f0fa8ba8afb9d69f25f684 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 18 Aug 2020 10:49:16 +0200 Subject: 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. --- gas/ChangeLog | 12 +++++++++ gas/hash.h | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) 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 + * 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. (hash_symbol_entry): Likewise. (eq_symbol_entry): Likewise. diff --git a/gas/hash.h b/gas/hash.h index f78cb73..3bdd322 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 */ -- cgit v1.1