summaryrefslogtreecommitdiff
path: root/json-glib/json-parser.c
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@openedhand.com>2007-10-05 16:39:10 +0100
committerEmmanuele Bassi <ebassi@openedhand.com>2007-10-05 16:39:10 +0100
commit220838e4e61c5a8fd9cf627da7309acf44fa82f0 (patch)
tree0aa652348d687710a3a25b516457aa72d95749ef /json-glib/json-parser.c
parentea5ee264a5b82fd1d09fa84ec81e17c4ea0d0c4a (diff)
downloadjson-glib-220838e4e61c5a8fd9cf627da7309acf44fa82f0.tar.gz
Add line/position getters to JsonParser
Add two methods to JsonParser to retrieve the currently parsed line and position within that line. These methods works only while parsing, so within the signal handlers and inside subclasses.
Diffstat (limited to 'json-glib/json-parser.c')
-rw-r--r--json-glib/json-parser.c46
1 files changed, 43 insertions, 3 deletions
diff --git a/json-glib/json-parser.c b/json-glib/json-parser.c
index 659d846..fa57995 100644
--- a/json-glib/json-parser.c
+++ b/json-glib/json-parser.c
@@ -45,6 +45,8 @@ struct _JsonParserPrivate
{
JsonNode *root;
JsonNode *current_node;
+
+ GScanner *scanner;
};
static const GScannerConfig json_scanner_config =
@@ -728,8 +730,6 @@ json_scanner_msg_handler (GScanner *scanner,
{
GError *error = NULL;
- g_warning ("Line %d: %s", scanner->line, message);
-
g_set_error (&error, JSON_PARSER_ERROR,
JSON_PARSER_ERROR_PARSE,
"Parse error on line %d: %s",
@@ -862,6 +862,8 @@ json_parser_load_from_data (JsonParser *parser,
GINT_TO_POINTER (symbols[i].token));
}
+ parser->priv->scanner = scanner;
+
g_signal_emit (parser, parser_signals[PARSE_START], 0);
done = FALSE;
@@ -931,7 +933,7 @@ json_parser_load_from_data (JsonParser *parser,
}
g_scanner_destroy (scanner);
-
+ parser->priv->scanner = NULL;
parser->priv->current_node = NULL;
g_signal_emit (parser, parser_signals[PARSE_END], 0);
@@ -956,3 +958,41 @@ json_parser_get_root (JsonParser *parser)
return parser->priv->root;
}
+/**
+ * json_parser_get_current_line:
+ * @parser: a #JsonParser
+ *
+ * Retrieves the line currently parsed, starting from 1.
+ *
+ * Return value: the currently parsed line.
+ */
+guint
+json_parser_get_current_line (JsonParser *parser)
+{
+ g_return_val_if_fail (JSON_IS_PARSER (parser), 0);
+
+ if (parser->priv->scanner)
+ return g_scanner_cur_line (parser->priv->scanner);
+
+ return 0;
+}
+
+/**
+ * json_parser_get_current_pos:
+ * @parser: a #JsonParser
+ *
+ * Retrieves the current position inside the current line, starting
+ * from 0.
+ *
+ * Return value: the position in the current line
+ */
+guint
+json_parser_get_current_pos (JsonParser *parser)
+{
+ g_return_val_if_fail (JSON_IS_PARSER (parser), 0);
+
+ if (parser->priv->scanner)
+ return g_scanner_cur_line (parser->priv->scanner);
+
+ return 0;
+}