X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gas%2Fhash.h;h=2a7c99678f5c99edd29b2027e1f8705733dcd0c3;hb=2ec4ffc1c6ce5659549a03ba5728df6811922bf9;hp=43c7556e29cb6131811205556853153b24023f77;hpb=6594d6b9c2069e288b56260776bcbceb43798667;p=binutils-gdb.git diff --git a/gas/hash.h b/gas/hash.h index 43c7556e29c..2a7c99678f5 100644 --- a/gas/hash.h +++ b/gas/hash.h @@ -1,11 +1,11 @@ -/* 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-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, @@ -14,42 +14,104 @@ 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. */ + 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 { - const char *hash_string; /* points to where the symbol string is */ - /* NULL means slot is not used */ - /* DELETED means slot was deleted */ - PTR hash_value; /* user's datum, associated with symbol */ - unsigned long h; + 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); +} -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.c */ +#endif /* HASH_H */