contrib: add ParseTrace prototype to parser skeleton
[oweals/jsonpath.git] / matcher.c
index 51e0e3c700002318067d714f253f1bee7cc134fc..ceb756e66573679840f4900dbc2ac7a064afa157 100644 (file)
--- a/matcher.c
+++ b/matcher.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 Jo-Philipp Wich <jow@openwrt.org>
+ * Copyright (C) 2013-2014 Jo-Philipp Wich <jow@openwrt.org>
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -14,6 +14,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include "parser.h"
 #include "matcher.h"
 
 static struct json_object *
@@ -236,7 +237,8 @@ jp_match_next(struct jp_opcode *ptr,
               struct json_object *root, struct json_object *cur,
               jp_match_cb_t cb, void *priv)
 {
-       struct json_object *next;
+       int idx;
+       struct json_object *next = NULL;
 
        if (!ptr)
        {
@@ -256,7 +258,13 @@ jp_match_next(struct jp_opcode *ptr,
                break;
 
        case T_NUMBER:
-               next = json_object_array_get_idx(cur, ptr->num);
+               idx = ptr->num;
+
+               if (idx < 0)
+                       idx += json_object_array_length(cur);
+
+               if (idx >= 0)
+                       next = json_object_array_get_idx(cur, idx);
 
                if (next)
                        return jp_match_next(ptr->sibling, root, next, cb, priv);