mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 12:28:09 +01:00
Add simplistic reimplementation of strcasestr to compat library
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@infradead.org> Tested-by: Tomas Carnecky <tom@dbservice.com> (on OpenSolaris snv_134)
This commit is contained in:
parent
25f3185ad0
commit
d09154465a
5 changed files with 76 additions and 2 deletions
|
@ -8,3 +8,7 @@ notmuch_compat_srcs :=
|
||||||
ifneq ($(HAVE_GETLINE),1)
|
ifneq ($(HAVE_GETLINE),1)
|
||||||
notmuch_compat_srcs += $(dir)/getline.c $(dir)/getdelim.c
|
notmuch_compat_srcs += $(dir)/getline.c $(dir)/getdelim.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($(HAVE_STRCASESTR),1)
|
||||||
|
notmuch_compat_srcs += $(dir)/strcasestr.c
|
||||||
|
endif
|
||||||
|
|
|
@ -38,4 +38,8 @@ getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp);
|
||||||
|
|
||||||
#endif /* !HAVE_GETLINE */
|
#endif /* !HAVE_GETLINE */
|
||||||
|
|
||||||
|
#if !HAVE_STRCASESTR
|
||||||
|
char* strcasestr(const char *haystack, const char *needle);
|
||||||
|
#endif /* !HAVE_STRCASESTR */
|
||||||
|
|
||||||
#endif /* NOTMUCH_COMPAT_H */
|
#endif /* NOTMUCH_COMPAT_H */
|
||||||
|
|
10
compat/have_strcasestr.c
Normal file
10
compat/have_strcasestr.c
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <strings.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
char *found;
|
||||||
|
const char *haystack, *needle;
|
||||||
|
|
||||||
|
found = strcasestr(haystack, needle);
|
||||||
|
}
|
40
compat/strcasestr.c
Normal file
40
compat/strcasestr.c
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* 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. */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "compat.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;
|
||||||
|
}
|
20
configure
vendored
20
configure
vendored
|
@ -310,6 +310,17 @@ else
|
||||||
fi
|
fi
|
||||||
rm -f compat/have_getline
|
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
|
cat <<EOF
|
||||||
|
|
||||||
All required packages were found. You may now run the following
|
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)
|
# build its own version)
|
||||||
HAVE_GETLINE = ${have_getline}
|
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
|
# Flags needed to compile and link against Xapian
|
||||||
XAPIAN_CXXFLAGS = ${xapian_cxxflags}
|
XAPIAN_CXXFLAGS = ${xapian_cxxflags}
|
||||||
XAPIAN_LDFLAGS = ${xapian_ldflags}
|
XAPIAN_LDFLAGS = ${xapian_ldflags}
|
||||||
|
@ -405,9 +420,10 @@ VALGRIND_CFLAGS = ${valgrind_cflags}
|
||||||
# Combined flags for compiling and linking against all of the above
|
# Combined flags for compiling and linking against all of the above
|
||||||
CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
|
CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
|
||||||
\$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
|
\$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
|
||||||
\$(VALGRIND_CFLAGS)
|
\$(VALGRIND_CFLAGS) -DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
|
||||||
CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
|
CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS) \\
|
||||||
\$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
|
\$(TALLOC_CFLAGS) -DHAVE_VALGRIND=\$(HAVE_VALGRIND) \\
|
||||||
\$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS)
|
\$(VALGRIND_CFLAGS) \$(XAPIAN_CXXFLAGS) \\
|
||||||
|
-DHAVE_STRCASESTR=\$(HAVE_STRCASESTR)
|
||||||
CONFIGURE_LDFLAGS = \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(XAPIAN_LDFLAGS)
|
CONFIGURE_LDFLAGS = \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(XAPIAN_LDFLAGS)
|
||||||
EOF
|
EOF
|
||||||
|
|
Loading…
Reference in a new issue