From: Stephen Dolan Date: Mon, 10 Sep 2012 15:49:25 +0000 (+0100) Subject: Subtraction - as expected for numbers, ruby-style set diff for arrays. X-Git-Tag: jq-1.1~60 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6f3abbac620132260d5424dbee259f850dad890f;p=jq Subtraction - as expected for numbers, ruby-style set diff for arrays. --- diff --git a/c/builtin.c b/c/builtin.c index bdca254..65ecb52 100644 --- a/c/builtin.c +++ b/c/builtin.c @@ -37,10 +37,44 @@ static void f_plus(jv input[], jv output[]) { } } +static void f_minus(jv input[], jv output[]) { + jv_free(input[0]); + jv a = input[2]; + jv b = input[1]; + if (jv_get_kind(a) == JV_KIND_NUMBER && jv_get_kind(b) == JV_KIND_NUMBER) { + output[0] = jv_number(jv_number_value(a) - jv_number_value(b)); + } else if (jv_get_kind(a) == JV_KIND_ARRAY && jv_get_kind(b) == JV_KIND_ARRAY) { + jv out = jv_array(); + for (int i=0; i Exp Term MkDict MkDictPair ExpD ElseBody - %{ #include "lexer.yy.h" void yyerror(YYLTYPE* loc, block* answer, yyscan_t lexer, const char *s){ @@ -64,6 +63,21 @@ static block gen_index(block obj, block key) { return block_join(obj, block_join(gen_subexp(key), gen_op_simple(INDEX))); } +static block gen_binop(block a, block b, char op) { + const char* funcname = 0; + switch (op) { + case '+': funcname = "_plus"; break; + case '-': funcname = "_minus"; break; + } + assert(funcname); + + block c = gen_noop(); + block_append(&c, gen_subexp(a)); + block_append(&c, gen_subexp(b)); + block_append(&c, gen_op_call(CALL_1_1, gen_op_block_unbound(CLOSURE_REF, funcname))); + return c; +} + %} %% @@ -136,10 +150,11 @@ Exp ',' Exp { } | Exp '+' Exp { - $$ = gen_noop(); - block_append(&$$, gen_subexp($1)); - block_append(&$$, gen_subexp($3)); - block_append(&$$, gen_op_call(CALL_1_1, gen_op_block_unbound(CLOSURE_REF, "_plus"))); + $$ = gen_binop($1, $3, '+'); +} | + +Exp '-' Exp { + $$ = gen_binop($1, $3, '-'); } | Term { @@ -154,7 +169,6 @@ ElseBody: $$ = $2; } - ExpD: ExpD '|' ExpD { $$ = block_join($1, $3); diff --git a/c/testdata b/c/testdata index c353dc2..6386ac0 100644 --- a/c/testdata +++ b/c/testdata @@ -167,6 +167,14 @@ null "\u0000\u0020\u0000" "\u0000 \u0000\u0000 \u0000" +42 - . +11 +31 + +[1,2,3,4,1] - [.,3] +1 +[2,4] + # # User-defined functions # Oh god.