From 714d6155710c201562f2cdd78127c2fc59aebf43 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Duraffort?= Date: Tue, 24 Nov 2009 21:57:00 +0100 Subject: [PATCH] compat: implement tdestroy (GNU extension not available on OpenBSD). --- compat/tdestroy.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 2 +- include/vlc_fixups.h | 5 +++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 compat/tdestroy.c diff --git a/compat/tdestroy.c b/compat/tdestroy.c new file mode 100644 index 0000000000..1baeec22fb --- /dev/null +++ b/compat/tdestroy.c @@ -0,0 +1,52 @@ +/***************************************************************************** + * tdestroy.c: GNU tdestroy() replacement + ***************************************************************************** + * Copyright © 1998-2009 the VideoLAN project + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +typedef struct node_t +{ + void *key; + struct node_t *left, *right; +} node; + +static void tdestroy_recurse (node *root, __free_fn_t freefct) +{ + if (root->left != NULL) + tdestroy_recurse (root->left, freefct); + if (root->right != NULL) + tdestroy_recurse (root->right, freefct); + (*freefct) ((void *) root->key); + /* Free the node itself. */ + free (root); +} + +void tdestroy (void *vroot, __free_fn_t freefct) +{ + node *root = (node *) vroot; + if (root != NULL) { + tdestroy_recurse (root, freefct); + } +} + diff --git a/configure.ac b/configure.ac index 154a5ba7bd..e24c595fb4 100644 --- a/configure.ac +++ b/configure.ac @@ -582,7 +582,7 @@ need_libc=false dnl Check for usual libc functions AC_CHECK_FUNCS([gettimeofday isatty sigrelse getpwuid_r memalign posix_memalign if_nametoindex getenv putenv setenv ctime_r daemon fork lstat posix_fadvise posix_madvise uselocale]) AC_CHECK_FUNCS(fcntl) -AC_REPLACE_FUNCS([asprintf atof atoll getcwd getpid gmtime_r lldiv localtime_r rewind strcasecmp strcasestr strdup strlcpy strncasecmp strndup strnlen strsep strtof strtok_r strtoll vasprintf swab]) +AC_REPLACE_FUNCS([asprintf atof atoll getcwd getpid gmtime_r lldiv localtime_r rewind strcasecmp strcasestr strdup strlcpy strncasecmp strndup strnlen strsep strtof strtok_r strtoll vasprintf swab tdestroy]) AC_CHECK_FUNCS([stricmp strnicmp]) AC_CHECK_FUNCS(fdatasync,, [AC_DEFINE(fdatasync, fsync, [Alias fdatasync() to fsync() if missing.]) diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h index e0ebdb0174..3512029d9c 100644 --- a/include/vlc_fixups.h +++ b/include/vlc_fixups.h @@ -204,4 +204,9 @@ static inline locale_t newlocale(int mask, const char * locale, locale_t base) void swab (const void *, void *, ssize_t); #endif +#ifndef HAVE_TDESTROY +typedef void (*__free_fn_t) (void *__nodep); +void tdestroy (void *vroot, __free_fn_t freefct); +#endif + #endif /* !LIBVLC_FIXUPS_H */ -- 2.39.2