While all systems that I have access to support strcasestr, it is in fact not part of POSIX. So here's a fallback reimplementation based on POSIX functions.
Signed-off-by: Dirk Hohndel <hohndel at infradead.org> --- compat/Makefile.local | 4 ++++ compat/have_strcasestr.c | 10 ++++++++++ compat/strcasestr.c | 41 +++++++++++++++++++++++++++++++++++++++++ configure | 15 +++++++++++++++ 4 files changed, 70 insertions(+), 0 deletions(-) create mode 100644 compat/have_strcasestr.c create mode 100644 compat/strcasestr.c diff --git a/compat/Makefile.local b/compat/Makefile.local index 81e6c70..2a52a14 100644 --- a/compat/Makefile.local +++ b/compat/Makefile.local @@ -8,3 +8,7 @@ notmuch_compat_srcs = ifneq ($(HAVE_GETLINE),1) notmuch_compat_srcs += $(dir)/getline.c $(dir)/getdelim.c endif + +ifneq ($(HAVE_STRCASESTR),1) +notmuch_compat_srcs += $(dir)/strcasestr.c +endif \ No newline at end of file diff --git a/compat/have_strcasestr.c b/compat/have_strcasestr.c new file mode 100644 index 0000000..c0fb762 --- /dev/null +++ b/compat/have_strcasestr.c @@ -0,0 +1,10 @@ +#define _GNU_SOURCE +#include <strings.h> + +int main() +{ + char *found; + const char *haystack, *needle; + + found = strcasestr(haystack, needle); +} diff --git a/compat/strcasestr.c b/compat/strcasestr.c new file mode 100644 index 0000000..50bc89d --- /dev/null +++ b/compat/strcasestr.c @@ -0,0 +1,41 @@ +/* + * slow simplistic reimplementation of strcasestr for systems that + * don't include it in their library + * + * based on a GPL implementation in OpenTTD found under GPL v2 + + 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, version 2. + + 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. */ + +/* Imported into notmuch by Dirk Hohndel - original author unknown. */ +/* the semantic here actually puzzles me: + how can haystack be const char * - yet the return value is char * + after all, it points to a sub-string of haystack... */ + +#include <string.h> + +char *strcasestr(const char *haystack, const char *needle) +{ + size_t hay_len = strlen(haystack); + size_t needle_len = strlen(needle); + while (hay_len >= needle_len) { + if (strncasecmp(haystack, needle, needle_len) == 0) + return (char *) haystack; + + haystack++; + hay_len--; + } + + return NULL; +} diff --git a/configure b/configure index 5af7852..023aa40 100755 --- a/configure +++ b/configure @@ -310,6 +310,17 @@ else fi rm -f compat/have_getline +printf "Checking for strcasestr... " +if ${CC} -o compat/have_strcasestr compat/have_strcasestr.c > /dev/null 2>&1 +then + printf "Yes.\n" + have_strcasestr=1 +else + printf "No (will use our own instead).\n" + have_strcasestr=0 +fi +rm -f compat/have_strcasestr + cat <<EOF All required packages were found. You may now run the following @@ -384,6 +395,10 @@ zsh_completion_dir = \$(prefix)/share/zsh/functions/Completion/Unix # build its own version) HAVE_GETLINE = ${have_getline} +# Whether the strcasestr function is available (if not, then notmuch will +# build its own version) +HAVE_STRCASESTR = ${have_strcasestr} + # Flags needed to compile and link against Xapian XAPIAN_CXXFLAGS = ${xapian_cxxflags} XAPIAN_LDFLAGS = ${xapian_ldflags} -- 1.6.6.1 -- Dirk Hohndel Intel Open Source Technology Center