Enable yaz backtrace for programs YAZ-802
[yaz-moved-to-github.git] / util / json-parse.c
index db3e473..99a766c 100644 (file)
@@ -1,7 +1,10 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2010 Index Data
+ * Copyright (C) Index Data
  * See the file LICENSE for details.
  */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -10,6 +13,7 @@
 #include <yaz/json.h>
 #include <yaz/wrbuf.h>
 #include <yaz/options.h>
+#include <yaz/backtrace.h>
 
 void usage(const char *prog)
 {
@@ -22,6 +26,7 @@ static struct json_node *do_parse_from_stdin(void)
     FILE *f = stdin;
     WRBUF w = wrbuf_alloc();
     struct json_node *n;
+    size_t pos;
     const char *json_str;
     const char *err_msg;
     int c;
@@ -29,9 +34,13 @@ static struct json_node *do_parse_from_stdin(void)
     while ((c = getc(f)) != EOF)
         wrbuf_putc(w, c);
     json_str = wrbuf_cstr(w);
-    n = json_parse(json_str, &err_msg);
+    n = json_parse2(json_str, &err_msg, &pos);
     if (!n)
-        fprintf(stderr, "JSON parse error: %s\n", err_msg);
+    {
+        fprintf(stderr, "JSON parse error: %s\nLeading text was:\n", err_msg);
+        fwrite(json_str, 1, pos, stderr);
+        fprintf(stderr, "^\n");
+    }
     wrbuf_destroy(w);
     return n;
 }
@@ -42,12 +51,14 @@ int main(int argc, char **argv)
     int print = 0;
     int ret;
     char *arg;
+
+    yaz_enable_panic_backtrace(*argv);
     while ((ret = options("p", argv, argc, &arg)) != YAZ_OPTIONS_EOF)
     {
         switch (ret)
         {
         case 'p':
-            print = 1;
+            print++;
             break;
         default:
             usage(argv[0]);
@@ -59,7 +70,10 @@ int main(int argc, char **argv)
     if (print)
     {
         WRBUF result = wrbuf_alloc();
-        json_write_wrbuf(n, result);
+        if (print > 1)
+            json_write_wrbuf_pretty(n, result);
+        else
+            json_write_wrbuf(n, result);
         puts(wrbuf_cstr(result));
         wrbuf_destroy(result);
     }