gas: remove use of PTR
[binutils-gdb.git] / gas / hash.h
index df59d9fad21dc237e0ee9b771031227e87bbb305..2a7c99678f5c99edd29b2027e1f8705733dcd0c3 100644 (file)
@@ -1,11 +1,11 @@
 /* hash.h -- header file for gas hash table routines
 /* hash.h -- header file for gas hash table routines
-   Copyright (C) 1987, 92, 93, 95, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1987-2022 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
 
    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,
    any later version.
 
    GAS is distributed in the hope that it will be useful,
 
    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
 
    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.  */
+   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
 
 #ifndef HASH_H
 #define HASH_H
 
 
 #ifndef HASH_H
 #define HASH_H
 
-struct hash_control;
-
-/* Create a hash table.  This return a control block.  */
-
-extern struct hash_control *hash_new PARAMS ((void));
-
-/* Delete a hash table, freeing all allocated memory.  */
-
-extern void hash_die PARAMS ((struct hash_control *));
-
-/* Insert an entry into a hash table.  This returns NULL on success.
-   On error, it returns a printable string indicating the error.  It
-   is considered to be an error if the entry already exists in the
-   hash table.  */
-
-extern const char *hash_insert PARAMS ((struct hash_control *,
-                                       const char *key, PTR value));
-
-/* Insert or replace an entry in a hash table.  This returns NULL on
-   success.  On error, it returns a printable string indicating the
-   error.  If an entry already exists, its value is replaced.  */
-
-extern const char *hash_jam PARAMS ((struct hash_control *,
-                                    const char *key, PTR value));
-
-/* Replace an existing entry in a hash table.  This returns the old
-   value stored for the entry.  If the entry is not found in the hash
-   table, this does nothing and returns NULL.  */
-
-extern PTR hash_replace PARAMS ((struct hash_control *, const char *key,
-                                PTR value));
-
-/* Find an entry in a hash table, returning its value.  Returns NULL
-   if the entry is not found.  */
-
-extern PTR hash_find PARAMS ((struct hash_control *, const char *key));
-
-/* Delete an entry from a hash table.  This returns the value stored
-   for that entry, or NULL if there is no such entry.  */
-
-extern PTR hash_delete PARAMS ((struct hash_control *, const char *key));
-
-/* Traverse a hash table.  Call the function on every entry in the
-   hash table.  */
-
-extern void hash_traverse PARAMS ((struct hash_control *,
-                                  void (*pfn) (const char *key, PTR value)));
-
-/* Print hash table statistics on the specified file.  NAME is the
-   name of the hash table, used for printing a header.  */
-
-extern void hash_print_statistics PARAMS ((FILE *, const char *name,
-                                          struct hash_control *));
+/* 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 */
 
 #endif /* HASH_H */