From: Bruno Haible Date: Tue, 29 Apr 2025 23:20:17 +0000 (+0200) Subject: New module hashkey-string. X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=52738dcd0f522b16653cc8b21adfcb758702f2ab;p=gnulib.git 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 . (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. --- diff --git a/ChangeLog b/ChangeLog index 6a39c93bda..6314db2094 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2025-04-29 Bruno Haible + + 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 + . + (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. + 2025-04-29 Bruno Haible Rename include file hash-triple.h to hashcode-file.h. diff --git a/lib/clean-temp-simple.c b/lib/clean-temp-simple.c index a6e42b3549..727ff559f2 100644 --- a/lib/clean-temp-simple.c +++ b/lib/clean-temp-simple.c @@ -22,7 +22,6 @@ #include "clean-temp-private.h" #include -#include #include #include #include @@ -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 /* */ volatile descriptors; 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 *absolute_file_name) } 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) { diff --git a/lib/hashkey-string.c b/lib/hashkey-string.c new file mode 100644 index 0000000000..7517780d5f --- /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 . */ + +#include + +/* Specification. */ +#include "hashkey-string.h" + +#include +#include + +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; +} diff --git a/lib/hashkey-string.h b/lib/hashkey-string.h new file mode 100644 index 0000000000..1f3cb6f904 --- /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 . */ + +#ifndef _GL_HASHKEY_STRING_H +#define _GL_HASHKEY_STRING_H + +#include + +#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 */ diff --git a/modules/clean-temp-simple b/modules/clean-temp-simple index 3ee4560ba5..1517342a30 100644 --- 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 diff --git a/modules/hashkey-string b/modules/hashkey-string new file mode 100644 index 0000000000..8391b4576b --- /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