]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
xz: Detect when all data will be written to standard out earlier.
authorJia Tan <jiat0218@gmail.com>
Tue, 14 Nov 2023 12:27:04 +0000 (20:27 +0800)
committerJia Tan <jiat0218@gmail.com>
Tue, 14 Nov 2023 12:27:04 +0000 (20:27 +0800)
If the -c, --stdout argument is not used, then we can still detect when
the data will be written to standard out if all of the provided
filenames are "-" (denoting standard in) or if no filenames are
provided.

src/xz/args.c

index 8b481c93bdd80d1fc9d3cf1ce6d2bee92c45f37c..e3cddda32d1a32dc90c8553dfaab24450aad563a 100644 (file)
@@ -842,6 +842,27 @@ args_parse(args_info *args, int argc, char **argv)
                args->arg_count = (unsigned int)(argc - optind);
        }
 
+       // If all of the filenames provided are "-" (more than one "-"
+       // could be specified) or no filenames are provided, then we are
+       // only going to be writing to standard out. However if --files or
+       // --files0 is used, then we will not be writing to standard out.
+       if (!opt_stdout && args->files_name == NULL) {
+               uint32_t i;
+
+               for (i = 0; i < args->arg_count; i++) {
+                       const char *name = args->arg_names[i];
+
+                       // getopt_long() will not give us an empty string
+                       // as an argument name here so we don't need to
+                       // check if name[0] is a NULL terminator.
+                       if (name[0] != '-' && name[1] != '\0')
+                               break;
+               }
+
+               // Set opt_stdout if the loop did not exit early.
+               opt_stdout = i == args->arg_count;
+       }
+
        return;
 }