Add json_parser_get_position and json_parse2
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 9 Apr 2010 11:39:27 +0000 (13:39 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 9 Apr 2010 11:39:27 +0000 (13:39 +0200)
include/yaz/json.h
src/json.c

index e3a9762..723ad02 100644 (file)
@@ -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);
 
 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
 /** \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);
 
 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
 */
 /** \brief destroys JSON tree node and its children
     \param n JSON node
 */
index 6c34fcb..1cef6bd 100644 (file)
@@ -433,7 +433,8 @@ struct json_node *json_parser_parse(json_parser_t p, const char *json_str)
     return n;
 }
 
     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;
 {
     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);
         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;
 }
 
         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)
 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;
 }
 
     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
 /*
  * Local variables:
  * c-basic-offset: 4