patch to change behavior of g_strsplit on empty string back to 1.2 behavior



This patch is also attached to bug 57633. It fixes the bug and adds tests to verify that this problem is fixed and that the behavior with leading or trailing empty strings is still the desired new behavior for 1.3.

I also made a few other small improvements in the tests.

OK to commit?

Index: glib/gstrfuncs.c
===================================================================
RCS file: /cvs/gnome/glib/glib/gstrfuncs.c,v
retrieving revision 1.61
diff -p -u -r1.61 gstrfuncs.c
--- glib/gstrfuncs.c	2001/07/12 09:23:38	1.61
+++ glib/gstrfuncs.c	2001/07/17 16:02:15
@@ -1569,15 +1569,18 @@ g_strsplit (const gchar *string,
 {
   GSList *string_list = NULL, *slist;
   gchar **str_array, *s;
-  guint n = 1;
+  guint n = 0;
+  const gchar *remainder;

   g_return_val_if_fail (string != NULL, NULL);
   g_return_val_if_fail (delimiter != NULL, NULL);
+  g_return_val_if_fail (delimiter[0] != '\0', NULL);

   if (max_tokens < 1)
     max_tokens = G_MAXINT;

-  s = strstr (string, delimiter);
+  remainder = string;
+  s = strstr (remainder, delimiter);
   if (s)
     {
       gsize delimiter_len = strlen (delimiter);
@@ -1587,18 +1590,22 @@ g_strsplit (const gchar *string,
 	  gsize len;
 	  gchar *new_string;

-	  len = s - string;
+	  len = s - remainder;
 	  new_string = g_new (gchar, len + 1);
-	  strncpy (new_string, string, len);
+	  strncpy (new_string, remainder, len);
 	  new_string[len] = 0;
 	  string_list = g_slist_prepend (string_list, new_string);
 	  n++;
-	  string = s + delimiter_len;
-	  s = strstr (string, delimiter);
+	  remainder = s + delimiter_len;
+	  s = strstr (remainder, delimiter);
 	}
       while (--max_tokens && s);
     }
-  string_list = g_slist_prepend (string_list, g_strdup (string));
+  if (*string)
+    {
+      n++;
+      string_list = g_slist_prepend (string_list, g_strdup (remainder));
+    }

   str_array = g_new (gchar*, n + 1);

Index: tests/array-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/array-test.c,v
retrieving revision 1.3
diff -p -u -r1.3 array-test.c
--- tests/array-test.c	2000/07/26 11:02:02	1.3
+++ tests/array-test.c	2001/07/17 16:02:15
@@ -24,6 +24,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #include <stdio.h>
Index: tests/dirname-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/dirname-test.c,v
retrieving revision 1.5
diff -p -u -r1.5 dirname-test.c
--- tests/dirname-test.c	2000/07/26 11:02:02	1.5
+++ tests/dirname-test.c	2001/07/17 16:02:15
@@ -24,6 +24,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #include <stdio.h>
Index: tests/hash-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/hash-test.c,v
retrieving revision 1.7
diff -p -u -r1.7 hash-test.c
--- tests/hash-test.c	2000/10/30 14:34:52	1.7
+++ tests/hash-test.c	2001/07/17 16:02:15
@@ -25,6 +25,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #ifdef HAVE_CONFIG_H
Index: tests/list-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/list-test.c,v
retrieving revision 1.4
diff -p -u -r1.4 list-test.c
--- tests/list-test.c	2000/07/26 11:02:02	1.4
+++ tests/list-test.c	2001/07/17 16:02:15
@@ -24,6 +24,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #include <stdio.h>
Index: tests/node-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/node-test.c,v
retrieving revision 1.6
diff -p -u -r1.6 node-test.c
--- tests/node-test.c	2000/07/26 11:02:02	1.6
+++ tests/node-test.c	2001/07/17 16:02:15
@@ -24,6 +24,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #ifdef HAVE_CONFIG_H
Index: tests/relation-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/relation-test.c,v
retrieving revision 1.3
diff -p -u -r1.3 relation-test.c
--- tests/relation-test.c	2000/07/26 11:02:02	1.3
+++ tests/relation-test.c	2001/07/17 16:02:15
@@ -24,6 +24,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #include <stdio.h>
Index: tests/shell-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/shell-test.c,v
retrieving revision 1.2
diff -p -u -r1.2 shell-test.c
--- tests/shell-test.c	2000/11/28 23:44:21	1.2
+++ tests/shell-test.c	2001/07/17 16:02:16
@@ -24,6 +24,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #include <glib.h>
Index: tests/slist-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/slist-test.c,v
retrieving revision 1.4
diff -p -u -r1.4 slist-test.c
--- tests/slist-test.c	2000/07/26 11:02:02	1.4
+++ tests/slist-test.c	2001/07/17 16:02:16
@@ -24,6 +24,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #include <stdio.h>
Index: tests/spawn-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/spawn-test.c,v
retrieving revision 1.2
diff -p -u -r1.2 spawn-test.c
--- tests/spawn-test.c	2000/10/16 18:54:29	1.2
+++ tests/spawn-test.c	2001/07/17 16:02:16
@@ -24,6 +24,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #include <glib.h>
Index: tests/strfunc-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/strfunc-test.c,v
retrieving revision 1.7
diff -p -u -r1.7 strfunc-test.c
--- tests/strfunc-test.c	2001/06/08 23:14:03	1.7
+++ tests/strfunc-test.c	2001/07/17 16:02:16
@@ -24,11 +24,13 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #include <stdio.h>
 #include <string.h>
 #include "glib.h"
+#include <stdarg.h>

 int array[10000];
 gboolean failed = FALSE;
@@ -55,6 +57,35 @@ typedef struct {
 	gchar name[40];
 } GlibTestInfo;

+static gboolean
+strv_check (gchar **strv, ...)
+{
+  gboolean ok = TRUE;
+  gint i = 0;
+  va_list list;
+
+  va_start (list, strv);
+  while (ok)
+    {
+      const gchar *str = va_arg (list, const char *);
+      if (strv[i] == NULL)
+	{
+	  ok = str == NULL;
+	  break;
+	}
+      if (str == NULL)
+	ok = FALSE;
+      else if (strcmp (strv[i], str) != 0)
+	ok = FALSE;
+      i++;
+    }
+  va_end (list);
+
+  g_strfreev (strv);
+
+  return ok;
+}
+
 int
 main (int   argc,
       char *argv[])
@@ -63,20 +94,20 @@ main (int   argc,
   gchar *vec[] = { "Foo", "Bar", NULL };
   gchar **copy;

-  g_assert (g_strcasecmp ("FroboZZ", "frobozz") == 0);
-  g_assert (g_strcasecmp ("frobozz", "frobozz") == 0);
-  g_assert (g_strcasecmp ("frobozz", "FROBOZZ") == 0);
-  g_assert (g_strcasecmp ("FROBOZZ", "froboz") != 0);
-  g_assert (g_strcasecmp ("", "") == 0);
-  g_assert (g_strcasecmp ("!#%&/()", "!#%&/()") == 0);
-  g_assert (g_strcasecmp ("a", "b") < 0);
-  g_assert (g_strcasecmp ("a", "B") < 0);
-  g_assert (g_strcasecmp ("A", "b") < 0);
-  g_assert (g_strcasecmp ("A", "B") < 0);
-  g_assert (g_strcasecmp ("b", "a") > 0);
-  g_assert (g_strcasecmp ("b", "A") > 0);
-  g_assert (g_strcasecmp ("B", "a") > 0);
-  g_assert (g_strcasecmp ("B", "A") > 0);
+  g_assert (g_ascii_strcasecmp ("FroboZZ", "frobozz") == 0);
+  g_assert (g_ascii_strcasecmp ("frobozz", "frobozz") == 0);
+  g_assert (g_ascii_strcasecmp ("frobozz", "FROBOZZ") == 0);
+  g_assert (g_ascii_strcasecmp ("FROBOZZ", "froboz") != 0);
+  g_assert (g_ascii_strcasecmp ("", "") == 0);
+  g_assert (g_ascii_strcasecmp ("!#%&/()", "!#%&/()") == 0);
+  g_assert (g_ascii_strcasecmp ("a", "b") < 0);
+  g_assert (g_ascii_strcasecmp ("a", "B") < 0);
+  g_assert (g_ascii_strcasecmp ("A", "b") < 0);
+  g_assert (g_ascii_strcasecmp ("A", "B") < 0);
+  g_assert (g_ascii_strcasecmp ("b", "a") > 0);
+  g_assert (g_ascii_strcasecmp ("b", "A") > 0);
+  g_assert (g_ascii_strcasecmp ("B", "a") > 0);
+  g_assert (g_ascii_strcasecmp ("B", "A") > 0);

   g_assert(g_strdup(NULL) == NULL);
   string = g_strdup(GLIB_TEST_STRING);
@@ -123,8 +154,19 @@ main (int   argc,
 		    "BarFoo") == 0);
   g_assert (strcmp (g_strrstr_len ("FooBarFooBarFoo", 14, "BarFoo"),
 		    "BarFooBarFoo") == 0);
-  return 0;
-}
-

+  g_assert (strv_check (g_strsplit ("", ",", 0), NULL));
+  g_assert (strv_check (g_strsplit ("x", ",", 0), "x", NULL));
+  g_assert (strv_check (g_strsplit ("x,y", ",", 0), "x", "y", NULL));
+  g_assert (strv_check (g_strsplit ("x,y,", ",", 0), "x", "y", "", NULL))
;
+  g_assert (strv_check (g_strsplit (",x,y", ",", 0), "", "x", "y", NULL))
;
+ g_assert (strv_check (g_strsplit (",x,y,", ",", 0), "", "x", "y", "", NULL));
+  g_assert (strv_check (g_strsplit ("x,y,z", ",", 0), "x", "y", "z", NULL)
);
+ g_assert (strv_check (g_strsplit ("x,y,z,", ",", 0), "x", "y", "z", "", NULL)); + g_assert (strv_check (g_strsplit (",x,y,z", ",", 0), "", "x", "y", "z", NULL));
+  g_assert (strv_check (g_strsplit (",x,y,z,", ",", 0), "", "x", "y", "z"
, "", NULL));
+ g_assert (strv_check (g_strsplit (",,x,,y,,z,,", ",", 0), "", "", "x", "", "y", "", "z", "", "", NULL));
+  g_assert (strv_check (g_strsplit (",,x,,y,,z,,", ",,", 0), "", "x", "y"
, "z", "", NULL));

+  return 0;
+}
Index: tests/string-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/string-test.c,v
retrieving revision 1.10
diff -p -u -r1.10 string-test.c
--- tests/string-test.c	2000/07/26 11:02:02	1.10
+++ tests/string-test.c	2001/07/17 16:02:16
@@ -24,6 +24,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #include <stdio.h>
Index: tests/testglib.c
===================================================================
RCS file: /cvs/gnome/glib/tests/testglib.c,v
retrieving revision 1.52
diff -p -u -r1.52 testglib.c
--- tests/testglib.c	2001/07/11 20:08:50	1.52
+++ tests/testglib.c	2001/07/17 16:02:17
@@ -26,6 +26,7 @@

 #include "config.h"

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #ifdef GLIB_COMPILATION
Index: tests/tree-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/tree-test.c,v
retrieving revision 1.3
diff -p -u -r1.3 tree-test.c
--- tests/tree-test.c	2000/07/26 11:02:02	1.3
+++ tests/tree-test.c	2001/07/17 16:02:17
@@ -24,6 +24,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #include <stdio.h>
Index: tests/type-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/type-test.c,v
retrieving revision 1.6
diff -p -u -r1.6 type-test.c
--- tests/type-test.c	2001/04/20 17:08:57	1.6
+++ tests/type-test.c	2001/07/17 16:02:17
@@ -24,6 +24,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */

+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN

 #include <stdio.h>

===================================================================

    -- Darin




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]