summaryrefslogtreecommitdiff
path: root/json-glib/json-parser.c
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@linux.intel.com>2010-03-18 15:24:39 +0000
committerEmmanuele Bassi <ebassi@linux.intel.com>2010-03-18 15:24:39 +0000
commitf4c57ac4227c4edb8a4cecb784e871fbd5649ad1 (patch)
tree29eb5efb560eb5d3fbdf13db1253f958980285e5 /json-glib/json-parser.c
parentb3435c6a05ecee58c64dce669ce7e44f829afc98 (diff)
downloadjson-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.c44
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);