Add new string hash table based on htab_t.
authorMartin Liska <mliska@suse.cz>
Tue, 18 Aug 2020 08:49:16 +0000 (10:49 +0200)
committerAlan Modra <amodra@gmail.com>
Thu, 20 Aug 2020 01:26:07 +0000 (10:56 +0930)
* 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
gas/hash.h

index aaa5d16b727aef0cddf0b57cc9f20900c9d53b3f..78d34e1572f8cc05178cf80d3433b4f10d63ed03 100644 (file)
@@ -1,3 +1,15 @@
+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.
index f78cb73b0d31afa97b83d55bef98256047358c30..3bdd322092351b6930b2c098c1479312353c1c40 100644 (file)
@@ -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 */