summaryrefslogtreecommitdiffstats
path: root/libgnu
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2017-03-31 19:23:29 +0200
committerUlf Hermann <ulf.hermann@qt.io>2017-05-04 12:24:08 +0000
commitf95af4ca39f5ff2073a2b0bc6e1bd0d3832b1a8f (patch)
treed1db164ddcdb1ba538c59397b86a95b10458f61c /libgnu
parent0d2c0bfbe284d715abc0885796436f1bf8e790db (diff)
Add our own tdestroy if search.h exposes a node_t struct
tdestroy is not necessarily available from search.h, but we need it. gnulib cannot help us here as it will detect search.h to be available and functional in that case. However, some search.h expose a node_t struct which can be used to implement tdestroy. If that is the case, add an implementation to libgnu.a. Change-Id: I983f3aeb6b9090d2b24cbc01fe0790d2d0c96824 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'libgnu')
-rw-r--r--libgnu/ChangeLog5
-rw-r--r--libgnu/Makefile.am6
-rw-r--r--libgnu/tdestroy.c47
3 files changed, 57 insertions, 1 deletions
diff --git a/libgnu/ChangeLog b/libgnu/ChangeLog
index 3394de6d..7b146b6c 100644
--- a/libgnu/ChangeLog
+++ b/libgnu/ChangeLog
@@ -1,5 +1,10 @@
2017-05-04 Ulf Hermann <ulf.hermann@qt.io>
+ * Makefile.am: Use our own implementation of tdestroy if we have to.
+ * tdestroy.c: New file.
+
+2017-05-04 Ulf Hermann <ulf.hermann@qt.io>
+
* Makefile.am: If GNU basename is unavailable add our own
implementation.
* basename-gnu.c: New file.
diff --git a/libgnu/Makefile.am b/libgnu/Makefile.am
index 32c9aa71..99abab0d 100644
--- a/libgnu/Makefile.am
+++ b/libgnu/Makefile.am
@@ -36,7 +36,7 @@ MOSTLYCLEANFILES =
MOSTLYCLEANDIRS =
BUILT_SOURCES =
EXTRA_DIST = endian.in.h byteswap.in.h sys_mman.win32.h mman_win32.c sysconf_win32.c ar.in.h features.in.h \
- stdio_ext.in.h fts.in.h basename-gnu.c
+ stdio_ext.in.h fts.in.h basename-gnu.c tdestroy.c
CLEANFILES =
SUFFIXES =
@@ -108,3 +108,7 @@ endif
if !HAVE_BASENAME
libgnu_a_SOURCES += basename-gnu.c
endif
+
+if USE_PRIVATE_TDESTROY
+libgnu_a_SOURCES += tdestroy.c
+endif
diff --git a/libgnu/tdestroy.c b/libgnu/tdestroy.c
new file mode 100644
index 00000000..d14b8756
--- /dev/null
+++ b/libgnu/tdestroy.c
@@ -0,0 +1,47 @@
+/* tdestroy, on systems where node is exposed from search.h
+ Copyright (C) 2017 The Qt Company Ltd.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils 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 copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+#define _SEARCH_PRIVATE
+#include <search.h>
+
+void
+tdestroy (void *vroot, void (*free_node)(void *nodep))
+{
+ if (vroot == NULL)
+ return;
+
+ node_t *root = (node_t *) vroot;
+ tdestroy (root->llink, free_node);
+ tdestroy (root->rlink, free_node);
+ free_node ((void *) root->key);
+ free (root);
+}
+