diff options
| author | Emmanuele Bassi <ebassi@linux.intel.com> | 2010-03-18 15:24:39 +0000 |
|---|---|---|
| committer | Emmanuele Bassi <ebassi@linux.intel.com> | 2010-03-18 15:24:39 +0000 |
| commit | f4c57ac4227c4edb8a4cecb784e871fbd5649ad1 (patch) | |
| tree | 29eb5efb560eb5d3fbdf13db1253f958980285e5 /json-glib/json-parser.c | |
| parent | b3435c6a05ecee58c64dce669ce7e44f829afc98 (diff) | |
| download | json-glib-f4c57ac4227c4edb8a4cecb784e871fbd5649ad1.tar.gz | |
parser: Clean up array and object parsing
We are doing some of the work twice, especially when dealing with the
trailing commas detection and the unknown tokens after an array element
or an object member definition.
Diffstat (limited to 'json-glib/json-parser.c')
| -rw-r--r-- | json-glib/json-parser.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/json-glib/json-parser.c b/json-glib/json-parser.c index fc011b9..18a3d34 100644 --- a/json-glib/json-parser.c +++ b/json-glib/json-parser.c @@ -37,6 +37,7 @@ #include "json-types-private.h" +#include "json-debug.h" #include "json-marshal.h" #include "json-parser.h" #include "json-scanner.h" @@ -457,7 +458,9 @@ json_parse_array (JsonParser *parser, token = json_scanner_get_next_token (scanner); if (token == G_TOKEN_RIGHT_BRACE) - break; + { + break; + } if (token == G_TOKEN_COMMA) { @@ -503,7 +506,9 @@ json_parse_array (JsonParser *parser, token = json_scanner_get_next_token (scanner); if (token == G_TOKEN_RIGHT_BRACE) - break; + { + break; + } if (token == G_TOKEN_COMMA) { @@ -536,8 +541,6 @@ json_parse_array (JsonParser *parser, json_array_get_length (array)); token = json_scanner_get_next_token (scanner); - if (token == G_TOKEN_RIGHT_BRACE) - break; if (token == G_TOKEN_COMMA) { @@ -548,11 +551,12 @@ json_parse_array (JsonParser *parser, json_array_unref (array); return G_TOKEN_SYMBOL; } - - continue; } - - return G_TOKEN_RIGHT_BRACE; + else if (token != G_TOKEN_RIGHT_BRACE) + { + json_array_unref (array); + return G_TOKEN_RIGHT_BRACE; + } } json_node_take_array (priv->current_node, array); @@ -615,6 +619,7 @@ json_parse_object (JsonParser *parser, return G_TOKEN_STRING; } + /* nested object */ if (token == G_TOKEN_LEFT_CURLY) { JsonNode *old_node = priv->current_node; @@ -668,7 +673,8 @@ json_parse_object (JsonParser *parser, return G_TOKEN_RIGHT_CURLY; } - + + /* nested array */ if (token == G_TOKEN_LEFT_BRACE) { JsonNode *old_node = priv->current_node; @@ -699,7 +705,7 @@ json_parse_object (JsonParser *parser, g_free (name); token = json_scanner_get_next_token (scanner); - if (token == G_TOKEN_RIGHT_BRACE) + if (token == G_TOKEN_RIGHT_CURLY) break; if (token == G_TOKEN_COMMA) @@ -736,29 +742,27 @@ json_parse_object (JsonParser *parser, object, name); - g_free (name); - token = json_scanner_get_next_token (scanner); - if (token == G_TOKEN_RIGHT_CURLY) - break; - if (token == G_TOKEN_COMMA) { token = json_scanner_get_next_token (scanner); if (token == G_TOKEN_RIGHT_CURLY) { + g_free (name); json_object_unref (object); return G_TOKEN_STRING; } - - continue; + } + else if (token != G_TOKEN_RIGHT_CURLY) + { + g_free (name); + json_object_unref (object); + return G_TOKEN_RIGHT_CURLY; } - json_object_unref (object); - - return G_TOKEN_RIGHT_CURLY; + g_free (name); } json_node_take_object (priv->current_node, object); |
