Fix stderr to output string with no decoration (fix #2063)
This commit is contained in:
1 parent
dfdce8c6e7
commit
98f709d0c1
5 files changed
+47
-2
No files matched your search
+5
-1
@@ -1245,7 +1245,11 @@ static jv f_debug(jq_state *jq, jv input) {
|
||||
}
|
||||
|
||||
static jv f_stderr(jq_state *jq, jv input) {
|
||||
jv_dumpf(jv_copy(input), stderr, 0);
|
||||
jq_msg_cb cb;
|
||||
void *data;
|
||||
jq_get_stderr_cb(jq, &cb, &data);
|
||||
if (cb != NULL)
|
||||
cb(data, jv_copy(input));
|
||||
return input;
|
||||
}
|
||||
|
||||
|
||||
@@ -49,6 +49,8 @@ struct jq_state {
|
||||
void *input_cb_data;
|
||||
jq_msg_cb debug_cb;
|
||||
void *debug_cb_data;
|
||||
jq_msg_cb stderr_cb;
|
||||
void *stderr_cb_data;
|
||||
};
|
||||
|
||||
struct closure {
|
||||
@@ -1018,6 +1020,9 @@ jq_state *jq_init(void) {
|
||||
jq->debug_cb = NULL;
|
||||
jq->debug_cb_data = NULL;
|
||||
|
||||
jq->stderr_cb = NULL;
|
||||
jq->stderr_cb_data = NULL;
|
||||
|
||||
jq->err_cb = default_err_cb;
|
||||
jq->err_cb_data = stderr;
|
||||
|
||||
@@ -1249,6 +1254,16 @@ void jq_get_debug_cb(jq_state *jq, jq_msg_cb *cb, void **data) {
|
||||
*data = jq->debug_cb_data;
|
||||
}
|
||||
|
||||
void jq_set_stderr_cb(jq_state *jq, jq_msg_cb cb, void *data) {
|
||||
jq->stderr_cb = cb;
|
||||
jq->stderr_cb_data = data;
|
||||
}
|
||||
|
||||
void jq_get_stderr_cb(jq_state *jq, jq_msg_cb *cb, void **data) {
|
||||
*cb = jq->stderr_cb;
|
||||
*data = jq->stderr_cb_data;
|
||||
}
|
||||
|
||||
void
|
||||
jq_halt(jq_state *jq, jv exit_code, jv error_message)
|
||||
{
|
||||
|
||||
@@ -34,9 +34,10 @@ jv jq_get_error_message(jq_state *);
|
||||
typedef jv (*jq_input_cb)(jq_state *, void *);
|
||||
void jq_set_input_cb(jq_state *, jq_input_cb, void *);
|
||||
void jq_get_input_cb(jq_state *, jq_input_cb *, void **);
|
||||
|
||||
void jq_set_debug_cb(jq_state *, jq_msg_cb, void *);
|
||||
void jq_get_debug_cb(jq_state *, jq_msg_cb *, void **);
|
||||
void jq_set_stderr_cb(jq_state *, jq_msg_cb, void *);
|
||||
void jq_get_stderr_cb(jq_state *, jq_msg_cb *, void **);
|
||||
|
||||
void jq_set_attrs(jq_state *, jv);
|
||||
jv jq_get_attrs(jq_state *);
|
||||
|
||||
+15
@@ -263,6 +263,18 @@ static void debug_cb(void *data, jv input) {
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
|
||||
static void stderr_cb(void *data, jv input) {
|
||||
if (jv_get_kind(input) == JV_KIND_STRING) {
|
||||
int dumpopts = *(int *)data;
|
||||
priv_fwrite(jv_string_value(input), jv_string_length_bytes(jv_copy(input)),
|
||||
stderr, dumpopts & JV_PRINT_ISATTY);
|
||||
} else {
|
||||
input = jv_dump_string(input, 0);
|
||||
fprintf(stderr, "%s", jv_string_value(input));
|
||||
}
|
||||
jv_free(input);
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
int umain(int argc, char* argv[]);
|
||||
|
||||
@@ -694,6 +706,9 @@ int main(int argc, char* argv[]) {
|
||||
// Let jq program call `debug` builtin and have that go somewhere
|
||||
jq_set_debug_cb(jq, debug_cb, &dumpopts);
|
||||
|
||||
// Let jq program call `stderr` builtin and have that go somewhere
|
||||
jq_set_stderr_cb(jq, stderr_cb, &dumpopts);
|
||||
|
||||
if (nfiles == 0)
|
||||
jq_util_input_add_input(input_state, "-");
|
||||
|
||||
|
||||
@@ -237,6 +237,16 @@ grep "Expected string key after '{', not '\\['" $d/err > /dev/null
|
||||
echo '{"x":"y",["a","b"]}' | $JQ --stream > /dev/null 2> $d/err || true
|
||||
grep "Expected string key after ',' in object, not '\\['" $d/err > /dev/null
|
||||
|
||||
# debug, stderr
|
||||
$VALGRIND $Q $JQ -n '"test", {} | debug, stderr' >/dev/null
|
||||
$JQ -n -c -j '"hello\nworld", null, [false, 0], {"foo":["bar"]}, "\n" | stderr' >$d/out 2>$d/err
|
||||
cat > $d/expected <<'EOF'
|
||||
hello
|
||||
worldnull[false,0]{"foo":["bar"]}
|
||||
EOF
|
||||
cmp $d/out $d/expected
|
||||
cmp $d/err $d/expected
|
||||
|
||||
# --arg, --argjson, $ARGS.named
|
||||
$VALGRIND $JQ -n -c --arg foo 1 --argjson bar 2 '{$foo, $bar} | ., . == $ARGS.named' > $d/out
|
||||
printf '{"foo":"1","bar":2}\ntrue\n' > $d/expected
|
||||
|
||||
Reference in new issue
Block a user