From da59e9395e77b8849b1a9700b610a601548ffdd7 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 13 Jun 2024 11:14:36 +0200 Subject: [PATCH v1 3/4] Add port/ replacement for strsep() from OpenBSD, similar to strlcat, strlcpy --- configure | 23 ++++++++++++ configure.ac | 3 +- meson.build | 2 + src/include/pg_config.h.in | 7 ++++ src/include/port.h | 4 ++ src/port/meson.build | 1 + src/port/strsep.c | 77 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 src/port/strsep.c diff --git a/configure b/configure index 7b03db56a67..90664858ba7 100755 --- a/configure +++ b/configure @@ -15778,6 +15778,16 @@ fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRNLEN $ac_have_decl _ACEOF +ac_fn_c_check_decl "$LINENO" "strsep" "ac_cv_have_decl_strsep" "$ac_includes_default" +if test "x$ac_cv_have_decl_strsep" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRSEP $ac_have_decl +_ACEOF # We can't use AC_CHECK_FUNCS to detect these functions, because it @@ -15925,6 +15935,19 @@ esac fi +ac_fn_c_check_func "$LINENO" "strsep" "ac_cv_func_strsep" +if test "x$ac_cv_func_strsep" = xyes; then : + $as_echo "#define HAVE_STRSEP 1" >>confdefs.h + +else + case " $LIBOBJS " in + *" strsep.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strsep.$ac_objext" + ;; +esac + +fi + ac_fn_c_check_func "$LINENO" "pthread_barrier_wait" "ac_cv_func_pthread_barrier_wait" diff --git a/configure.ac b/configure.ac index 63e7be38472..2fcb256123d 100644 --- a/configure.ac +++ b/configure.ac @@ -1795,7 +1795,7 @@ AC_CHECK_DECLS(posix_fadvise, [], [], [#include ]) ]) # fi AC_CHECK_DECLS(fdatasync, [], [], [#include ]) -AC_CHECK_DECLS([strlcat, strlcpy, strnlen]) +AC_CHECK_DECLS([strlcat, strlcpy, strnlen, strsep]) # We can't use AC_CHECK_FUNCS to detect these functions, because it # won't handle deployment target restrictions on macOS @@ -1814,6 +1814,7 @@ AC_REPLACE_FUNCS(m4_normalize([ strlcat strlcpy strnlen + strsep ])) AC_REPLACE_FUNCS(pthread_barrier_wait) diff --git a/meson.build b/meson.build index 2767abd19e2..7d021138e72 100644 --- a/meson.build +++ b/meson.build @@ -2326,6 +2326,7 @@ decl_checks = [ ['strlcat', 'string.h'], ['strlcpy', 'string.h'], ['strnlen', 'string.h'], + ['strsep', 'string.h'], ] # Need to check for function declarations for these functions, because @@ -2594,6 +2595,7 @@ func_checks = [ ['strlcat'], ['strlcpy'], ['strnlen'], + ['strsep'], ['strsignal'], ['sync_file_range'], ['syncfs'], diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index f8d3e3b6b84..9862739b8e8 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -127,6 +127,10 @@ don't. */ #undef HAVE_DECL_STRNLEN +/* Define to 1 if you have the declaration of `strsep', and to 0 if you don't. + */ +#undef HAVE_DECL_STRSEP + /* Define to 1 if you have the header file. */ #undef HAVE_EDITLINE_HISTORY_H @@ -414,6 +418,9 @@ /* Define to 1 if you have the `strnlen' function. */ #undef HAVE_STRNLEN +/* Define to 1 if you have the `strsep' function. */ +#undef HAVE_STRSEP + /* Define to 1 if you have the `strsignal' function. */ #undef HAVE_STRSIGNAL diff --git a/src/include/port.h b/src/include/port.h index ae115d2d970..c7400052675 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -432,6 +432,10 @@ extern size_t strlcpy(char *dst, const char *src, size_t siz); extern size_t strnlen(const char *str, size_t maxlen); #endif +#if !HAVE_DECL_STRSEP +extern char *strsep(char **stringp, const char *delim); +#endif + /* port/user.c */ #ifndef WIN32 extern bool pg_get_user_name(uid_t user_id, char *buffer, size_t buflen); diff --git a/src/port/meson.build b/src/port/meson.build index fd9ee199d1b..ff54b7b53e9 100644 --- a/src/port/meson.build +++ b/src/port/meson.build @@ -70,6 +70,7 @@ replace_funcs_neg = [ ['strlcat'], ['strlcpy'], ['strnlen'], + ['strsep'], ] if host_system != 'windows' diff --git a/src/port/strsep.c b/src/port/strsep.c new file mode 100644 index 00000000000..564125c5101 --- /dev/null +++ b/src/port/strsep.c @@ -0,0 +1,77 @@ +/* + * src/port/strsep.c + * + * $OpenBSD: strsep.c,v 1.8 2015/08/31 02:53:57 guenther Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "c.h" + +/* + * Get next token from string *stringp, where tokens are possibly-empty + * strings separated by characters from delim. + * + * Writes NULs into the string at *stringp to end tokens. + * delim need not remain constant from call to call. + * On return, *stringp points past the last NUL written (if there might + * be further tokens), or is NULL (if there are definitely no more tokens). + * + * If *stringp is NULL, strsep returns NULL. + */ +char * +strsep(char **stringp, const char *delim) +{ + char *s; + const char *spanp; + int c, + sc; + char *tok; + + if ((s = *stringp) == NULL) + return (NULL); + for (tok = s;;) + { + c = *s++; + spanp = delim; + do + { + if ((sc = *spanp++) == c) + { + if (c == 0) + s = NULL; + else + s[-1] = 0; + *stringp = s; + return (tok); + } + } while (sc != 0); + } + /* NOTREACHED */ +} -- 2.45.2