]> granicus.if.org Git - jq/commitdiff
Add a --unbuffered option. Closes #206
authorStephen Dolan <mu@netsoc.tcd.ie>
Fri, 8 Nov 2013 12:19:41 +0000 (12:19 +0000)
committerStephen Dolan <mu@netsoc.tcd.ie>
Fri, 8 Nov 2013 12:21:45 +0000 (12:21 +0000)
docs/content/3.manual/manual.yml
jv.h
jv_print.c
main.c

index 7f0a353ab8aa8b7e5504cfe39d9ca05b81717808..467617acd53899570524ab0a56619729e6f99a48 100644 (file)
@@ -114,6 +114,12 @@ sections:
         ASCII output with every non-ASCII character replaced with the
         equivalent escape sequence.
 
+      * `--unbuffered`
+
+        Flush the output after each JSON object is printed (useful if
+        you're piping a slow data source into jq and piping jq's
+        output elsewhere).
+
       * `--sort-keys` / `-S`:
         
         Output the fields of each object with the keys in sorted order.
diff --git a/jv.h b/jv.h
index a90102113ee44791f19e1dc801f8b624df534612..0f50359a6b6e1c09a64d87e2ddf15ffeda340750 100644 (file)
--- a/jv.h
+++ b/jv.h
@@ -110,7 +110,7 @@ jv jv_object_iter_value(jv, int);
 
 int jv_get_refcnt(jv);
 
-enum { JV_PRINT_PRETTY = 1, JV_PRINT_ASCII = 2, JV_PRINT_COLOUR = 4, JV_PRINT_SORTED = 8 };
+enum { JV_PRINT_PRETTY = 1, JV_PRINT_ASCII = 2, JV_PRINT_COLOUR = 4, JV_PRINT_SORTED = 8, JV_PRINT_UNBUFFERED = 16 };
 void jv_dump(jv, int flags);
 jv jv_dump_string(jv, int flags);
 
index da90abfbe1fc5db32db8e1f4b2fe939f7f240b10..d6eff040e4b4736c9faa67a2272858ac88a10788 100644 (file)
@@ -265,6 +265,9 @@ void jv_dump(jv x, int flags) {
   jvp_dtoa_context_init(&C);
   jv_dump_term(&C, x, flags, 0, stdout, 0);
   jvp_dtoa_context_free(&C);
+  if (flags & JV_PRINT_UNBUFFERED) {
+    fflush(stdout);
+  }
 }
 
 jv jv_dump_string(jv x, int flags) {
diff --git a/main.c b/main.c
index c365a3c2c9e63df9ac100f54a0171fbbf23aa5a8..c9e09ce81eb94f1ab89d5122cc8c6c54e3a651e1 100644 (file)
--- a/main.c
+++ b/main.c
@@ -55,6 +55,7 @@ enum {
   COLOUR_OUTPUT = 64,
   NO_COLOUR_OUTPUT = 128,
   SORTED_OUTPUT = 256,
+  UNBUFFERED_OUTPUT = 4096,
 
   FROM_FILE = 512,
 
@@ -84,6 +85,7 @@ static void process(jq_state *jq, jv value, int flags) {
       if (options & ASCII_OUTPUT) dumpopts |= JV_PRINT_ASCII;
       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;
       jv_dump(result, dumpopts);
     }
     printf("\n");
@@ -166,6 +168,8 @@ int main(int argc, char* argv[]) {
       options |= NO_COLOUR_OUTPUT;
     } else if (isoption(argv[i], 'a', "ascii-output")) {
       options |= ASCII_OUTPUT;
+    } else if (isoption(argv[i], 0, "unbuffered")) {
+      options |= UNBUFFERED_OUTPUT;
     } else if (isoption(argv[i], 'S', "sort-keys")) {
       options |= SORTED_OUTPUT;
     } else if (isoption(argv[i], 'R', "raw-input")) {