]> granicus.if.org Git - jq/commitdiff
Add floor operator
authorNicolas Williams <nico@cryptonector.com>
Tue, 18 Jun 2013 01:50:45 +0000 (20:50 -0500)
committerNicolas Williams <nico@cryptonector.com>
Fri, 21 Jun 2013 20:27:34 +0000 (15:27 -0500)
Makefile.am
builtin.c
tests/all.test

index c4f79e0403eada57149e94263576034ed7ea18eb..a0d31b71623116eda301e114e20baddaffb456fa 100644 (file)
@@ -44,6 +44,7 @@ version.h: .remake-version-h
 
 bin_PROGRAMS = jq
 jq_SOURCES = ${JQ_SRC} main.c
+jq_LDADD = -lm
 
 ### Tests (make check)
 
index 96f6ef428dc068bc590092cccc08a44a72083910..0bdb9356fa54c612e12284344fb9aedcdc61173b 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -1,3 +1,4 @@
+#include <math.h>
 #include <stdlib.h>
 #include <string.h>
 #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));",
index a9efff0bee7282517ebd5a723ac27ee111ed94b1..af6f8a1c7abdcea1a2c096fe3a4599774dc3e3ce 100644 (file)
@@ -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]]]