Add -e | --exit-status CLI option
This commit is contained in:
1 parent
8cee66e609
commit
d018e43ddc
1 file changed
+25
-5
@@ -59,17 +59,26 @@ enum {
|
|||||||
|
|
||||||
FROM_FILE = 512,
|
FROM_FILE = 512,
|
||||||
|
|
||||||
|
EXIT_STATUS = 8192,
|
||||||
|
|
||||||
/* debugging only */
|
/* debugging only */
|
||||||
DUMP_DISASM = 2048,
|
DUMP_DISASM = 2048,
|
||||||
};
|
};
|
||||||
static int options = 0;
|
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);
|
jq_start(jq, value, flags);
|
||||||
jv result;
|
jv result;
|
||||||
while (jv_is_valid(result = jq_next(jq))) {
|
while (jv_is_valid(result = jq_next(jq))) {
|
||||||
if ((options & RAW_OUTPUT) && jv_get_kind(result) == JV_KIND_STRING) {
|
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);
|
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);
|
jv_free(result);
|
||||||
} else {
|
} else {
|
||||||
int dumpopts;
|
int dumpopts;
|
||||||
@@ -86,11 +95,18 @@ static void process(jq_state *jq, jv value, int flags) {
|
|||||||
if (options & COLOUR_OUTPUT) dumpopts |= JV_PRINT_COLOUR;
|
if (options & COLOUR_OUTPUT) dumpopts |= JV_PRINT_COLOUR;
|
||||||
if (options & NO_COLOUR_OUTPUT) dumpopts &= ~JV_PRINT_COLOUR;
|
if (options & NO_COLOUR_OUTPUT) dumpopts &= ~JV_PRINT_COLOUR;
|
||||||
if (options & UNBUFFERED_OUTPUT) dumpopts |= JV_PRINT_UNBUFFERED;
|
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);
|
jv_dump(result, dumpopts);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
jv_free(result);
|
jv_free(result);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE* current_input;
|
FILE* current_input;
|
||||||
@@ -178,6 +194,8 @@ int main(int argc, char* argv[]) {
|
|||||||
options |= PROVIDE_NULL;
|
options |= PROVIDE_NULL;
|
||||||
} else if (isoption(argv[i], 'f', "from-file")) {
|
} else if (isoption(argv[i], 'f', "from-file")) {
|
||||||
options |= FROM_FILE;
|
options |= FROM_FILE;
|
||||||
|
} else if (isoption(argv[i], 'e', "exit-status")) {
|
||||||
|
options |= EXIT_STATUS;
|
||||||
} else if (isoption(argv[i], 0, "arg")) {
|
} else if (isoption(argv[i], 0, "arg")) {
|
||||||
if (i >= argc - 2) {
|
if (i >= argc - 2) {
|
||||||
fprintf(stderr, "%s: --arg takes two parameters (e.g. -a varname value)\n", progname);
|
fprintf(stderr, "%s: --arg takes two parameters (e.g. -a varname value)\n", progname);
|
||||||
@@ -251,7 +269,7 @@ int main(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (options & PROVIDE_NULL) {
|
if (options & PROVIDE_NULL) {
|
||||||
process(jq, jv_null(), jq_flags);
|
ret = process(jq, jv_null(), jq_flags);
|
||||||
} else {
|
} else {
|
||||||
jv slurped;
|
jv slurped;
|
||||||
if (options & SLURP) {
|
if (options & SLURP) {
|
||||||
@@ -271,7 +289,7 @@ int main(int argc, char* argv[]) {
|
|||||||
slurped = jv_string_concat(slurped, jv_string(buf));
|
slurped = jv_string_concat(slurped, jv_string(buf));
|
||||||
} else {
|
} else {
|
||||||
if (buf[len-1] == '\n') buf[len-1] = 0;
|
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 {
|
} else {
|
||||||
@@ -281,7 +299,7 @@ int main(int argc, char* argv[]) {
|
|||||||
if (options & SLURP) {
|
if (options & SLURP) {
|
||||||
slurped = jv_array_append(slurped, value);
|
slurped = jv_array_append(slurped, value);
|
||||||
} else {
|
} else {
|
||||||
process(jq, value, jq_flags);
|
ret = process(jq, value, jq_flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (jv_invalid_has_msg(jv_copy(value))) {
|
if (jv_invalid_has_msg(jv_copy(value))) {
|
||||||
@@ -299,11 +317,13 @@ int main(int argc, char* argv[]) {
|
|||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto out;
|
goto out;
|
||||||
if (options & SLURP) {
|
if (options & SLURP) {
|
||||||
process(jq, slurped, jq_flags);
|
ret = process(jq, slurped, jq_flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
jv_mem_free(input_filenames);
|
jv_mem_free(input_filenames);
|
||||||
jq_teardown(&jq);
|
jq_teardown(&jq);
|
||||||
|
if (ret >= 10 && ret <= 11 && !(options & EXIT_STATUS))
|
||||||
|
return 0;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user