From: Adam Dickmeiss Date: Fri, 9 Apr 2010 11:39:27 +0000 (+0200) Subject: Add json_parser_get_position and json_parse2 X-Git-Tag: v4.0.4~25 X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=commitdiff_plain;h=4e01ee252ae4ec86534061e905eb5d2a3ddb386b;ds=sidebyside Add json_parser_get_position and json_parse2 --- diff --git a/include/yaz/json.h b/include/yaz/json.h index e3a9762..723ad02 100644 --- a/include/yaz/json.h +++ b/include/yaz/json.h @@ -93,6 +93,15 @@ struct json_node *json_parser_parse(json_parser_t p, const char *json_str); YAZ_EXPORT const char *json_parser_get_errmsg(json_parser_t p); +/** \brief returns parser position + \param p JSON parser handle + \returns number of bytes read from parser + + This function should be called if json_parser_parse returns NULL . +*/ +YAZ_EXPORT +size_t json_parser_get_position(json_parser_t p); + /** \brief parses JSON string \param json_str JSON string \param errmsg pointer to error message string @@ -104,6 +113,19 @@ const char *json_parser_get_errmsg(json_parser_t p); YAZ_EXPORT struct json_node *json_parse(const char *json_str, const char **errmsg); +/** \brief parses JSON string + \param json_str JSON string + \param errmsg pointer to error message string + \param pos position of parser stop (probably error) + \returns JSON tree or NULL if parse error occurred. + + The resulting tree should be removed with a call to json_remove_node. + The errmsg may be NULL in which case the error message is not returned. +*/ +YAZ_EXPORT +struct json_node *json_parse2(const char *json_str, const char **errmsg, + size_t *pos); + /** \brief destroys JSON tree node and its children \param n JSON node */ diff --git a/src/json.c b/src/json.c index 6c34fcb..1cef6bd 100644 --- a/src/json.c +++ b/src/json.c @@ -433,7 +433,8 @@ struct json_node *json_parser_parse(json_parser_t p, const char *json_str) return n; } -struct json_node *json_parse(const char *json_str, const char **errmsg) +struct json_node *json_parse2(const char *json_str, const char **errmsg, + size_t *pos) { json_parser_t p = json_parser_create(); struct json_node *n = 0; @@ -447,11 +448,18 @@ struct json_node *json_parse(const char *json_str, const char **errmsg) n = json_parser_parse(p, json_str); if (!n && errmsg) *errmsg = json_parser_get_errmsg(p); + if (pos) + *pos = json_parser_get_position(p); json_parser_destroy(p); } return n; } +struct json_node *json_parse(const char *json_str, const char **errmsg) +{ + return json_parse2(json_str, errmsg, 0); +} + void json_write_wrbuf(struct json_node *node, WRBUF result) { switch (node->type) @@ -586,6 +594,11 @@ const char *json_parser_get_errmsg(json_parser_t p) return p->err_msg; } +size_t json_parser_get_position(json_parser_t p) +{ + return p->cp - p->buf; +} + /* * Local variables: * c-basic-offset: 4