aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-08-18 10:49:16 +0200
committerAlan Modra <amodra@gmail.com>2020-08-20 10:56:07 +0930
commit8d32ded0b1c339f561f0fa8ba8afb9d69f25f684 (patch)
tree0563d1a1f73132d5a18955d1f59b3e3e93b94836
parentd3b740ca99953440d0868b6741d7ea1c7cc03300 (diff)
downloadgdb-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/ChangeLog12
-rw-r--r--gas/hash.h79
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.
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 */