main: defer processing until options are processed master
authorPaul Donald <newtwen+github@gmail.com>
Sat, 30 Nov 2024 01:18:47 +0000 (02:18 +0100)
committerAlexander Couzens <lynxis@fe80.eu>
Tue, 10 Feb 2026 15:23:46 +0000 (16:23 +0100)
fixes load order of -i parameter.

Signed-off-by: Paul Donald <newtwen+github@gmail.com>
main.c

diff --git a/main.c b/main.c
index 6f29f59af07f815b30761735bed656b691344a35..1b56978bf5fadbcf9fab087218c045b03a57aebc 100644 (file)
--- 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);