diff options
Diffstat (limited to 'tools/plistutil.c')
| -rw-r--r-- | tools/plistutil.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/tools/plistutil.c b/tools/plistutil.c index bdf195e..fef72b7 100644 --- a/tools/plistutil.c +++ b/tools/plistutil.c @@ -52,6 +52,7 @@ typedef struct _options #define OPT_DEBUG (1 << 0) #define OPT_COMPACT (1 << 1) #define OPT_SORT (1 << 2) +#define OPT_COERCE (1 << 3) static void print_usage(int argc, char *argv[]) { @@ -74,6 +75,10 @@ static void print_usage(int argc, char *argv[]) printf(" -n, --nodepath PATH Restrict output to nodepath defined by PATH.\n"); printf(" -c, --compact JSON and OpenStep only: Print output in compact form.\n"); printf(" By default, the output will be pretty-printed.\n"); + printf(" -C, --coerce JSON only: Coerce non-JSON plist types to JSON-compatible\n"); + printf(" representations. Date values become ISO 8601 strings,\n"); + printf(" data values become Base64-encoded strings, and UID values\n"); + printf(" become integers. Implied when invoked as plist2json.\n"); printf(" -s, --sort Sort all dictionary nodes lexicographically by key\n"); printf(" before converting to the output format.\n"); printf(" -d, --debug Enable extended debug output\n"); @@ -96,6 +101,7 @@ static options_t *parse_arguments(int argc, char *argv[]) { "outfile", required_argument, 0, 'o' }, { "format", required_argument, 0, 'f' }, { "compact", no_argument, 0, 'c' }, + { "coerce", no_argument, 0, 'C' }, { "sort", no_argument, 0, 's' }, { "print", required_argument, 0, 'p' }, { "nodepath", required_argument, 0, 'n' }, @@ -106,7 +112,7 @@ static options_t *parse_arguments(int argc, char *argv[]) }; int c; - while ((c = getopt_long(argc, argv, "i:o:f:csp:n:dhv", long_options, NULL)) != -1) + while ((c = getopt_long(argc, argv, "i:o:f:cCsp:n:dhv", long_options, NULL)) != -1) { switch (c) { @@ -154,6 +160,10 @@ static options_t *parse_arguments(int argc, char *argv[]) options->flags |= OPT_COMPACT; break; + case 'C': + options->flags |= OPT_COERCE; + break; + case 's': options->flags |= OPT_SORT; break; @@ -230,6 +240,18 @@ int main(int argc, char *argv[]) return 0; } + // detect invocation as plist2json symlink + { + char *progname = strrchr(argv[0], '/'); + progname = progname ? progname + 1 : argv[0]; + if (!strcmp(progname, "plist2json")) { + if (options->out_fmt == 0) { + options->out_fmt = PLIST_FORMAT_JSON; + } + options->flags |= OPT_COERCE; + } + } + if (options->flags & OPT_DEBUG) { plist_set_debug(1); @@ -404,7 +426,10 @@ int main(int argc, char *argv[]) } else if (options->out_fmt == PLIST_FORMAT_XML) { output_res = plist_to_xml(root_node, &plist_out, &size); } else if (options->out_fmt == PLIST_FORMAT_JSON) { - output_res = plist_to_json(root_node, &plist_out, &size, !(options->flags & OPT_COMPACT)); + plist_write_options_t wropts = PLIST_OPT_NONE; + if (options->flags & OPT_COMPACT) wropts |= PLIST_OPT_COMPACT; + if (options->flags & OPT_COERCE) wropts |= PLIST_OPT_COERCE; + output_res = plist_to_json_with_options(root_node, &plist_out, &size, wropts); } else if (options->out_fmt == PLIST_FORMAT_OSTEP) { output_res = plist_to_openstep(root_node, &plist_out, &size, !(options->flags & OPT_COMPACT)); } else { |
