> Le 9 sept. 2019 à 16:05, Bruno Haible <br...@clisp.org> a écrit : > > Hi Akim,
Hi! >> * modules/hash (Depends-on): Add xalloc. >> * lib/hash.h, lib/hash.c (hash_xinitialize): New. > > This patch produces gnulib-tool warnings: > > $ ./gnulib-tool --test hash > gnulib-tool: warning: module hash depends on a module with an incompatible > license: error > gnulib-tool: warning: module hash depends on a module with an incompatible > license: getprogname > gnulib-tool: warning: module hash depends on a module with an incompatible > license: xalloc > gnulib-tool: warning: module hash depends on a module with an incompatible > license: xalloc-die > ... > > What gnulib-tool is telling you is that the module 'hash' has a license > that makes it suitable for use in libraries. Adding a dependency to 'xalloc' > to it can't be done in this module, because library code should never > call xalloc_die(). Wow! Nice feature! Note that the hash module claims LGPLv2+, but the header of hash.[ch] is about GPLv3+. > The fix is to create a new module, with prefix 'x', that adds the > function. You can leave it declared in hash.h; this is not a problem. > But it needs to be defined in a different compilation unit. > > For a model of this idiom, look at the modules 'concat-filename' > and 'xconcat-filename'. Thanks for the hint; below is my updated proposal (which passes its test :). I see that xconcat-filename is about xconcat_filename; I stayed with hash_initialize instead of xhash_initialize, but I can change that, of course. Also, contrary to the case of xconcat-filename, I have not put hash.h in the Files of xhash, because I see hash.h as a part of hash, not xhash. And I shamelessly decided to put the maintenance burden on Jim's shoulders. commit 734cd738f062ccbc53126d593e5ae977d77d6ee6 Author: Akim Demaille <akim.demai...@gmail.com> Date: Mon Sep 9 08:31:33 2019 +0200 xhash: provide hash_xinitialize Suggested by Egor Pugin <egor.pu...@gmail.com> https://lists.gnu.org/archive/html/bison-patches/2019-09/msg00026.html * modules/xhash, lib/xhash.c: New. * lib/hash.h (hash_xinitialize): New. diff --git a/ChangeLog b/ChangeLog index 5c226ce43..6969156e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2019-09-09 Akim Demaille <a...@lrde.epita.fr> + + xhash: provide hash_xinitialize. + Suggested by Egor Pugin <egor.pu...@gmail.com> + https://lists.gnu.org/archive/html/bison-patches/2019-09/msg00026.html + * modules/xhash, lib/xhash.c: New. + * lib/hash.h (hash_xinitialize): New. + 2019-09-06 Akim Demaille <a...@lrde.epita.fr> bitset: style changes diff --git a/lib/hash.h b/lib/hash.h index a1a483a35..8f2e4591f 100644 --- a/lib/hash.h +++ b/lib/hash.h @@ -89,6 +89,9 @@ void hash_reset_tuning (Hash_tuning *); Hash_table *hash_initialize (size_t, const Hash_tuning *, Hash_hasher, Hash_comparator, Hash_data_freer) _GL_ATTRIBUTE_WUR; +Hash_table *hash_xinitialize (size_t, const Hash_tuning *, + Hash_hasher, Hash_comparator, + Hash_data_freer) _GL_ATTRIBUTE_WUR; void hash_clear (Hash_table *); void hash_free (Hash_table *); diff --git a/lib/xhash.c b/lib/xhash.c new file mode 100644 index 000000000..9b2bcdbb4 --- /dev/null +++ b/lib/xhash.c @@ -0,0 +1,38 @@ +/* hash - hashing table processing. + + Copyright (C) 2019 Free Software Foundation, Inc. + + 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 "hash.h" + +#include "xalloc.h" + +/* Same as hash_initialize, but invokes xalloc_die on memory + exhaustion. */ + +Hash_table * +hash_xinitialize (size_t candidate, const Hash_tuning *tuning, + Hash_hasher hasher, Hash_comparator comparator, + Hash_data_freer data_freer) +{ + Hash_table *res = + hash_initialize (candidate, tuning, hasher, comparator, data_freer); + if (!res) + xalloc_die (); + return res; +} diff --git a/modules/xhash b/modules/xhash new file mode 100644 index 000000000..2e74c718f --- /dev/null +++ b/modules/xhash @@ -0,0 +1,23 @@ +Description: +Parameterizable hash table, with out-of-memory checking. + +Files: +lib/xhash.c + +Depends-on: +hash +xalloc + +configure.ac: + +Makefile.am: +lib_SOURCES += xhash.c + +Include: +"hash.h" + +License: +GPLv3+ + +Maintainer: +Jim Meyering