| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- From 52738dcd0f522b16653cc8b21adfcb758702f2ab Mon Sep 17 00:00:00 2001
- From: Bruno Haible <[email protected]>
- Date: Wed, 30 Apr 2025 01:20:17 +0200
- Subject: [PATCH] New module hashkey-string.
- * lib/hashkey-string.h: New file.
- * lib/hashkey-string.c: New file, based on lib/clean-temp-simple.c.
- * modules/hashkey-string: New file.
- * lib/clean-temp-simple.c: Include hashkey-string.h. Don't include
- <limits.h>.
- (clean_temp_string_equals, clean_temp_string_hash): Remove functions.
- (SIZE_BITS): Remove macro.
- (register_temporary_file): Use hashkey_string_equals and
- hashkey_string_hash.
- * modules/clean-temp-simple (Depends-on): Add hashkey-string.
- ---
- ChangeLog | 14 ++++++++++++
- lib/clean-temp-simple.c | 33 +++------------------------
- lib/hashkey-string.c | 48 +++++++++++++++++++++++++++++++++++++++
- lib/hashkey-string.h | 35 ++++++++++++++++++++++++++++
- modules/clean-temp-simple | 1 +
- modules/hashkey-string | 23 +++++++++++++++++++
- 6 files changed, 124 insertions(+), 30 deletions(-)
- create mode 100644 lib/hashkey-string.c
- create mode 100644 lib/hashkey-string.h
- create mode 100644 modules/hashkey-string
- --- a/lib/clean-temp-simple.c
- +++ b/lib/clean-temp-simple.c
- @@ -22,7 +22,6 @@
- #include "clean-temp-private.h"
-
- #include <errno.h>
- -#include <limits.h>
- #include <signal.h>
- #include <stdlib.h>
- #include <string.h>
- @@ -36,6 +35,7 @@
- #include "thread-optim.h"
- #include "gl_list.h"
- #include "gl_linkedhash_list.h"
- +#include "hashkey-string.h"
- #include "gettext.h"
-
- #define _(msgid) dgettext ("gnulib", msgid)
- @@ -106,33 +106,6 @@ gl_list_t /* <closeable_fd *> */ volatil
- asynchronous signal.
- */
-
- -/* String equality and hash code functions used by the lists. */
- -
- -bool
- -clean_temp_string_equals (const void *x1, const void *x2)
- -{
- - const char *s1 = (const char *) x1;
- - const char *s2 = (const char *) x2;
- - return strcmp (s1, s2) == 0;
- -}
- -
- -#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
- -
- -/* A hash function for NUL-terminated char* strings using
- - the method described by Bruno Haible.
- - See https://www.haible.de/bruno/hashfunc.html. */
- -size_t
- -clean_temp_string_hash (const void *x)
- -{
- - const char *s = (const char *) x;
- - size_t h = 0;
- -
- - for (; *s; s++)
- - h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
- -
- - return h;
- -}
- -
-
- /* The set of fatal signal handlers.
- Cached here because we are not allowed to call get_fatal_signal_set ()
- @@ -326,8 +299,8 @@ register_temporary_file (const char *abs
- }
- file_cleanup_list =
- gl_list_nx_create_empty (GL_LINKEDHASH_LIST,
- - clean_temp_string_equals,
- - clean_temp_string_hash,
- + hashkey_string_equals,
- + hashkey_string_hash,
- NULL, false);
- if (file_cleanup_list == NULL)
- {
- --- /dev/null
- +++ b/lib/hashkey-string.c
- @@ -0,0 +1,48 @@
- +/* Support for using a string as a hash key.
- + Copyright (C) 2006-2025 Free Software Foundation, Inc.
- +
- + This file 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 file 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/>. */
- +
- +#include <config.h>
- +
- +/* Specification. */
- +#include "hashkey-string.h"
- +
- +#include <limits.h>
- +#include <string.h>
- +
- +bool
- +hashkey_string_equals (const void *x1, const void *x2)
- +{
- + const char *s1 = (const char *) x1;
- + const char *s2 = (const char *) x2;
- + return strcmp (s1, s2) == 0;
- +}
- +
- +#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
- +
- +/* A hash function for NUL-terminated 'const char *' strings using
- + the method described by Bruno Haible.
- + See https://www.haible.de/bruno/hashfunc.html. */
- +size_t
- +hashkey_string_hash (const void *x)
- +{
- + const char *s = (const char *) x;
- + size_t h = 0;
- +
- + for (; *s; s++)
- + h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
- +
- + return h;
- +}
- --- /dev/null
- +++ b/lib/hashkey-string.h
- @@ -0,0 +1,35 @@
- +/* Support for using a string as a hash key.
- + Copyright (C) 2006-2025 Free Software Foundation, Inc.
- +
- + This file 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 file 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 _GL_HASHKEY_STRING_H
- +#define _GL_HASHKEY_STRING_H
- +
- +#include <stddef.h>
- +
- +#ifdef __cplusplus
- +extern "C" {
- +#endif
- +
- +/* String equality and hash code functions that operate on plain C strings
- + ('const char *'). */
- +extern bool hashkey_string_equals (const void *x1, const void *x2);
- +extern size_t hashkey_string_hash (const void *x);
- +
- +#ifdef __cplusplus
- +}
- +#endif
- +
- +#endif /* _GL_HASHKEY_STRING_H */
- --- a/modules/clean-temp-simple
- +++ b/modules/clean-temp-simple
- @@ -19,6 +19,7 @@ error
- fatal-signal
- rmdir
- linkedhash-list
- +hashkey-string
- gettext-h
- gnulib-i18n
-
- --- /dev/null
- +++ b/modules/hashkey-string
- @@ -0,0 +1,23 @@
- +Description:
- +Support for using a string as a hash key in the hash-set and hash-map modules.
- +
- +Files:
- +lib/hashkey-string.h
- +lib/hashkey-string.c
- +
- +Depends-on:
- +bool
- +
- +configure.ac:
- +
- +Makefile.am:
- +lib_SOURCES += hashkey-string.h hashkey-string.c
- +
- +Include:
- +"hashkey-string.h"
- +
- +License:
- +LGPLv2+
- +
- +Maintainer:
- +all
|