From 60fb67079ebd868e1053181e73792704c3db17ef Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Thu, 9 Jan 2014 22:02:06 -0800 Subject: [PATCH] [master] add isc_string_strcasestr for portability --- configure | 11 +++++++- configure.in | 4 +++ lib/isc/include/isc/string.h | 7 +++++ lib/isc/string.c | 54 +++++++++++++++++++++++++++++++++++- lib/isc/win32/libisc.def.in | 1 + 5 files changed, 75 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 4d8b97deda..2e4961e837 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# Copyright (C) 2004-2013 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004-2014 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1996-2003 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any @@ -1230,6 +1230,7 @@ ISC_PLATFORM_NEEDVSNPRINTF LWRES_PLATFORM_NEEDSPRINTF ISC_PLATFORM_NEEDSPRINTF READLINE_LIB +ISC_PLATFORM_NEEDSTRCASESTR ISC_PLATFORM_NEEDSTRLCAT ISC_PLATFORM_NEEDSTRLCPY GENRANDOMLIB @@ -17913,6 +17914,14 @@ fi +ac_fn_c_check_func "$LINENO" "strcasestr" "ac_cv_func_strcasestr" +if test "x$ac_cv_func_strcasestr" = xyes; then : + ISC_PLATFORM_NEEDSTRCASESTR="#undef ISC_PLATFORM_NEEDSTRCASESTR" +else + ISC_PLATFORM_NEEDSTRCASESTR="#define ISC_PLATFORM_NEEDSTRCASESTR 1" +fi + + diff --git a/configure.in b/configure.in index b6d49ae4bc..a9c99bb307 100644 --- a/configure.in +++ b/configure.in @@ -2504,6 +2504,10 @@ AC_CHECK_FUNC(strlcat, [ISC_PLATFORM_NEEDSTRLCAT="#define ISC_PLATFORM_NEEDSTRLCAT 1"]) AC_SUBST(ISC_PLATFORM_NEEDSTRLCAT) +AC_CHECK_FUNC(strcasestr, + [ISC_PLATFORM_NEEDSTRCASESTR="#undef ISC_PLATFORM_NEEDSTRCASESTR"], + [ISC_PLATFORM_NEEDSTRCASESTR="#define ISC_PLATFORM_NEEDSTRCASESTR 1"]) +AC_SUBST(ISC_PLATFORM_NEEDSTRCASESTR) AC_SUBST(READLINE_LIB) AC_ARG_WITH(readline, diff --git a/lib/isc/include/isc/string.h b/lib/isc/include/isc/string.h index b49fdbc327..7d0a1cd4aa 100644 --- a/lib/isc/include/isc/string.h +++ b/lib/isc/include/isc/string.h @@ -226,6 +226,13 @@ isc_string_strlcat(char *dst, const char *src, size_t size); #define strlcat isc_string_strlcat #endif +char * +isc_string_strcasestr(const char *big, const char *little); + +#ifdef ISC_PLATFORM_NEEDSTRCASESTR +#define strrcasestr isc_string_strrcasestr +#endif + ISC_LANG_ENDDECLS #endif /* ISC_STRING_H */ diff --git a/lib/isc/string.c b/lib/isc/string.c index a35f378b58..aa49e32fec 100644 --- a/lib/isc/string.c +++ b/lib/isc/string.c @@ -15,7 +15,38 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id$ */ +/* + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. 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. + */ /*! \file */ @@ -269,3 +300,24 @@ isc_string_strlcat(char *dst, const char *src, size_t size) return(dlen + (s - src)); /* count does not include NUL */ } + +char * +isc_string_strcasestr(const char *str, const char *search) { + char c, sc, *s; + size_t len; + + if ((c = *search++) != 0) { + c = tolower((unsigned char) c); + len = strlen(search); + do { + do { + if ((sc = *str++) == 0) + return (NULL); + } while ((char) tolower((unsigned char) sc) != c); + } while (strncasecmp(str, search, len) != 0); + str--; + } + DE_CONST(str, s); + return (s); + +} diff --git a/lib/isc/win32/libisc.def.in b/lib/isc/win32/libisc.def.in index dd35168ea6..fa4b70cdcd 100644 --- a/lib/isc/win32/libisc.def.in +++ b/lib/isc/win32/libisc.def.in @@ -530,6 +530,7 @@ isc_string_printf isc_string_printf_truncate isc_string_regiondup isc_string_separate +isc_string_strcasestr isc_string_strlcat isc_string_strlcpy isc_string_touint64