diff options
-rw-r--r-- | docs/plistutil.1 | 3 | ||||
-rw-r--r-- | tools/plistutil.c | 29 |
2 files changed, 26 insertions, 6 deletions
diff --git a/docs/plistutil.1 b/docs/plistutil.1 index 5342e91..b0bf61d 100644 --- a/docs/plistutil.1 +++ b/docs/plistutil.1 @@ -30,6 +30,9 @@ convert to/from JSON or OpenStep the output format needs to specified. JSON and OpenStep only: Print output in compact form. By default, the output will be pretty-printed. .TP +.B \-s, \-\-sort +Sort all dictionary nodes lexicographically by key before converting to the output format. +.TP .B \-h, \-\-help Prints usage information. .TP diff --git a/tools/plistutil.c b/tools/plistutil.c index 6254b7c..1c199fe 100644 --- a/tools/plistutil.c +++ b/tools/plistutil.c @@ -41,10 +41,12 @@ typedef struct _options { char *in_file, *out_file; - uint8_t debug; - uint8_t compact; uint8_t in_fmt, out_fmt; // fmts 0 = undef, 1 = bin, 2 = xml, 3 = json, 4 = openstep + uint8_t flags; } options_t; +#define OPT_DEBUG (1 << 0) +#define OPT_COMPACT (1 << 1) +#define OPT_SORT (1 << 2) static void print_usage(int argc, char *argv[]) { @@ -65,6 +67,8 @@ static void print_usage(int argc, char *argv[]) printf(" and binary to XML.\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(" -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"); printf(" -v, --version Print version information\n"); printf("\n"); @@ -128,11 +132,15 @@ static options_t *parse_arguments(int argc, char *argv[]) } else if (!strcmp(argv[i], "--compact") || !strcmp(argv[i], "-c")) { - options->compact = 1; + options->flags |= OPT_COMPACT; + } + else if (!strcmp(argv[i], "--sort") || !strcmp(argv[i], "-s")) + { + options->flags |= OPT_SORT; } else if (!strcmp(argv[i], "--debug") || !strcmp(argv[i], "-d")) { - options->debug = 1; + options->flags |= OPT_DEBUG; } else if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) { @@ -252,6 +260,9 @@ int main(int argc, char *argv[]) { input_res = plist_from_bin(plist_entire, read_size, &root_node); if (input_res == PLIST_ERR_SUCCESS) { + if (options->flags & OPT_SORT) { + plist_sort(root_node); + } output_res = plist_to_xml(root_node, &plist_out, &size); } } @@ -259,6 +270,9 @@ int main(int argc, char *argv[]) { input_res = plist_from_xml(plist_entire, read_size, &root_node); if (input_res == PLIST_ERR_SUCCESS) { + if (options->flags & OPT_SORT) { + plist_sort(root_node); + } output_res = plist_to_bin(root_node, &plist_out, &size); } } @@ -267,14 +281,17 @@ int main(int argc, char *argv[]) { input_res = plist_from_memory(plist_entire, read_size, &root_node); if (input_res == PLIST_ERR_SUCCESS) { + if (options->flags & OPT_SORT) { + plist_sort(root_node); + } if (options->out_fmt == 1) { output_res = plist_to_bin(root_node, &plist_out, &size); } else if (options->out_fmt == 2) { output_res = plist_to_xml(root_node, &plist_out, &size); } else if (options->out_fmt == 3) { - output_res = plist_to_json(root_node, &plist_out, &size, !options->compact); + output_res = plist_to_json(root_node, &plist_out, &size, !(options->flags & OPT_COMPACT)); } else if (options->out_fmt == 4) { - output_res = plist_to_openstep(root_node, &plist_out, &size, !options->compact); + output_res = plist_to_openstep(root_node, &plist_out, &size, !(options->flags & OPT_COMPACT)); } } } |