summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Dolan <mu@netsoc.tcd.ie>2012-09-18 12:58:39 +0100
committerStephen Dolan <mu@netsoc.tcd.ie>2012-09-18 12:58:39 +0100
commit8041ce31192af8b54e83691372f23b0b9637234c (patch)
treeb22250efc717212aa81d876ae11aac0adbefedd4
parent8f0c91c03289b25e8cad82270f9fea0c2eab7b7b (diff)
Add the builtin 'select' function.
-rw-r--r--c/builtin.c15
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);
}