mirror of https://github.com/postgres/postgres
Add port/ replacement for strsep()
from OpenBSD, similar to strlcat, strlcpy There are currently no uses, but some will be added soon. Reviewed-by: Kyotaro Horiguchi <horikyota.ntt@gmail.com> Reviewed-by: David Steele <david@pgmasters.net> Discussion: https://www.postgresql.org/message-id/flat/79692bf9-17d3-41e6-b9c9-fc8c3944222a@eisentraut.org
This commit is contained in:
parent
7e187a7386
commit
683be87fbb
|
@ -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"
|
||||
|
|
|
@ -1795,7 +1795,7 @@ AC_CHECK_DECLS(posix_fadvise, [], [], [#include <fcntl.h>])
|
|||
]) # fi
|
||||
|
||||
AC_CHECK_DECLS(fdatasync, [], [], [#include <unistd.h>])
|
||||
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)
|
||||
|
|
|
@ -2417,6 +2417,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
|
||||
|
@ -2685,6 +2686,7 @@ func_checks = [
|
|||
['strlcat'],
|
||||
['strlcpy'],
|
||||
['strnlen'],
|
||||
['strsep'],
|
||||
['strsignal'],
|
||||
['sync_file_range'],
|
||||
['syncfs'],
|
||||
|
|
|
@ -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 <editline/history.h> 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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -70,6 +70,7 @@ replace_funcs_neg = [
|
|||
['strlcat'],
|
||||
['strlcpy'],
|
||||
['strnlen'],
|
||||
['strsep'],
|
||||
]
|
||||
|
||||
if host_system != 'windows'
|
||||
|
|
|
@ -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 */
|
||||
}
|
Loading…
Reference in New Issue