GVariant: Stop lexing format strings at :
authorRyan Lortie <desrt@desrt.ca>
Fri, 26 Mar 2010 13:01:51 +0000 (08:01 -0500)
committerRyan Lortie <desrt@desrt.ca>
Fri, 26 Mar 2010 13:02:17 +0000 (08:02 -0500)
Lets us parse this successfully: {%s: %s}.

glib/gvariant-parser.c
glib/tests/gvariant.c

index 5bb2c35..1020633 100644 (file)
@@ -167,11 +167,12 @@ token_stream_prepare (TokenStream *stream)
       break;
 
     case '@': case '%':
-      /* stop at the first space, comma or unmatched bracket.
-       * deals nicely with cases like (%i, %i).
+      /* stop at the first space, comma, colon or unmatched bracket.
+       * deals nicely with cases like (%i, %i) or {%i: %i}.
        */
       for (end = stream->stream + 1;
-           end != stream->end && *end != ',' && !g_ascii_isspace (*end);
+           end != stream->end && *end != ',' &&
+           *end != ':' && !g_ascii_isspace (*end);
            end++)
 
         if (*end == '(' || *end == '{')
index 1a51268..b37f5a7 100644 (file)
@@ -3678,6 +3678,7 @@ test_parse_positional (void)
                                 " ('three', %u)]", "two", 3);
   g_assert (g_variant_is_of_type (value, G_VARIANT_TYPE ("a(su)")));
   check_and_free (value, "[('one', 1), ('two', 2), ('three', 3)]");
+  check_and_free (g_variant_new_parsed ("{%s:%i}", "one", 1), "{'one': 1}");
 
   if (do_failed_test ("*GVariant format string*"))
     {