Accept \r\n as line end. (#163030, Bastian Nocera)
authorMatthias Clasen <mclasen@redhat.com>
Wed, 19 Jan 2005 14:14:27 +0000 (14:14 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Wed, 19 Jan 2005 14:14:27 +0000 (14:14 +0000)
2005-01-19  Matthias Clasen  <mclasen@redhat.com>

* glib/gkeyfile.c (g_key_file_parse_data): Accept \r\n as
line end.  (#163030, Bastian Nocera)
(g_key_file_load_from_data): Make -1 work as a size.

* tests/keyfile-test.c: Some unit tests for the keyfile
parser.

* tests/Makefile.am (test_programs): Add keyfile-test.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-8
glib/gkeyfile.c
tests/Makefile.am
tests/keyfile-test.c [new file with mode: 0644]

index fb4b020859cc107a134ffcf17384f7df8e530c7d..46a4effd564bdf9092dc289c8a95e332fb9f101e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2005-01-19  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/gkeyfile.c (g_key_file_parse_data): Accept \r\n as 
+       line end.  (#163030, Bastian Nocera)
+       (g_key_file_load_from_data): Make -1 work as a size.
+       
+       * tests/keyfile-test.c: Some unit tests for the keyfile
+       parser.  
+
+       * tests/Makefile.am (test_programs): Add keyfile-test.
+
 2005-01-19  Tor Lillqvist  <tml@novell.com>
 
        * glib/gbacktrace.c (g_on_error_stack_trace): On Win32 call
index fb4b020859cc107a134ffcf17384f7df8e530c7d..46a4effd564bdf9092dc289c8a95e332fb9f101e 100644 (file)
@@ -1,3 +1,14 @@
+2005-01-19  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/gkeyfile.c (g_key_file_parse_data): Accept \r\n as 
+       line end.  (#163030, Bastian Nocera)
+       (g_key_file_load_from_data): Make -1 work as a size.
+       
+       * tests/keyfile-test.c: Some unit tests for the keyfile
+       parser.  
+
+       * tests/Makefile.am (test_programs): Add keyfile-test.
+
 2005-01-19  Tor Lillqvist  <tml@novell.com>
 
        * glib/gbacktrace.c (g_on_error_stack_trace): On Win32 call
index fb4b020859cc107a134ffcf17384f7df8e530c7d..46a4effd564bdf9092dc289c8a95e332fb9f101e 100644 (file)
@@ -1,3 +1,14 @@
+2005-01-19  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/gkeyfile.c (g_key_file_parse_data): Accept \r\n as 
+       line end.  (#163030, Bastian Nocera)
+       (g_key_file_load_from_data): Make -1 work as a size.
+       
+       * tests/keyfile-test.c: Some unit tests for the keyfile
+       parser.  
+
+       * tests/Makefile.am (test_programs): Add keyfile-test.
+
 2005-01-19  Tor Lillqvist  <tml@novell.com>
 
        * glib/gbacktrace.c (g_on_error_stack_trace): On Win32 call
index fb4b020859cc107a134ffcf17384f7df8e530c7d..46a4effd564bdf9092dc289c8a95e332fb9f101e 100644 (file)
@@ -1,3 +1,14 @@
+2005-01-19  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/gkeyfile.c (g_key_file_parse_data): Accept \r\n as 
+       line end.  (#163030, Bastian Nocera)
+       (g_key_file_load_from_data): Make -1 work as a size.
+       
+       * tests/keyfile-test.c: Some unit tests for the keyfile
+       parser.  
+
+       * tests/Makefile.am (test_programs): Add keyfile-test.
+
 2005-01-19  Tor Lillqvist  <tml@novell.com>
 
        * glib/gbacktrace.c (g_on_error_stack_trace): On Win32 call
index 485bada3d8879c8c39b0525f2906ad6039740d59..5b56f57b256d7bc7a4faaee187c7c573270e4f54 100644 (file)
@@ -485,8 +485,9 @@ g_key_file_load_from_file (GKeyFile       *key_file,
  * @flags: flags from #GKeyFileFlags
  * @error: return location for a #GError, or %NULL
  *
- * Loads a key file from memory into an empty #GKeyFile structure.  
- * If the object cannot be created then %error is set to a #GKeyFileError.
+ * Loads a key file from memory into an empty #GKeyFile structure.  If
+ * the object cannot be created then %error is set to a
+ * #GKeyFileError. 
  *
  * Return value: %TRUE if a key file could be loaded, %FALSE othewise
  * Since: 2.6
@@ -504,6 +505,9 @@ g_key_file_load_from_data (GKeyFile       *key_file,
   g_return_val_if_fail (data != NULL, FALSE);
   g_return_val_if_fail (length != 0, FALSE);
 
+  if (length == (gsize)-1)
+    length = strlen (data);
+
   if (key_file->approximate_size > 0)
     {
       g_key_file_clear (key_file);
@@ -847,6 +851,11 @@ g_key_file_parse_data (GKeyFile     *key_file,
     {
       if (data[i] == '\n')
         {
+         if (i > 0 && data[i - 1] == '\r')
+           g_string_erase (key_file->parse_buffer,
+                           key_file->parse_buffer->len - 1,
+                           1);
+           
           /* When a newline is encountered flush the parse buffer so that the
            * line can be parsed.  Note that completely blank lines won't show
            * up in the parse buffer, so they get parsed directly.
index bfd4caf23357fa9db1e6a5c5d13e6c69ed2f85c7..e78fd00fa89f742bbd6d3e458e75bc7a8ca9920c 100644 (file)
@@ -74,6 +74,7 @@ test_programs =                                       \
        gio-test                                \
        hash-test                               \
        iochannel-test                          \
+       keyfile-test                            \
        list-test                               \
        mainloop-test                           \
        markup-escape-test                      \
@@ -127,6 +128,7 @@ env_test_LDADD = $(progs_ldadd)
 gio_test_LDADD = $(progs_ldadd)
 hash_test_LDADD = $(progs_ldadd)
 iochannel_test_LDADD = $(progs_ldadd)
+keyfile_test_LDADD = $(progs_ldadd)
 list_test_LDADD = $(progs_ldadd)
 mainloop_test_LDADD = $(thread_ldadd)
 markup_test_LDADD = $(progs_ldadd)
diff --git a/tests/keyfile-test.c b/tests/keyfile-test.c
new file mode 100644 (file)
index 0000000..9aae2b9
--- /dev/null
@@ -0,0 +1,98 @@
+#include <glib.h>
+#include <string.h>
+#include <stdlib.h>
+
+static GKeyFile *
+load_data (const gchar *data)
+{
+  GKeyFile *keyfile;
+  GError *error = NULL;
+
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  if (error)
+    {
+      g_print ("Could not load data: %s\n", error->message);
+      exit (1);
+    }
+  
+  return keyfile;
+}
+
+static void
+check_string_value (GKeyFile    *keyfile,
+                   const gchar *group,
+                   const gchar *key,
+                   const gchar *expected) 
+{
+  GError *error = NULL;
+  gchar *value;
+
+  value = g_key_file_get_string (keyfile, group, key, &error);
+  if (error) 
+    {
+      g_print ("Group %s key %s: %s\n", group, key, error->message);      
+      exit (1);
+    }
+
+  g_assert (value != NULL);
+
+  if (strcmp (value, expected) != 0)
+    {
+      g_print ("Group %s key %s: "
+              "expected value '%s', actual value '%s'\n",
+              group, key, expected, value);      
+      exit (1);
+    }
+}
+
+static void
+test_line_ends (void)
+{
+  GKeyFile *keyfile;
+
+  const gchar *data = 
+    "[group1]\n"
+    "key1=value1\n"
+    "key2=value2\r\n"
+    "[group2]\r\n"
+    "key3=value3\r\r\n"
+    "key4=value4\n";
+
+  keyfile = load_data (data);
+
+  check_string_value (keyfile, "group1", "key1", "value1");
+  check_string_value (keyfile, "group1", "key2", "value2");
+  check_string_value (keyfile, "group2", "key3", "value3\r");
+  check_string_value (keyfile, "group2", "key4", "value4");
+}
+
+static void
+test_whitespace (void)
+{
+  GKeyFile *keyfile;
+
+  const gchar *data = 
+    "[group1]\n"
+    "key1 = value1\n"
+    "key2\t=\tvalue2\n"
+    " [ group2 ] \n"
+    "key3  =  value3  \n"
+    "key4  =  value \t4\n";
+  
+  keyfile = load_data (data);
+
+  check_string_value (keyfile, "group1", "key1", "value1");
+  check_string_value (keyfile, "group1", "key2", "value2");
+  check_string_value (keyfile, " group2 ", "key3", "value3  ");
+  check_string_value (keyfile, " group2 ", "key4", "value \t4");
+}
+
+int 
+main (int argc, char *argv[])
+{
+  test_line_ends ();
+  test_whitespace ();
+  
+  return 0;
+}