Add jsonptr --compact, --indent and --tabs flags
diff --git a/example/jsonptr/jsonptr.cc b/example/jsonptr/jsonptr.cc
index c4f849b..6b18dad 100644
--- a/example/jsonptr/jsonptr.cc
+++ b/example/jsonptr/jsonptr.cc
@@ -74,8 +74,12 @@
 // ----
 
 #define MAX_INDENT 8
-#define INDENT_STRING "        "
-size_t indent;
+#define INDENT_SPACES_STRING "        "
+#define INDENT_TABS_STRING "\t\t\t\t\t\t\t\t"
+
+bool flag_compact;
+size_t flag_indent;
+bool flag_tabs;
 
 #ifndef DST_BUFFER_SIZE
 #define DST_BUFFER_SIZE (32 * 1024)
@@ -114,7 +118,9 @@
 
 const char*  //
 initialize_globals(int argc, char** argv) {
-  indent = 4;
+  flag_compact = false;
+  flag_indent = 4;
+  flag_tabs = false;
 
   dst = wuffs_base__make_io_buffer(
       wuffs_base__make_slice_u8(dst_array, DST_BUFFER_SIZE),
@@ -134,6 +140,40 @@
 
   ctx = context::none;
 
+  int i;
+  for (i = 1; i < argc; i++) {
+    if (argv[i][0] != '-') {
+      return "main: bad argument: use \"jsonptr < foo.json\", not \"jsonptr "
+             "foo.json\"";
+    }
+
+    if ((strcmp(argv[i], "-c") == 0) ||  //
+        (strcmp(argv[i], "--compact") == 0)) {
+      flag_compact = true;
+      continue;
+
+    } else if ((strncmp(argv[i], "-i=", 3) == 0) ||  //
+               (strncmp(argv[i], "--indent=", 9) == 0)) {
+      // Set p to point just after the '='.
+      char* p = argv[i];
+      for (; *p != '='; p++) {
+      }
+      p++;
+
+      if (('0' <= p[0]) && (p[0] <= '8') && (p[1] == '\x00')) {
+        flag_indent = p[0] - '0';
+        continue;
+      }
+
+    } else if ((strcmp(argv[i], "-t") == 0) ||  //
+               (strcmp(argv[i], "--tabs") == 0)) {
+      flag_tabs = true;
+      continue;
+    }
+
+    return "main: bad argument";
+  }
+
   return dec.initialize(sizeof__wuffs_json__decoder(), WUFFS_VERSION, 0)
       .message();
 }
@@ -300,10 +340,11 @@
 
       // Write preceding whitespace.
       if ((ctx != context::in_list_after_bracket) &&
-          (ctx != context::in_dict_after_brace)) {
+          (ctx != context::in_dict_after_brace) && !flag_compact) {
         TRY(write_dst("\n", 1));
         for (size_t i = 0; i < depth; i++) {
-          TRY(write_dst(INDENT_STRING, indent));
+          TRY(write_dst(flag_tabs ? INDENT_TABS_STRING : INDENT_SPACES_STRING,
+                        flag_indent));
         }
       }
 
@@ -320,15 +361,18 @@
     if (t.link_prev()) {
       // No-op.
     } else if (ctx == context::in_dict_after_key) {
-      TRY(write_dst(": ", 2));
+      TRY(write_dst(": ", flag_compact ? 1 : 2));
     } else if (ctx != context::none) {
       if ((ctx != context::in_list_after_bracket) &&
           (ctx != context::in_dict_after_brace)) {
         TRY(write_dst(",", 1));
       }
-      TRY(write_dst("\n", 1));
-      for (size_t i = 0; i < depth; i++) {
-        TRY(write_dst(INDENT_STRING, indent));
+      if (!flag_compact) {
+        TRY(write_dst("\n", 1));
+        for (size_t i = 0; i < depth; i++) {
+          TRY(write_dst(flag_tabs ? INDENT_TABS_STRING : INDENT_SPACES_STRING,
+                        flag_indent));
+        }
       }
     }