X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gas%2Fhash.h;h=2a7c99678f5c99edd29b2027e1f8705733dcd0c3;hb=2ec4ffc1c6ce5659549a03ba5728df6811922bf9;hp=df59d9fad21dc237e0ee9b771031227e87bbb305;hpb=ed288bb597072176e84fc8279707a3f2f475779b;p=binutils-gdb.git diff --git a/gas/hash.h b/gas/hash.h index df59d9fad21..2a7c99678f5 100644 --- a/gas/hash.h +++ b/gas/hash.h @@ -1,11 +1,11 @@ /* 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 - 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, @@ -15,64 +15,103 @@ 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 -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 */