diff options
| author | Emmanuele Bassi <ebassi@openedhand.com> | 2007-10-05 16:39:10 +0100 |
|---|---|---|
| committer | Emmanuele Bassi <ebassi@openedhand.com> | 2007-10-05 16:39:10 +0100 |
| commit | 220838e4e61c5a8fd9cf627da7309acf44fa82f0 (patch) | |
| tree | 0aa652348d687710a3a25b516457aa72d95749ef /json-glib | |
| parent | ea5ee264a5b82fd1d09fa84ec81e17c4ea0d0c4a (diff) | |
| download | json-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')
| -rw-r--r-- | json-glib/json-parser.c | 46 | ||||
| -rw-r--r-- | json-glib/json-parser.h | 21 |
2 files changed, 55 insertions, 12 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; +} diff --git a/json-glib/json-parser.h b/json-glib/json-parser.h index 24cde0a..71a17cb 100644 --- a/json-glib/json-parser.h +++ b/json-glib/json-parser.h @@ -129,15 +129,18 @@ struct _JsonParserClass GQuark json_parser_error_quark (void); GType json_parser_get_type (void) G_GNUC_CONST; -JsonParser *json_parser_new (void); -gboolean json_parser_load_from_file (JsonParser *parser, - const gchar *filename, - GError **error); -gboolean json_parser_load_from_data (JsonParser *parser, - const gchar *data, - gsize length, - GError **error); -JsonNode * json_parser_get_root (JsonParser *parser); +JsonParser *json_parser_new (void); +gboolean json_parser_load_from_file (JsonParser *parser, + const gchar *filename, + GError **error); +gboolean json_parser_load_from_data (JsonParser *parser, + const gchar *data, + gsize length, + GError **error); +JsonNode * json_parser_get_root (JsonParser *parser); + +guint json_parser_get_current_line (JsonParser *parser); +guint json_parser_get_current_pos (JsonParser *parser); G_END_DECLS |
