summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Donald2024-11-30 01:18:47 +0000
committerAlexander Couzens2026-02-10 15:23:46 +0000
commite5a07f468508f5e599723373445d442623ece70d (patch)
tree5579f41b8c9d15869bba446451fc5c4953354385
parentafe72ad6414e0faedd3d780d9328e514b0083cae (diff)
downloadjsonpath-master.tar.gz
main: defer processing until options are processedHEADmaster
fixes load order of -i parameter. Signed-off-by: Paul Donald <newtwen+github@gmail.com>
-rw-r--r--main.c45
1 files 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);