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, "-");
|
||||
|
||||
|
||||
Reference in new issue
Block a user