From 6e373942e52ae13742bc1dd75f645244b805670c Mon Sep 17 00:00:00 2001 From: Brendan Macmillan Date: Fri, 17 May 2013 03:03:42 +1000 Subject: Load library from ~/.jq --- builtin.c | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) (limited to 'builtin.c') diff --git a/builtin.c b/builtin.c index 071cb564..e6cfa4da 100644 --- a/builtin.c +++ b/builtin.c @@ -1,3 +1,4 @@ +#include #include #include "builtin.h" #include "compile.h" @@ -5,6 +6,7 @@ #include "locfile.h" #include "jv_aux.h" #include "jv_unicode.h" +#include "main.h" @@ -566,16 +568,44 @@ static const char* const jq_builtins[] = { }; -block builtins_bind(block b) { +int builtins_bind_one(block* bb, const char* code) { + struct locfile src; + locfile_init(&src, code, strlen(code)); + block funcs; + int nerrors = jq_parse_library(&src, &funcs); + if (nerrors == 0) { + *bb = block_bind_referenced(funcs, *bb, OP_IS_CALL_PSEUDO); + } + locfile_free(&src); + return nerrors; +} + +int slurp_lib(block* bb) { + int nerrors = 0; + char* home = getenv("HOME"); + if (home) { // silently ignore no $HOME + jv filename = jv_string_append_str(jv_string(home), "/.jq"); + jv data = slurp_file(jv_string_value(filename), 1); + if (jv_is_valid(data)) { + nerrors = builtins_bind_one(bb, jv_string_value(data) ); + } + jv_free(filename); + jv_free(data); + } + return nerrors; +} + +int builtins_bind(block* bb) { + int nerrors = slurp_lib(bb); + if (nerrors) { + block_free(*bb); + return nerrors; + } 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); + nerrors = builtins_bind_one(bb, jq_builtins[i]); assert(!nerrors); - b = block_bind_referenced(funcs, b, OP_IS_CALL_PSEUDO); - locfile_free(&src); } - b = bind_bytecoded_builtins(b); - return gen_cbinding(function_list, sizeof(function_list)/sizeof(function_list[0]), b); + *bb = bind_bytecoded_builtins(*bb); + *bb = gen_cbinding(function_list, sizeof(function_list)/sizeof(function_list[0]), *bb); + return nerrors; } -- cgit v1.2.3