diff options
author | Stephen Dolan <mu@netsoc.tcd.ie> | 2012-09-18 12:58:39 +0100 |
---|---|---|
committer | Stephen Dolan <mu@netsoc.tcd.ie> | 2012-09-18 12:58:39 +0100 |
commit | 8041ce31192af8b54e83691372f23b0b9637234c (patch) | |
tree | b22250efc717212aa81d876ae11aac0adbefedd4 | |
parent | 8f0c91c03289b25e8cad82270f9fea0c2eab7b7b (diff) |
Add the builtin 'select' function.
-rw-r--r-- | c/builtin.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/c/builtin.c b/c/builtin.c index 6d0235e7..f291a95e 100644 --- a/c/builtin.c +++ b/c/builtin.c @@ -199,24 +199,25 @@ static bytecoded_builtin bytecoded_builtins[] = { }; static const char* jq_builtins[] = { - "def map(f): [.[] | f];" + "def map(f): [.[] | f];", + "def select(f): if f then . else empty end;", }; block builtins_bind(block b) { - block builtins = gen_noop(); - for (unsigned i=0; i<sizeof(bytecoded_builtins)/sizeof(bytecoded_builtins[0]); i++) { - block_append(&builtins, bytecoded_builtins[i]()); - } - for (unsigned i=0; i<sizeof(jq_builtins)/sizeof(jq_builtins[0]); i++) { + for (int i=(int)(sizeof(jq_builtins)/sizeof(jq_builtins[0]))-1; i>=0; i--) { struct locfile src; locfile_init(&src, jq_builtins[i], strlen(jq_builtins[i])); block funcs; int nerrors = jq_parse_library(&src, &funcs); assert(!nerrors); - block_append(&builtins, funcs); + b = block_bind(funcs, b, OP_IS_CALL_PSEUDO); locfile_free(&src); } + block builtins = gen_noop(); + for (unsigned i=0; i<sizeof(bytecoded_builtins)/sizeof(bytecoded_builtins[0]); i++) { + block_append(&builtins, bytecoded_builtins[i]()); + } b = block_bind(builtins, b, OP_IS_CALL_PSEUDO); return gen_cbinding(&cbuiltins, b); } |