From d1cb8ee0ad3ddf03a37394bfa899cfd3ddd007c5 Mon Sep 17 00:00:00 2001 From: Assaf Gordon Date: Fri, 17 Apr 2015 16:08:10 -0400 Subject: 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" } --- util.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'util.c') 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) { -- cgit v1.2.3