-/* hash.h - for hash.c
- Copyright (C) 1987, 1992 Free Software Foundation, Inc.
+/* hash.h -- header file for gas hash table routines
+ Copyright (C) 1987-2020 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
GAS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
+ the Free Software Foundation; either version 3, or (at your option)
any later version.
GAS is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with GAS; see the file COPYING. If not, write to
- the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#ifndef hashH
-#define hashH
-
-struct hash_control;
-
-/* returns control block */
-struct hash_control *hash_new PARAMS ((void));
-void hash_die PARAMS ((struct hash_control *));
-/* returns previous value */
-PTR hash_delete PARAMS ((struct hash_control *, const char *str));
-/* returns previous value */
-PTR hash_replace PARAMS ((struct hash_control *, const char *str, PTR val));
-/* returns error string or null */
-const char *hash_insert PARAMS ((struct hash_control *, const char *str,
- PTR val));
-/* returns value */
-PTR hash_find PARAMS ((struct hash_control *, const char *str));
-/* returns error text or null (internal) */
-const char *hash_jam PARAMS ((struct hash_control *, const char *str,
- PTR val));
-
-void hash_print_statistics PARAMS ((FILE *, const char *,
- struct hash_control *));
-#endif /* #ifdef hashH */
-
-/* end of hash.h */
+ along with GAS; see the file COPYING. If not, write to the Free
+ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+#ifndef HASH_H
+#define HASH_H
+
+/* Insert ELEMENT into HTAB. If REPLACE is non-zero existing elements
+ are overwritten. If ELEMENT already exists, a pointer to the slot
+ is returned. Otherwise NULL is returned. */
+
+extern void **htab_insert (htab_t, void * /* element */, int /* replace */);
+
+/* Print statistics about a hash table. */
+
+extern void htab_print_statistics (FILE *f, const char *name, htab_t table);
+
+/* String hash table functions. */
+
+struct string_tuple
+{
+ const char *key;
+ const void *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, const void *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 ? (void *) 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 ? (void *) 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, const void *value, int replace)
+{
+ string_tuple_t *elt = string_tuple_alloc (key, value);
+ void **slot = htab_insert (table, elt, replace);
+ if (slot && !replace)
+ free (elt);
+ return slot;
+}
+
+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 */