]> granicus.if.org Git - jq/commitdiff
Load library from ~/.jq 130/head
authorBrendan Macmillan <melbourne.research@gmail.com>
Thu, 16 May 2013 17:03:42 +0000 (03:03 +1000)
committerBrendan Macmillan <melbourne.research@gmail.com>
Wed, 29 May 2013 05:05:40 +0000 (15:05 +1000)
.gitignore
builtin.c
builtin.h
execute.c
main.c
main.h [new file with mode: 0644]

index ba354c63def601303400c4b5d39df323d172a397..eab159d4f8db4e06624a0822d520d813bacf643c 100644 (file)
@@ -1,5 +1,7 @@
 *.o
 *~
+.*.sw[a-p]
+tags
 
 jq
 jq.1
index 071cb564618230281cd40dce8712c50e36cc1335..e6cfa4da42494ce18e097519eda34869da6c6156 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -1,3 +1,4 @@
+#include <stdlib.h>
 #include <string.h>
 #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;
 }
index 538a1391419986d98323c0f58350a584918e43c2..fdbce92a06d3625ef46d90a163c26d9443b96f04 100644 (file)
--- a/builtin.h
+++ b/builtin.h
@@ -3,7 +3,7 @@
 
 #include "compile.h"
 
-block builtins_bind(block);
+int builtins_bind(block*);
 
 
 typedef void (*cfunction_ptr)(void);
index fe8e69855bd6c9016dabdac546a66c4e072d760d..44cf2ba9e8b772ee7c12c16e3ba529ee4608299e 100644 (file)
--- a/execute.c
+++ b/execute.c
@@ -611,8 +611,10 @@ struct bytecode* jq_compile_args(const char* str, jv args) {
       jv_free(name);
     }
     jv_free(args);
-    program = builtins_bind(program);
-    nerrors = block_compile(program, &locations, &bc);
+    nerrors = builtins_bind(&program);
+    if (nerrors == 0) {
+      nerrors = block_compile(program, &locations, &bc);
+    }
   }
   if (nerrors) {
     fprintf(stderr, "%d compile %s\n", nerrors, nerrors > 1 ? "errors" : "error");
diff --git a/main.c b/main.c
index 1e951849f7555f0a3c80ca7fd623880793cfbe96..72ffbc1c8e299e6693beb6d903023419b48867d8 100644 (file)
--- a/main.c
+++ b/main.c
@@ -93,7 +93,7 @@ static void process(jv value, int flags) {
   jq_teardown(&jq);
 }
 
-static jv slurp_file(const char* filename, int raw) {
+jv slurp_file(const char* filename, int raw) {
   FILE* file = fopen(filename, "r");
   struct jv_parser parser;
   jv data;
diff --git a/main.h b/main.h
new file mode 100644 (file)
index 0000000..ec60039
--- /dev/null
+++ b/main.h
@@ -0,0 +1,9 @@
+#ifndef MAIN_H
+#define MAIN_H
+
+#include "compile.h"
+
+jv slurp_file(const char*, int);
+
+
+#endif