diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2015-10-03 17:01:32 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2015-10-03 17:02:43 -0700 |
commit | 88a7228bb2aafb2efb5a7b5de5348ac8105ad9b1 (patch) | |
tree | fa5ddf63d0110c471ddcb1c9944f9637417b1484 | |
parent | ac81caaf77b96c493f941374b50054fc26f7ddba (diff) | |
download | coreutils-88a7228bb2aafb2efb5a7b5de5348ac8105ad9b1.tar.xz |
tee: simplify argv handling
* src/tee.c (tee_files): Last arg is now char ** instead of char
const **, as that is a bit simpler. All callers changed. Modify
files[-1], not files[nfiles], as that is a bit faster and simpler.
Latter problem pointed out by Rainer Deyke in:
http://bugs.gnu.org/21611
-rw-r--r-- | src/tee.c | 24 |
1 files changed, 10 insertions, 14 deletions
@@ -36,7 +36,7 @@ proper_name ("Richard M. Stallman"), \ proper_name ("David MacKenzie") -static bool tee_files (int nfiles, const char **files); +static bool tee_files (int nfiles, char **files); /* If true, append to output files rather than truncating them. */ static bool append; @@ -168,7 +168,7 @@ main (int argc, char **argv) /* Do *not* warn if tee is given no file arguments. POSIX requires that it work when given no arguments. */ - ok = tee_files (argc - optind, (const char **) &argv[optind]); + ok = tee_files (argc - optind, &argv[optind]); if (close (STDIN_FILENO) != 0) error (EXIT_FAILURE, errno, _("standard input")); @@ -176,11 +176,11 @@ main (int argc, char **argv) } /* Copy the standard input into each of the NFILES files in FILES - and into the standard output. + and into the standard output. As a side effect, modify FILES[-1]. Return true if successful. */ static bool -tee_files (int nfiles, const char **files) +tee_files (int nfiles, char **files) { size_t n_outputs = 0; FILE **descriptors; @@ -193,13 +193,6 @@ tee_files (int nfiles, const char **files) ? (append ? "ab" : "wb") : (append ? "a" : "w")); - descriptors = xnmalloc (nfiles + 1, sizeof *descriptors); - - /* Move all the names 'up' one in the argv array to make room for - the entry for standard output. This writes into argv[argc]. */ - for (i = nfiles; i >= 1; i--) - files[i] = files[i - 1]; - if (O_BINARY && ! isatty (STDIN_FILENO)) xfreopen (NULL, "rb", stdin); if (O_BINARY && ! isatty (STDOUT_FILENO)) @@ -207,10 +200,13 @@ tee_files (int nfiles, const char **files) fadvise (stdin, FADVISE_SEQUENTIAL); - /* In the array of NFILES + 1 descriptors, make - the first one correspond to standard output. */ + /* Set up FILES[0 .. NFILES] and DESCRIPTORS[0 .. NFILES]. + In both arrays, entry 0 corresponds to standard output. */ + + descriptors = xnmalloc (nfiles + 1, sizeof *descriptors); + files--; descriptors[0] = stdout; - files[0] = _("standard output"); + files[0] = bad_cast (_("standard output")); setvbuf (stdout, NULL, _IONBF, 0); n_outputs++; |