From 92a710ba28f274784318ebbb0c095a76a32e5689 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 19 Jan 2005 14:14:27 +0000 Subject: [PATCH] Accept \r\n as line end. (#163030, Bastian Nocera) 2005-01-19 Matthias Clasen * 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 | 11 +++++ ChangeLog.pre-2-10 | 11 +++++ ChangeLog.pre-2-12 | 11 +++++ ChangeLog.pre-2-8 | 11 +++++ glib/gkeyfile.c | 13 +++++- tests/Makefile.am | 2 + tests/keyfile-test.c | 98 ++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 tests/keyfile-test.c diff --git a/ChangeLog b/ChangeLog index fb4b0208..46a4effd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2005-01-19 Matthias Clasen + + * 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 * glib/gbacktrace.c (g_on_error_stack_trace): On Win32 call diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index fb4b0208..46a4effd 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,14 @@ +2005-01-19 Matthias Clasen + + * 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 * glib/gbacktrace.c (g_on_error_stack_trace): On Win32 call diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index fb4b0208..46a4effd 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,14 @@ +2005-01-19 Matthias Clasen + + * 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 * glib/gbacktrace.c (g_on_error_stack_trace): On Win32 call diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index fb4b0208..46a4effd 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,14 @@ +2005-01-19 Matthias Clasen + + * 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 * glib/gbacktrace.c (g_on_error_stack_trace): On Win32 call diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c index 485bada3..5b56f57b 100644 --- a/glib/gkeyfile.c +++ b/glib/gkeyfile.c @@ -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. diff --git a/tests/Makefile.am b/tests/Makefile.am index bfd4caf2..e78fd00f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 00000000..9aae2b91 --- /dev/null +++ b/tests/keyfile-test.c @@ -0,0 +1,98 @@ +#include +#include +#include + +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; +} -- 2.34.1