1 /* hash.h -- header file for gas hash table routines 2 Copyright (C) 1987-2024 Free Software Foundation, Inc. 3 4 This file is part of GAS, the GNU Assembler. 5 6 GAS is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 GAS is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GAS; see the file COPYING. If not, write to the Free 18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 19 02110-1301, USA. */ 20 21 #ifndef HASH_H 22 #define HASH_H 23 24 struct string_tuple 25 { 26 const char *key; 27 const void *value; 28 }; 29 30 typedef struct string_tuple string_tuple_t; 31 32 /* Hash function for a string_tuple. */ 33 34 extern hashval_t hash_string_tuple (const void *); 35 36 /* Equality function for a string_tuple. */ 37 38 extern int eq_string_tuple (const void *, const void *); 39 40 /* Insert ELEMENT into HTAB. If REPLACE is non-zero existing elements 41 are overwritten. If ELEMENT already exists, a pointer to the slot 42 is returned. Otherwise NULL is returned. */ 43 44 extern void **htab_insert (htab_t, void * /* element */, int /* replace */); 45 46 /* Print statistics about a hash table. */ 47 48 extern void htab_print_statistics (FILE *f, const char *name, htab_t table); 49 50 /* Inline string hash table functions. */ 51 52 static inline string_tuple_t * 53 string_tuple_alloc (htab_t table, const char *key, const void *value) 54 { 55 string_tuple_t *tuple = table->alloc_f (1, sizeof (*tuple)); 56 tuple->key = key; 57 tuple->value = value; 58 return tuple; 59 } 60 61 static inline void * 62 str_hash_find (htab_t table, const char *key) 63 { 64 string_tuple_t needle = { key, NULL }; 65 string_tuple_t *tuple = htab_find (table, &needle); 66 return tuple != NULL ? (void *) tuple->value : NULL; 67 } 68 69 static inline void * 70 str_hash_find_n (htab_t table, const char *key, size_t n) 71 { 72 char *tmp = XNEWVEC (char, n + 1); 73 memcpy (tmp, key, n); 74 tmp[n] = '\0'; 75 string_tuple_t needle = { tmp, NULL }; 76 string_tuple_t *tuple = htab_find (table, &needle); 77 free (tmp); 78 return tuple != NULL ? (void *) tuple->value : NULL; 79 } 80 81 static inline void 82 str_hash_delete (htab_t table, const char *key) 83 { 84 string_tuple_t needle = { key, NULL }; 85 htab_remove_elt (table, &needle); 86 } 87 88 static inline void ** 89 str_hash_insert (htab_t table, const char *key, const void *value, int replace) 90 { 91 string_tuple_t *elt = string_tuple_alloc (table, key, value); 92 void **slot = htab_insert (table, elt, replace); 93 if (slot && !replace && table->free_f) 94 table->free_f (elt); 95 return slot; 96 } 97 98 static inline htab_t 99 str_htab_create (void) 100 { 101 return htab_create_alloc (16, hash_string_tuple, eq_string_tuple, 102 NULL, notes_calloc, NULL); 103 } 104 105 #endif /* HASH_H */ 106