]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
build: Take the mem-hash-map module from Gnulib now.
authorBruno Haible <bruno@clisp.org>
Wed, 30 Apr 2025 11:26:57 +0000 (13:26 +0200)
committerBruno Haible <bruno@clisp.org>
Wed, 30 Apr 2025 11:26:57 +0000 (13:26 +0200)
* gnulib-local/lib/mem-hash-map.h: Remove file.
* gnulib-local/lib/mem-hash-map.c: Remove file.
* gnulib-local/modules/mem-hash-map: Remove file.
* gnulib-local/Makefile.am (EXTRA_DIST): Remove them.

gnulib-local/Makefile.am
gnulib-local/lib/mem-hash-map.c [deleted file]
gnulib-local/lib/mem-hash-map.h [deleted file]
gnulib-local/modules/mem-hash-map [deleted file]

index 3cadc75ff9adfac2e7673eab080cafab84c37caf..71a5d260c70a8b70d3867e8d682883f31b7c8374 100644 (file)
@@ -137,8 +137,6 @@ lib/libxml/xpointer.c \
 lib/libxml/xpointer.in.h \
 lib/markup.c \
 lib/markup.h \
-lib/mem-hash-map.c \
-lib/mem-hash-map.h \
 lib/obstack.h.diff \
 lib/progname.h.diff \
 lib/regex_internal.h.diff \
@@ -161,7 +159,6 @@ modules/java \
 modules/libtextstyle-dummy \
 modules/libxml \
 modules/markup \
-modules/mem-hash-map \
 modules/modula2 \
 modules/xerror \
 modules/xgetcwd.diff
diff --git a/gnulib-local/lib/mem-hash-map.c b/gnulib-local/lib/mem-hash-map.c
deleted file mode 100644 (file)
index b0c3d66..0000000
+++ /dev/null
@@ -1,383 +0,0 @@
-/* hash - implement simple hashing table where the keys are memory blocks.
-   Copyright (C) 1994-2024 Free Software Foundation, Inc.
-   Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, October 1994.
-
-   This program 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 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
-
-#include <config.h>
-
-/* Specification.  */
-#include "mem-hash-map.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <limits.h>
-#include <sys/types.h>
-
-/* Since this simple implementation of hash tables allows only insertion, no
-   removal of entries, the right data structure for the memory holding all keys
-   is an obstack.  */
-#include "obstack.h"
-
-/* Use checked memory allocation.  */
-#include "xalloc.h"
-
-#define obstack_chunk_alloc xmalloc
-#define obstack_chunk_free free
-
-
-typedef struct hash_entry
-{
-  unsigned long used;  /* Hash code of the key, or 0 for an unused entry.  */
-  const void *key;     /* Key.  */
-  size_t keylen;
-  void *data;          /* Value.  */
-  struct hash_entry *next;
-}
-hash_entry;
-
-
-/* Given an odd CANDIDATE > 1, return true if it is a prime number.  */
-static int
-is_prime (unsigned long int candidate)
-{
-  /* No even number and none less than 10 will be passed here.  */
-  unsigned long int divn = 3;
-  unsigned long int sq = divn * divn;
-
-  while (sq < candidate && candidate % divn != 0)
-    {
-      ++divn;
-      sq += 4 * divn;
-      ++divn;
-    }
-
-  return candidate % divn != 0;
-}
-
-
-/* Given SEED > 1, return the smallest odd prime number >= SEED.  */
-unsigned long
-next_prime (unsigned long int seed)
-{
-  /* Make it definitely odd.  */
-  seed |= 1;
-
-  while (!is_prime (seed))
-    seed += 2;
-
-  return seed;
-}
-
-
-/* Initialize a hash table.  INIT_SIZE > 1 is the initial number of available
-   entries.
-   Return 0 always.  */
-int
-hash_init (hash_table *htab, unsigned long int init_size)
-{
-  /* We need the size to be a prime.  */
-  init_size = next_prime (init_size);
-
-  /* Initialize the data structure.  */
-  htab->size = init_size;
-  htab->filled = 0;
-  htab->first = NULL;
-  htab->table = XCALLOC (init_size + 1, hash_entry);
-
-  obstack_init (&htab->mem_pool);
-
-  return 0;
-}
-
-
-/* Delete a hash table's contents.
-   Return 0 always.  */
-int
-hash_destroy (hash_table *htab)
-{
-  free (htab->table);
-  obstack_free (&htab->mem_pool, NULL);
-  return 0;
-}
-
-
-/* Compute a hash code for a key consisting of KEYLEN bytes starting at KEY
-   in memory.  */
-static unsigned long
-compute_hashval (const void *key, size_t keylen)
-{
-  size_t cnt;
-  unsigned long int hval;
-
-  /* Compute the hash value for the given string.  The algorithm
-     is taken from [Aho,Sethi,Ullman], fixed according to
-     https://haible.de/bruno/hashfunc.html.  */
-  cnt = 0;
-  hval = keylen;
-  while (cnt < keylen)
-    {
-      hval = (hval << 9) | (hval >> (sizeof (unsigned long) * CHAR_BIT - 9));
-      hval += (unsigned long int) *(((const char *) key) + cnt++);
-    }
-  return hval != 0 ? hval : ~((unsigned long) 0);
-}
-
-
-/* References:
-   [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986
-   [Knuth]            The Art of Computer Programming, part3 (6.4) */
-
-/* Look up a given key in the hash table.
-   Return the index of the entry, if present, or otherwise the index a free
-   entry where it could be inserted.  */
-static size_t
-lookup (const hash_table *htab,
-        const void *key, size_t keylen,
-        unsigned long int hval)
-{
-  unsigned long int hash;
-  size_t idx;
-  hash_entry *table = htab->table;
-
-  /* First hash function: simply take the modul but prevent zero.  */
-  hash = 1 + hval % htab->size;
-
-  idx = hash;
-
-  if (table[idx].used)
-    {
-      if (table[idx].used == hval && table[idx].keylen == keylen
-          && memcmp (table[idx].key, key, keylen) == 0)
-        return idx;
-
-      /* Second hash function as suggested in [Knuth].  */
-      hash = 1 + hval % (htab->size - 2);
-
-      do
-        {
-          if (idx <= hash)
-            idx = htab->size + idx - hash;
-          else
-            idx -= hash;
-
-          /* If entry is found use it.  */
-          if (table[idx].used == hval && table[idx].keylen == keylen
-              && memcmp (table[idx].key, key, keylen) == 0)
-            return idx;
-        }
-      while (table[idx].used);
-    }
-  return idx;
-}
-
-
-/* Look up the value of a key in the given table.
-   If found, return 0 and set *RESULT to it.  Otherwise return -1.  */
-int
-hash_find_entry (const hash_table *htab, const void *key, size_t keylen,
-                 void **result)
-{
-  hash_entry *table = htab->table;
-  size_t idx = lookup (htab, key, keylen, compute_hashval (key, keylen));
-
-  if (table[idx].used == 0)
-    return -1;
-
-  *result = table[idx].data;
-  return 0;
-}
-
-
-/* Insert the pair (KEY[0..KEYLEN-1], DATA) in the hash table at index IDX.
-   HVAL is the key's hash code.  IDX depends on it.  The table entry at index
-   IDX is known to be unused.  */
-static void
-insert_entry_2 (hash_table *htab,
-                const void *key, size_t keylen,
-                unsigned long int hval, size_t idx, void *data)
-{
-  hash_entry *table = htab->table;
-
-  table[idx].used = hval;
-  table[idx].key = key;
-  table[idx].keylen = keylen;
-  table[idx].data = data;
-
-  /* List the new value in the list.  */
-  if (htab->first == NULL)
-    {
-      table[idx].next = &table[idx];
-      htab->first = &table[idx];
-    }
-  else
-    {
-      table[idx].next = htab->first->next;
-      htab->first->next = &table[idx];
-      htab->first = &table[idx];
-    }
-
-  ++htab->filled;
-}
-
-
-/* Grow the hash table.  */
-static void
-resize (hash_table *htab)
-{
-  unsigned long int old_size = htab->size;
-  hash_entry *table = htab->table;
-  size_t idx;
-
-  htab->size = next_prime (htab->size * 2);
-  htab->filled = 0;
-  htab->first = NULL;
-  htab->table = XCALLOC (1 + htab->size, hash_entry);
-
-  for (idx = 1; idx <= old_size; ++idx)
-    if (table[idx].used)
-      insert_entry_2 (htab, table[idx].key, table[idx].keylen,
-                      table[idx].used,
-                      lookup (htab, table[idx].key, table[idx].keylen,
-                              table[idx].used),
-                      table[idx].data);
-
-  free (table);
-}
-
-
-/* Try to insert the pair (KEY[0..KEYLEN-1], DATA) in the hash table.
-   Return non-NULL (more precisely, the address of the KEY inside the table's
-   memory pool) if successful, or NULL if there is already an entry with the
-   given key.  */
-const void *
-hash_insert_entry (hash_table *htab,
-                   const void *key, size_t keylen,
-                   void *data)
-{
-  unsigned long int hval = compute_hashval (key, keylen);
-  hash_entry *table = htab->table;
-  size_t idx = lookup (htab, key, keylen, hval);
-
-  if (table[idx].used)
-    /* We don't want to overwrite the old value.  */
-    return NULL;
-  else
-    {
-      /* An empty bucket has been found.  */
-      void *keycopy = obstack_copy (&htab->mem_pool, key, keylen);
-      insert_entry_2 (htab, keycopy, keylen, hval, idx, data);
-      if (100 * htab->filled > 75 * htab->size)
-        /* Table is filled more than 75%.  Resize the table.  */
-        resize (htab);
-      return keycopy;
-    }
-}
-
-
-/* Insert the pair (KEY[0..KEYLEN-1], DATA) in the hash table.
-   Return 0.  */
-int
-hash_set_value (hash_table *htab,
-                const void *key, size_t keylen,
-                void *data)
-{
-  unsigned long int hval = compute_hashval (key, keylen);
-  hash_entry *table = htab->table;
-  size_t idx = lookup (htab, key, keylen, hval);
-
-  if (table[idx].used)
-    {
-      /* Overwrite the old value.  */
-      table[idx].data = data;
-      return 0;
-    }
-  else
-    {
-      /* An empty bucket has been found.  */
-      void *keycopy = obstack_copy (&htab->mem_pool, key, keylen);
-      insert_entry_2 (htab, keycopy, keylen, hval, idx, data);
-      if (100 * htab->filled > 75 * htab->size)
-        /* Table is filled more than 75%.  Resize the table.  */
-        resize (htab);
-      return 0;
-    }
-}
-
-
-/* Steps *PTR forward to the next used entry in the given hash table.  *PTR
-   should be initially set to NULL.  Store information about the next entry
-   in *KEY, *KEYLEN, *DATA.
-   Return 0 normally, -1 when the whole hash table has been traversed.  */
-int
-hash_iterate (hash_table *htab, void **ptr, const void **key, size_t *keylen,
-              void **data)
-{
-  hash_entry *curr;
-
-  if (*ptr == NULL)
-    {
-      if (htab->first == NULL)
-        return -1;
-      curr = htab->first;
-    }
-  else
-    {
-      if (*ptr == htab->first)
-        return -1;
-      curr = (hash_entry *) *ptr;
-    }
-  curr = curr->next;
-  *ptr = (void *) curr;
-
-  *key = curr->key;
-  *keylen = curr->keylen;
-  *data = curr->data;
-  return 0;
-}
-
-
-/* Steps *PTR forward to the next used entry in the given hash table.  *PTR
-   should be initially set to NULL.  Store information about the next entry
-   in *KEY, *KEYLEN, *DATAP.  *DATAP is set to point to the storage of the
-   value; modifying **DATAP will modify the value of the entry.
-   Return 0 normally, -1 when the whole hash table has been traversed.  */
-int
-hash_iterate_modify (hash_table *htab, void **ptr,
-                     const void **key, size_t *keylen,
-                     void ***datap)
-{
-  hash_entry *curr;
-
-  if (*ptr == NULL)
-    {
-      if (htab->first == NULL)
-        return -1;
-      curr = htab->first;
-    }
-  else
-    {
-      if (*ptr == htab->first)
-        return -1;
-      curr = (hash_entry *) *ptr;
-    }
-  curr = curr->next;
-  *ptr = (void *) curr;
-
-  *key = curr->key;
-  *keylen = curr->keylen;
-  *datap = &curr->data;
-  return 0;
-}
diff --git a/gnulib-local/lib/mem-hash-map.h b/gnulib-local/lib/mem-hash-map.h
deleted file mode 100644 (file)
index 9864812..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Copyright (C) 1995-2024 Free Software Foundation, Inc.
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU Lesser General Public License as published by
-   the Free Software Foundation; either version 2.1 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public License
-   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
-
-#ifndef _HASH_H
-#define _HASH_H
-
-#include "obstack.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct hash_entry;
-
-typedef struct hash_table
-{
-  unsigned long int size;   /* Number of allocated entries.  */
-  unsigned long int filled; /* Number of used entries.  */
-  struct hash_entry *first; /* Pointer to head of list of entries.  */
-  struct hash_entry *table; /* Pointer to array of entries.  */
-  struct obstack mem_pool;  /* Memory pool holding the keys.  */
-}
-hash_table;
-
-/* Initialize a hash table.  INIT_SIZE > 1 is the initial number of available
-   entries.
-   Return 0 always.  */
-extern int hash_init (hash_table *htab, unsigned long int init_size);
-
-/* Delete a hash table's contents.
-   Return 0 always.  */
-extern int hash_destroy (hash_table *htab);
-
-/* Look up the value of a key in the given table.
-   If found, return 0 and set *RESULT to it.  Otherwise return -1.  */
-extern int hash_find_entry (const hash_table *htab,
-                            const void *key, size_t keylen,
-                            void **result);
-
-/* Try to insert the pair (KEY[0..KEYLEN-1], DATA) in the hash table.
-   Return non-NULL (more precisely, the address of the KEY inside the table's
-   memory pool) if successful, or NULL if there is already an entry with the
-   given key.  */
-extern const void * hash_insert_entry (hash_table *htab,
-                                       const void *key, size_t keylen,
-                                       void *data);
-
-/* Insert the pair (KEY[0..KEYLEN-1], DATA) in the hash table.
-   Return 0.  */
-extern int hash_set_value (hash_table *htab,
-                           const void *key, size_t keylen,
-                           void *data);
-
-/* Steps *PTR forward to the next used entry in the given hash table.  *PTR
-   should be initially set to NULL.  Store information about the next entry
-   in *KEY, *KEYLEN, *DATA.
-   Return 0 normally, -1 when the whole hash table has been traversed.  */
-extern int hash_iterate (hash_table *htab, void **ptr,
-                         const void **key, size_t *keylen,
-                         void **data);
-
-/* Steps *PTR forward to the next used entry in the given hash table.  *PTR
-   should be initially set to NULL.  Store information about the next entry
-   in *KEY, *KEYLEN, *DATAP.  *DATAP is set to point to the storage of the
-   value; modifying **DATAP will modify the value of the entry.
-   Return 0 normally, -1 when the whole hash table has been traversed.  */
-extern int hash_iterate_modify (hash_table *htab, void **ptr,
-                                const void **key, size_t *keylen,
-                                void ***datap);
-
-/* Given SEED > 1, return the smallest odd prime number >= SEED.  */
-extern unsigned long int next_prime (unsigned long int seed);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* not _HASH_H */
diff --git a/gnulib-local/modules/mem-hash-map b/gnulib-local/modules/mem-hash-map
deleted file mode 100644 (file)
index 68ce5a7..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-Description:
-Simple hash table where the keys are memory blocks.
-
-Files:
-lib/mem-hash-map.h
-lib/mem-hash-map.c
-
-Depends-on:
-obstack
-xalloc
-
-configure.ac:
-
-Makefile.am:
-lib_SOURCES += mem-hash-map.h mem-hash-map.c
-
-Include:
-"mem-hash-map.h"
-
-License:
-GPL
-
-Maintainer:
-Bruno Haible