]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
Revert last change -- timing showed 10% speedup w/o stream I/O.
authorJim Meyering <jim@meyering.net>
Tue, 11 Jan 1994 05:52:05 +0000 (05:52 +0000)
committerJim Meyering <jim@meyering.net>
Tue, 11 Jan 1994 05:52:05 +0000 (05:52 +0000)
src/tac.c

index 38008acd8f125d9612e3f370ad9de4e734ce1361..c295de444f0ca89f570420d325c78f467b9022b9 100644 (file)
--- a/src/tac.c
+++ b/src/tac.c
@@ -75,6 +75,7 @@ static char *xmalloc ();
 static char *xrealloc ();
 static void output ();
 static void save_stdin ();
+static void xwrite ();
 
 void error ();
 int full_write ();
@@ -250,12 +251,13 @@ main (argc, argv)
          errors |= tac_file (argv[optind]);
       }
 
-  if (ferror (stdout) || fclose (stdout) == EOF)
-    error (1, errno, "write error");
+  /* Flush the output buffer. */
+  output ((char *) NULL, (char *) NULL);
 
   if (have_read_stdin && close (0) < 0)
     error (1, errno, "-");
-
+  if (close (1) < 0)
+    error (1, errno, "write error");
   exit (errors);
 }
 
@@ -600,11 +602,31 @@ output (start, past_end)
      char *start;
      char *past_end;
 {
-  int n_bytes;
+  static char buffer[WRITESIZE];
+  static int bytes_in_buffer = 0;
+  int bytes_to_add = past_end - start;
+  int bytes_available = WRITESIZE - bytes_in_buffer;
+
+  if (start == 0)
+    {
+      xwrite (1, buffer, bytes_in_buffer);
+      bytes_in_buffer = 0;
+      return;
+    }
+
+  /* Write out as many full buffers as possible. */
+  while (bytes_to_add >= bytes_available)
+    {
+      bcopy (start, buffer + bytes_in_buffer, bytes_available);
+      bytes_to_add -= bytes_available;
+      start += bytes_available;
+      xwrite (1, buffer, WRITESIZE);
+      bytes_in_buffer = 0;
+      bytes_available = WRITESIZE;
+    }
 
-  n_bytes = past_end - start;
-  
-  fwrite (start, 1, n_bytes, stdout);
+  bcopy (start, buffer + bytes_in_buffer, bytes_to_add);
+  bytes_in_buffer += bytes_to_add;
 }
 
 static RETSIGTYPE
@@ -614,6 +636,19 @@ cleanup ()
   exit (1);
 }
 
+static void
+xwrite (desc, buffer, size)
+     int desc;
+     char *buffer;
+     int size;
+{
+  if (full_write (desc, buffer, size) < 0)
+    {
+      error (0, errno, "write error");
+      cleanup ();
+    }
+}
+
 /* Allocate N bytes of memory dynamically, with error checking.  */
 
 static char *