+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.
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 */