summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2015-10-03 17:01:32 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2015-10-03 17:02:43 -0700
commit88a7228bb2aafb2efb5a7b5de5348ac8105ad9b1 (patch)
treefa5ddf63d0110c471ddcb1c9944f9637417b1484
parentac81caaf77b96c493f941374b50054fc26f7ddba (diff)
downloadcoreutils-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.c24
1 files changed, 10 insertions, 14 deletions
diff --git a/src/tee.c b/src/tee.c
index 35120f89c..350a201ef 100644
--- a/src/tee.c
+++ b/src/tee.c
@@ -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++;