| @@ -38,6 +38,8 @@ | |||||
| static int formatted_output = JSON_C_TO_STRING_SPACED; | static int formatted_output = JSON_C_TO_STRING_SPACED; | ||||
| static int show_output = 1; | static int show_output = 1; | ||||
| static int strict_mode = 0; | static int strict_mode = 0; | ||||
| static int validate_utf8 = 0; | |||||
| static int tokener_flags = 0; | |||||
| static int color = 0; | static int color = 0; | ||||
| static const char *fname = NULL; | static const char *fname = NULL; | ||||
| @@ -76,11 +78,18 @@ static int parseit(int fd, int (*callback)(struct json_object *)) | |||||
| } | } | ||||
| if (strict_mode) | if (strict_mode) | ||||
| { | { | ||||
| json_tokener_set_flags(tok, JSON_TOKENER_STRICT | |||||
| #ifdef JSON_TOKENER_ALLOW_TRAILING_CHARS | |||||
| | JSON_TOKENER_ALLOW_TRAILING_CHARS | |||||
| tokener_flags |= JSON_TOKENER_STRICT; | |||||
| #ifdef JSON_TOKENER_ALLOW_TRAILING_CHARS | |||||
| tokener_flags |= JSON_TOKENER_ALLOW_TRAILING_CHARS; | |||||
| #endif | #endif | ||||
| ); | |||||
| } | |||||
| if (validate_utf8) | |||||
| { | |||||
| tokener_flags |= JSON_TOKENER_VALIDATE_UTF8; | |||||
| } | |||||
| if (tokener_flags) | |||||
| { | |||||
| json_tokener_set_flags(tok, tokener_flags); | |||||
| } | } | ||||
| // XXX push this into some kind of json_tokener_parse_fd API? | // XXX push this into some kind of json_tokener_parse_fd API? | ||||
| @@ -160,13 +169,15 @@ static void usage(const char *argv0, int exitval, const char *errmsg) | |||||
| fp = stderr; | fp = stderr; | ||||
| if (errmsg != NULL) | if (errmsg != NULL) | ||||
| fprintf(fp, "ERROR: %s\n\n", errmsg); | fprintf(fp, "ERROR: %s\n\n", errmsg); | ||||
| fprintf(fp, "Usage: %s [-f|-F <arg>] [-n] [-s]\n", argv0); | |||||
| fprintf(fp, "Usage: %s [-f|-F <arg>] [-n] [-s] [-u] [filename]\n", argv0); | |||||
| fprintf(fp, " -f - Format the output to stdout with JSON_C_TO_STRING_PRETTY (default is JSON_C_TO_STRING_SPACED)\n"); | fprintf(fp, " -f - Format the output to stdout with JSON_C_TO_STRING_PRETTY (default is JSON_C_TO_STRING_SPACED)\n"); | ||||
| fprintf(fp, " -F - Format the output to stdout with <arg>, e.g. 0 for JSON_C_TO_STRING_PLAIN\n"); | fprintf(fp, " -F - Format the output to stdout with <arg>, e.g. 0 for JSON_C_TO_STRING_PLAIN\n"); | ||||
| fprintf(fp, " -n - No output\n"); | fprintf(fp, " -n - No output\n"); | ||||
| fprintf(fp, " -c - color\n"); | |||||
| fprintf(fp, " -s - Parse in strict mode, flags:\n"); | |||||
| fprintf(fp, " -c - Set JSON_C_TO_STRING_COLOR to colorize the output\n"); | |||||
| fprintf(fp, " -P - Initialize tokener flags to the given value\n"); | |||||
| fprintf(fp, " -s - Parse in strict mode, add flags:\n"); | |||||
| fprintf(fp, " JSON_TOKENER_STRICT|JSON_TOKENER_ALLOW_TRAILING_CHARS\n"); | fprintf(fp, " JSON_TOKENER_STRICT|JSON_TOKENER_ALLOW_TRAILING_CHARS\n"); | ||||
| fprintf(fp, " -u - Add the JSON_TOKENER_VALIDATE_UTF8 flag when parsing\n"); | |||||
| fprintf(fp, " Diagnostic information will be emitted to stderr\n"); | fprintf(fp, " Diagnostic information will be emitted to stderr\n"); | ||||
| fprintf(fp, "\nWARNING WARNING WARNING\n"); | fprintf(fp, "\nWARNING WARNING WARNING\n"); | ||||
| @@ -178,26 +189,28 @@ int main(int argc, char **argv) | |||||
| { | { | ||||
| int opt; | int opt; | ||||
| while ((opt = getopt(argc, argv, "fF:hnsc")) != -1) | |||||
| while ((opt = getopt(argc, argv, "cfF:hnP:su")) != -1) | |||||
| { | { | ||||
| switch (opt) | switch (opt) | ||||
| { | { | ||||
| case 'c': color = JSON_C_TO_STRING_COLOR; break; | |||||
| case 'f': formatted_output = JSON_C_TO_STRING_PRETTY; break; | case 'f': formatted_output = JSON_C_TO_STRING_PRETTY; break; | ||||
| case 'F': formatted_output = atoi(optarg); break; | case 'F': formatted_output = atoi(optarg); break; | ||||
| case 'n': show_output = 0; break; | case 'n': show_output = 0; break; | ||||
| case 'P': tokener_flags = atoi(optarg); break; | |||||
| case 's': strict_mode = 1; break; | case 's': strict_mode = 1; break; | ||||
| case 'c': color = JSON_C_TO_STRING_COLOR; break; | |||||
| case 'u': validate_utf8 = 1; break; | |||||
| case 'h': usage(argv[0], 0, NULL); | case 'h': usage(argv[0], 0, NULL); | ||||
| default: /* '?' */ usage(argv[0], EXIT_FAILURE, "Unknown arguments"); | default: /* '?' */ usage(argv[0], EXIT_FAILURE, "Unknown arguments"); | ||||
| } | } | ||||
| } | } | ||||
| if (optind >= argc) | |||||
| int fd = STDIN_FILENO; | |||||
| fname = "stdin"; | |||||
| if (argc > optind && strcmp(argv[optind], "-") != 0) | |||||
| { | { | ||||
| usage(argv[0], EXIT_FAILURE, "Expected argument after options"); | |||||
| fname = argv[optind]; | |||||
| fd = open(fname, O_RDONLY, 0); | |||||
| } | } | ||||
| fname = argv[optind]; | |||||
| int fd = open(argv[optind], O_RDONLY, 0); | |||||
| showmem(); | showmem(); | ||||
| if (parseit(fd, showobj) != 0) | if (parseit(fd, showobj) != 0) | ||||
| exit(EXIT_FAILURE); | exit(EXIT_FAILURE); | ||||