unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH] Add simplistic reimplementation of strcasestr to compat library
@ 2010-04-13  4:10 Dirk Hohndel
  2010-04-13  4:20 ` Tomas Carnecky
  2010-04-13  5:59 ` Anthony Towns
  0 siblings, 2 replies; 4+ messages in thread
From: Dirk Hohndel @ 2010-04-13  4:10 UTC (permalink / raw
  To: notmuch


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>
---
 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

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] Add simplistic reimplementation of strcasestr to compat library
  2010-04-13  4:10 [PATCH] Add simplistic reimplementation of strcasestr to compat library Dirk Hohndel
@ 2010-04-13  4:20 ` Tomas Carnecky
  2010-04-13  5:59 ` Anthony Towns
  1 sibling, 0 replies; 4+ messages in thread
From: Tomas Carnecky @ 2010-04-13  4:20 UTC (permalink / raw
  To: Dirk Hohndel; +Cc: notmuch

On 4/13/10 6:10 AM, Dirk Hohndel wrote:
>
> 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.

Your patch is missing the part where it adds -DHAVE_STRCASESTR=.. to 
CONFIGURE_C{XX,}FLAGS.

And I still have to figure out the licencing of my patch (need to wait 
for the original author to respond). So maybe your patch, with the 
missing parts added, is better.

tom

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Add simplistic reimplementation of strcasestr to compat  library
  2010-04-13  4:10 [PATCH] Add simplistic reimplementation of strcasestr to compat library Dirk Hohndel
  2010-04-13  4:20 ` Tomas Carnecky
@ 2010-04-13  5:59 ` Anthony Towns
  2010-04-13 12:42   ` Dirk Hohndel
  1 sibling, 1 reply; 4+ messages in thread
From: Anthony Towns @ 2010-04-13  5:59 UTC (permalink / raw
  To: Dirk Hohndel; +Cc: notmuch

On Tue, Apr 13, 2010 at 14:10, Dirk Hohndel <hohndel@infradead.org> wrote:
> +/* 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... */

Dunno if this is a question from the original source, but the answer
if anyone's interested is probably because C doesn't have templates --
you'd ideally like to have it treated as:

    char *strcasestr(char *haystack, const char *needle);

for when you're doing a search and replace on the needle (say), and:

    const char *strcasestr(const char *haystack, const char *needle);

for when you're doing a search for the needle in something you can't
modify. But C isn't clever enough to let you say that with just one
function (and no fancy #defines), so you have to drop some of the
typechecking with the (char*) cast on the return value if you want to
handle both use cases, without the compiler complaining about
const->non-const conversions in otherwise correct code in one case or
the other.

Cheers,
aj

-- 
Anthony Towns <aj@erisian.com.au>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Add simplistic reimplementation of strcasestr to compat  library
  2010-04-13  5:59 ` Anthony Towns
@ 2010-04-13 12:42   ` Dirk Hohndel
  0 siblings, 0 replies; 4+ messages in thread
From: Dirk Hohndel @ 2010-04-13 12:42 UTC (permalink / raw
  To: Anthony Towns; +Cc: notmuch

On Tue, 13 Apr 2010 15:59:24 +1000, Anthony Towns <aj@erisian.com.au> wrote:
> On Tue, Apr 13, 2010 at 14:10, Dirk Hohndel <hohndel@infradead.org> wrote:
> > +/* 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... */
> 
> Dunno if this is a question from the original source, but the answer

No, that was me being puzzled :-)

> if anyone's interested is probably because C doesn't have templates --
> you'd ideally like to have it treated as:
> 
>     char *strcasestr(char *haystack, const char *needle);
> 
> for when you're doing a search and replace on the needle (say), and:
> 
>     const char *strcasestr(const char *haystack, const char *needle);
> 
> for when you're doing a search for the needle in something you can't
> modify. But C isn't clever enough to let you say that with just one
> function (and no fancy #defines), so you have to drop some of the
> typechecking with the (char*) cast on the return value if you want to
> handle both use cases, without the compiler complaining about
> const->non-const conversions in otherwise correct code in one case or
> the other.

That makes sense. Thanks

/D

-- 
Dirk Hohndel
Intel Open Source Technology Center

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-04-13 12:42 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-13  4:10 [PATCH] Add simplistic reimplementation of strcasestr to compat library Dirk Hohndel
2010-04-13  4:20 ` Tomas Carnecky
2010-04-13  5:59 ` Anthony Towns
2010-04-13 12:42   ` Dirk Hohndel

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).