]> granicus.if.org Git - jq/commitdiff
Add -e | --exit-status CLI option
authorNicolas Williams <nico@cryptonector.com>
Fri, 29 Nov 2013 22:36:15 +0000 (16:36 -0600)
committerNicolas Williams <nico@cryptonector.com>
Thu, 5 Dec 2013 00:21:40 +0000 (18:21 -0600)
main.c

diff --git a/main.c b/main.c
index c9e09ce81eb94f1ab89d5122cc8c6c54e3a651e1..a71592199efc7bbdee3033ecd5ba7be8d3884423 100644 (file)
--- a/main.c
+++ b/main.c
@@ -59,17 +59,26 @@ enum {
 
   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;
@@ -86,11 +95,18 @@ static void process(jq_state *jq, jv value, int flags) {
       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;
@@ -178,6 +194,8 @@ int main(int argc, char* argv[]) {
       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);
@@ -251,7 +269,7 @@ int main(int argc, char* argv[]) {
   }
 
   if (options & PROVIDE_NULL) {
-    process(jq, jv_null(), jq_flags);
+    ret = process(jq, jv_null(), jq_flags);
   } else {
     jv slurped;
     if (options & SLURP) {
@@ -271,7 +289,7 @@ int main(int argc, char* argv[]) {
             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 {
@@ -281,7 +299,7 @@ int main(int argc, char* argv[]) {
           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))) {
@@ -299,11 +317,13 @@ int main(int argc, char* argv[]) {
     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;
 }