From: Nicolas Williams Date: Tue, 18 Jun 2013 01:50:45 +0000 (-0500) Subject: Add floor operator X-Git-Tag: jq-1.4~93 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7c4171d414f647ab08bcd20c76a4d8ed68d9c602;p=jq Add floor operator --- diff --git a/Makefile.am b/Makefile.am index c4f79e0..a0d31b7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -44,6 +44,7 @@ version.h: .remake-version-h bin_PROGRAMS = jq jq_SOURCES = ${JQ_SRC} main.c +jq_LDADD = -lm ### Tests (make check) diff --git a/builtin.c b/builtin.c index 96f6ef4..0bdb935 100644 --- a/builtin.c +++ b/builtin.c @@ -1,3 +1,4 @@ +#include #include #include #include "builtin.h" @@ -66,6 +67,15 @@ static jv f_plus(jv input, jv a, jv b) { } } +static jv f_floor(jv input) { + if (jv_get_kind(input) != JV_KIND_NUMBER) { + return type_error(input, "cannot be floored"); + } + jv ret = jv_number(floor(jv_number_value(input))); + jv_free(input); + return ret; +} + static jv f_negate(jv input) { if (jv_get_kind(input) != JV_KIND_NUMBER) { return type_error(input, "cannot be negated"); @@ -480,6 +490,7 @@ static jv f_error(jv input, jv msg) { } static const struct cfunction function_list[] = { + {(cfunction_ptr)f_floor, "_floor", 1}, {(cfunction_ptr)f_plus, "_plus", 3}, {(cfunction_ptr)f_negate, "_negate", 1}, {(cfunction_ptr)f_minus, "_minus", 3}, @@ -564,6 +575,7 @@ static const char* const jq_builtins[] = { "def unique: group_by(.) | map(.[0]);", "def max_by(f): _max_by_impl(map([f]));", "def min_by(f): _min_by_impl(map([f]));", + "def floor: _floor;", "def add: reduce .[] as $x (null; . + $x);", "def del(f): delpaths([path(f)]);", "def _assign(paths; value): value as $v | reduce path(paths) as $p (.; setpath($p; $v));", diff --git a/tests/all.test b/tests/all.test index a9efff0..af6f8a1 100644 --- a/tests/all.test +++ b/tests/all.test @@ -362,6 +362,10 @@ null [5,6] [1,2,3] +[.[]|floor] +[-1.1,1.1,1.9] +[-2, 1, 1] + def f(x): x | x; f([.], . + [42]) [1,2,3] [[[1,2,3]]]