FROM_FILE = 512,
+ EXIT_STATUS = 8192,
+
/* debugging only */
DUMP_DISASM = 2048,
};
static int options = 0;
-static void process(jq_state *jq, jv value, int flags) {
+static int process(jq_state *jq, jv value, int flags) {
+ int ret = 0;
jq_start(jq, value, flags);
jv result;
while (jv_is_valid(result = jq_next(jq))) {
if ((options & RAW_OUTPUT) && jv_get_kind(result) == JV_KIND_STRING) {
fwrite(jv_string_value(result), 1, jv_string_length_bytes(jv_copy(result)), stdout);
+ if (jv_get_kind(result) == JV_KIND_FALSE)
+ ret = 10;
+ else if (jv_get_kind(result) == JV_KIND_NULL)
+ ret = 11;
+ else
+ ret = 0;
jv_free(result);
} else {
int dumpopts;
if (options & COLOUR_OUTPUT) dumpopts |= JV_PRINT_COLOUR;
if (options & NO_COLOUR_OUTPUT) dumpopts &= ~JV_PRINT_COLOUR;
if (options & UNBUFFERED_OUTPUT) dumpopts |= JV_PRINT_UNBUFFERED;
+ if (jv_get_kind(result) == JV_KIND_FALSE)
+ ret = 10;
+ else if (jv_get_kind(result) == JV_KIND_NULL)
+ ret = 11;
+ else
+ ret = 0;
jv_dump(result, dumpopts);
}
printf("\n");
}
jv_free(result);
+ return ret;
}
FILE* current_input;
options |= PROVIDE_NULL;
} else if (isoption(argv[i], 'f', "from-file")) {
options |= FROM_FILE;
+ } else if (isoption(argv[i], 'e', "exit-status")) {
+ options |= EXIT_STATUS;
} else if (isoption(argv[i], 0, "arg")) {
if (i >= argc - 2) {
fprintf(stderr, "%s: --arg takes two parameters (e.g. -a varname value)\n", progname);
}
if (options & PROVIDE_NULL) {
- process(jq, jv_null(), jq_flags);
+ ret = process(jq, jv_null(), jq_flags);
} else {
jv slurped;
if (options & SLURP) {
slurped = jv_string_concat(slurped, jv_string(buf));
} else {
if (buf[len-1] == '\n') buf[len-1] = 0;
- process(jq, jv_string(buf), jq_flags);
+ ret = process(jq, jv_string(buf), jq_flags);
}
}
} else {
if (options & SLURP) {
slurped = jv_array_append(slurped, value);
} else {
- process(jq, value, jq_flags);
+ ret = process(jq, value, jq_flags);
}
}
if (jv_invalid_has_msg(jv_copy(value))) {
if (ret != 0)
goto out;
if (options & SLURP) {
- process(jq, slurped, jq_flags);
+ ret = process(jq, slurped, jq_flags);
}
}
out:
jv_mem_free(input_filenames);
jq_teardown(&jq);
+ if (ret >= 10 && ret <= 11 && !(options & EXIT_STATUS))
+ return 0;
return ret;
}