-/* hash.h - for hash.c
- Copyright (C) 1987 Free Software Foundation, Inc.
+/* hash.h -- header file for gas hash table routines
+ Copyright (C) 1987-2021 Free Software Foundation, Inc.
-This file is part of GAS, the GNU Assembler.
+ 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 1, or (at your option)
-any later version.
+ 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 3, or (at your option)
+ any later version.
-GAS is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+ GAS is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
+ 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, 51 Franklin Street - Fifth Floor, Boston, MA
+ 02110-1301, USA. */
-#ifndef hashH
-#define hashH
+#ifndef HASH_H
+#define HASH_H
-struct hash_entry
+/* 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
{
- char * hash_string; /* points to where the symbol string is */
- /* NULL means slot is not used */
- /* DELETED means slot was deleted */
- char * hash_value; /* user's datum, associated with symbol */
+ const char *key;
+ const void *value;
};
+typedef struct string_tuple string_tuple_t;
+
+/* Hash function for a string_tuple. */
-#define HASH_STATLENGTH (6)
-struct hash_control
+static hashval_t
+hash_string_tuple (const void *e)
{
- struct hash_entry * hash_where; /* address of hash table */
- int hash_sizelog; /* Log of ( hash_mask + 1 ) */
- int hash_mask; /* masks a hash into index into table */
- int hash_full; /* when hash_stat[STAT_USED] exceeds this, */
- /* grow table */
- struct hash_entry * hash_wall; /* point just after last (usable) entry */
- /* here we have some statistics */
- int hash_stat[HASH_STATLENGTH]; /* lies & statistics */
- /* we need STAT_USED & STAT_SIZE */
-};
+ 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;
-/* returns */
-struct hash_control * hash_new(); /* [control block] */
-void hash_die();
-void hash_say();
-char * hash_delete(); /* previous value */
-char * hash_relpace(); /* previous value */
-char * hash_insert(); /* error string */
-char * hash_apply(); /* 0 means OK */
-char * hash_find(); /* value */
-char * hash_jam(); /* error text (internal) */
-#endif /* #ifdef hashH */
+ 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);
+}
-/* end: hash.c */
+#endif /* HASH_H */