summaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
authorAssaf Gordon <assafgordon@gmail.com>2015-04-17 16:08:10 -0400
committerNicolas Williams <nico@cryptonector.com>2015-05-21 00:49:32 -0500
commitd1cb8ee0ad3ddf03a37394bfa899cfd3ddd007c5 (patch)
treee06b0125148eea42b7881c380b6bcfb05c3b102f /util.c
parentc7f063188f50ddf3271828244c5831a30f72a667 (diff)
Add filename/line functions to jq (fix #753)
This adds `input_filename` and `input_line_number` built-in functions for use in, for example, `error` messages. Example: $ printf '{"a":1}\n{"a":2}\n' > 4.json $ printf '{"a":"hello"}\n' > 5.json $ ./jq '{ "file":input_filename, "line":input_line_number, "value":.a }' 4.json 5.json { "file": "4.json", "line": 1, "value": 1 } { "file": "4.json", "line": 2, "value": 2 } { "file": "5.json", "line": 1, "value": "hello" }
Diffstat (limited to 'util.c')
-rw-r--r--util.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/util.c b/util.c
index f6033b73..c8dd4f6d 100644
--- a/util.c
+++ b/util.c
@@ -341,6 +341,29 @@ jv jq_util_input_get_position(jq_state *jq) {
return v;
}
+jv jq_util_input_get_current_filename(jq_state* jq) {
+ jq_input_cb cb=NULL;
+ void *cb_data=NULL;
+ jq_get_input_cb(jq, &cb, &cb_data);
+ if (cb != jq_util_input_next_input_cb)
+ return jv_invalid_with_msg(jv_string("Unknown input filename"));
+ jq_util_input_state s = (jq_util_input_state)cb_data;
+ jv v = jv_copy(s->current_filename);
+ return v;
+}
+
+jv jq_util_input_get_current_line(jq_state* jq) {
+ jq_input_cb cb=NULL;
+ void *cb_data=NULL;
+ jq_get_input_cb(jq, &cb, &cb_data);
+ if (cb != jq_util_input_next_input_cb)
+ return jv_invalid_with_msg(jv_string("Unknown input line number"));
+ jq_util_input_state s = (jq_util_input_state)cb_data;
+ jv v = jv_number(s->current_line);
+ return v;
+}
+
+
// Blocks to read one more input from stdin and/or given files
// When slurping, it returns just one value
jv jq_util_input_next_input(jq_util_input_state state) {