Bug 548612 – g_strstr_len() should use memmem when available
authorBastien Nocera <hadess@hadess.net>
Thu, 28 Aug 2008 12:53:59 +0000 (12:53 +0000)
committerBastien Nocera <hadess@src.gnome.org>
Thu, 28 Aug 2008 12:53:59 +0000 (12:53 +0000)
2008-08-28  Bastien Nocera  <hadess@hadess.net>

Bug 548612 – g_strstr_len() should use memmem when available

* glib/tests/strfuncs.c (test_strstr):
* tests/string-test.c (main): Patch by Paolo Borelli
<pborelli@katamail.com> to move the tests to the right place,
and add more tests

* glib/gstrfuncs.c (g_strstr_len): Fix problem with memmem ignoring
nul-terminators in strings, and using the haystack_len instead

svn path=/trunk/; revision=7409

ChangeLog
glib/gstrfuncs.c
glib/tests/strfuncs.c
tests/string-test.c

index 24089ff3ee7d77d1c45893fa81d24f683bf7ba9f..b00ca1aa6bbaefb06935efd1d0bb913308c4e41f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-08-28  Bastien Nocera  <hadess@hadess.net>
+
+       Bug 548612 – g_strstr_len() should use memmem when available
+
+       * glib/tests/strfuncs.c (test_strstr):
+       * tests/string-test.c (main): Patch by Paolo Borelli
+       <pborelli@katamail.com> to move the tests to the right place,
+       and add more tests
+
+       * glib/gstrfuncs.c (g_strstr_len): Fix problem with memmem ignoring
+       nul-terminators in strings, and using the haystack_len instead
+
 2008-08-28  Bastien Nocera  <hadess@hadess.net>
 
        Bug 548612 – g_strstr_len() should use memmem when available
index a1e8c4c4af119327068341c4de2488f522916607..7c5e56d448673e2b2e0ea5d5f70618a2127f3b83 100644 (file)
@@ -2603,7 +2603,10 @@ g_strstr_len (const gchar *haystack,
   else
     {
 #ifdef HAVE_MEMMEM
-      return memmem (haystack, haystack_len, needle, strlen (needle));
+      size_t len;
+
+      len = MIN(haystack_len, strlen (haystack));
+      return memmem (haystack, len, needle, strlen (needle));
 #else
       const gchar *p = haystack;
       gsize needle_len = strlen (needle);
index 4915b40005aaae6087b2b16fac5581d6664f4ce8..a6a5f7ff2b8649f9d6b7027b0dcb9098779bf9fd 100644 (file)
@@ -556,10 +556,19 @@ test_strstr (void)
   res = g_strstr_len (haystack, 6, "FooBarFooBarFooBar");
   g_assert (res == NULL);
 
+  res = g_strstr_len (haystack, 3, "Bar");
+  g_assert (res == NULL);
+
   res = g_strstr_len (haystack, 6, "");
   g_assert (res == haystack);
+  g_assert_cmpstr (res, ==, "FooBarFooBarFoo");
 
   res = g_strstr_len (haystack, 6, "Bar");
+  g_assert (res == haystack + 3);
+  g_assert_cmpstr (res, ==, "BarFooBarFoo");
+
+  res = g_strstr_len (haystack, -1, "Bar");
+  g_assert (res == haystack + 3);
   g_assert_cmpstr (res, ==, "BarFooBarFoo");
 
   /* strrstr */
@@ -571,8 +580,10 @@ test_strstr (void)
 
   res = g_strrstr (haystack, "");
   g_assert (res == haystack);
+  g_assert_cmpstr (res, ==, "FooBarFooBarFoo");
 
   res = g_strrstr (haystack, "Bar");
+  g_assert (res == haystack + 9);
   g_assert_cmpstr (res, ==, "BarFoo");
 
   /* strrstr_len */
@@ -582,9 +593,26 @@ test_strstr (void)
   res = g_strrstr_len (haystack, 14, "FooBarFooBarFooBar");
   g_assert (res == NULL);
 
+  res = g_strrstr_len (haystack, 3, "Bar");
+  g_assert (res == NULL);
+
   res = g_strrstr_len (haystack, 14, "BarFoo");
+  g_assert (res == haystack + 3);
   g_assert_cmpstr (res, ==, "BarFooBarFoo");
 
+  res = g_strrstr_len (haystack, 15, "BarFoo");
+  g_assert (res == haystack + 9);
+  g_assert_cmpstr (res, ==, "BarFoo");
+
+  res = g_strrstr_len (haystack, -1, "BarFoo");
+  g_assert (res == haystack + 9);
+  g_assert_cmpstr (res, ==, "BarFoo");
+
+  /* test case for strings with \0 in the middle */
+  *(haystack + 7) = '\0';
+  res = g_strstr_len (haystack, 15, "BarFoo");
+  g_assert (res == NULL);
+
   g_free (haystack);
 }
 
index d8aa728d3464aeb079a087307cb7028d6da32ae3..7da4128f16a5c6019fb283609889e9e2e5a76a69 100644 (file)
@@ -307,11 +307,6 @@ main (int   argc,
   g_assert (strcmp (tmp_string, "b a") == 0);
   g_free (tmp_string);
 
-  tmp_string = g_strdup (GLIB_TEST_STRING);
-  g_assert (g_strstr_len (tmp_string, 4, "rado") == NULL);
-  g_assert (g_strstr_len (tmp_string, -1, "rado") == tmp_string + 5);
-  g_free (tmp_string);
-
   return 0;
 }