(root)/
binutils-2.41/
gas/
hash.h
       1  /* hash.h -- header file for gas hash table routines
       2     Copyright (C) 1987-2023 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 */