From e5a07f468508f5e599723373445d442623ece70d Mon Sep 17 00:00:00 2001 From: Paul Donald Date: Sat, 30 Nov 2024 02:18:47 +0100 Subject: [PATCH] main: defer processing until options are processed fixes load order of -i parameter. Signed-off-by: Paul Donald --- main.c | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/main.c b/main.c index 6f29f59..1b56978 100644 --- a/main.c +++ b/main.c @@ -465,9 +465,12 @@ int main(int argc, char **argv) { bool array_mode = false; int opt, rv = 0, limit = 0x7FFFFFFF; + int te_opt = -1; + bool i_s_flag = false, t_e_flag = false; FILE *input = stdin; struct json_object *jsobj = NULL; const char *jserr = NULL, *source = NULL, *separator = " "; + char *te_source = NULL; if (argc == 1) { @@ -488,6 +491,8 @@ int main(int argc, char **argv) goto out; case 'i': + i_s_flag = true; + input = fopen(optarg, "r"); if (!input) @@ -502,6 +507,8 @@ int main(int argc, char **argv) break; case 's': + i_s_flag = true; + source = optarg; break; @@ -516,31 +523,37 @@ int main(int argc, char **argv) case 't': case 'e': - if (!jsobj) - { - jsobj = parse_json(input, source, &jserr, array_mode); - - if (!jsobj) - { - fprintf(stderr, "Failed to parse json data: %s\n", - jserr); - - rv = 126; - goto out; - } - } - - if (!filter_json(opt, jsobj, optarg, separator, limit)) - rv = 1; + t_e_flag = true; + // defer parsing and filtering + te_source = optarg; + te_opt = opt; break; case 'q': fclose(stderr); break; } + + } + + // Deferred JSON parsing after option parsing is complete + if (!jsobj && i_s_flag) + { + jsobj = parse_json(input, source, &jserr, array_mode); + if (!jsobj) + { + fprintf(stderr, "Failed to parse JSON data: %s\n", jserr); + rv = 126; + goto out; + } } + // Handle filtering and other JSON operations + if(te_opt != -1 && t_e_flag) + if (!filter_json(te_opt, jsobj, te_source, separator, limit)) + rv = 1; + out: if (jsobj) json_object_put(jsobj); -- 2.30.2