treewide: replace jow@openwrt.org with jo@mein.io
[oweals/jsonpath.git] / matcher.c
index 51e0e3c700002318067d714f253f1bee7cc134fc..85bd1c5a97833950ceacf4cfb0b18da11a19052f 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 <jo@mein.io>
  *
  * 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,10 +258,19 @@ jp_match_next(struct jp_opcode *ptr,
                break;
 
        case T_NUMBER:
-               next = json_object_array_get_idx(cur, ptr->num);
+               if (json_object_get_type(cur) == json_type_array)
+               {
+                       idx = ptr->num;
 
-               if (next)
-                       return jp_match_next(ptr->sibling, root, next, cb, priv);
+                       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);
+               }
 
                break;