diff options
author | William Langford <wlangfor@gmail.com> | 2014-07-04 12:08:47 -0400 |
---|---|---|
committer | Nicolas Williams <nico@cryptonector.com> | 2014-07-06 01:40:22 -0500 |
commit | d0ca11d6652cc8aeb0ea4fc674f427f81dcf1467 (patch) | |
tree | 1165b228ddce5fc24f9febae80ae0109289c542e | |
parent | 7d3a44a1e23ead9dd413ae26f7a5e1de993f376a (diff) |
Add support for negative indices for .[]; fix #462
Signed-off-by: Nicolas Williams <nico@cryptonector.com>
-rw-r--r-- | docs/content/3.manual/manual.yml | 9 | ||||
-rw-r--r-- | jv_aux.c | 5 | ||||
-rw-r--r-- | tests/all.test | 4 |
3 files changed, 17 insertions, 1 deletions
diff --git a/docs/content/3.manual/manual.yml b/docs/content/3.manual/manual.yml index 973e8d85..ac0e70e0 100644 --- a/docs/content/3.manual/manual.yml +++ b/docs/content/3.manual/manual.yml @@ -256,6 +256,11 @@ sections: the array), or omitted (in which case it refers to the start or end of the array). + The `.[2]` syntax can be used to return the element at the + given index. Negative indices are allowed, with -1 referring + to the last element, -2 referring to the next to last element, + and so on. + The `?` "operator" can also be used with the slice operator, as in `.[10:15]?`, which outputs values where the inputs are slice-able. @@ -285,6 +290,10 @@ sections: input: '["a","b","c","d","e"]' output: ['["d", "e"]'] + - program: '.[-2]' + input: '[1,2,3]' + output: ['2'] + - title: "`.[]`" body: | @@ -57,7 +57,10 @@ jv jv_get(jv t, jv k) { } } else if (jv_get_kind(t) == JV_KIND_ARRAY && jv_get_kind(k) == JV_KIND_NUMBER) { if(jv_is_integer(k)){ - v = jv_array_get(t, (int)jv_number_value(k)); + int idx = (int)jv_number_value(k); + if (idx < 0) + idx += jv_array_length(jv_copy(t)); + v = jv_array_get(t, idx); if (!jv_is_valid(v)) { jv_free(v); v = jv_null(); diff --git a/tests/all.test b/tests/all.test index 4bd15cee..1fdb10a0 100644 --- a/tests/all.test +++ b/tests/all.test @@ -202,6 +202,10 @@ null 2 3 +.[-2] +[1,2,3] +2 + [range(0;10)] null [0,1,2,3,4,5,6,7,8,9] |