Remove unnecessary casts of alloca, since now it's guaranteed to be (void *).
[platform/upstream/coreutils.git] / src / od.c
index 08620a9..d362e66 100644 (file)
--- a/src/od.c
+++ b/src/od.c
@@ -24,7 +24,6 @@
 #include <getopt.h>
 #include <sys/types.h>
 #include "system.h"
-#include "closeout.h"
 #include "error.h"
 #include "posixver.h"
 #include "xstrtol.h"
@@ -32,7 +31,7 @@
 /* The official name of this program (e.g., no `g' prefix).  */
 #define PROGRAM_NAME "od"
 
-#define AUTHORS "Jim Meyering"
+#define WRITTEN_BY _("Written by Jim Meyering.")
 
 #if defined(__GNUC__) || defined(STDC_HEADERS)
 # include <float.h>
@@ -983,10 +982,11 @@ open_next_file (void)
    it is not standard input.  Return nonzero if there has been an error
    on in_stream or stdout; return zero otherwise.  This function will
    report more than one error only if both a read and a write error
-   have occurred.  */
+   have occurred.  IN_ERRNO, if nonzero, is the error number
+   corresponding to the most recent action for IN_STREAM.  */
 
 static int
-check_and_close (void)
+check_and_close (int in_errno)
 {
   int err = 0;
 
@@ -994,7 +994,7 @@ check_and_close (void)
     {
       if (ferror (in_stream))
        {
-         error (0, errno, "%s", input_filename);
+         error (0, in_errno, _("%s: read error"), input_filename);
          if (in_stream != stdin)
            fclose (in_stream);
          err = 1;
@@ -1010,7 +1010,7 @@ check_and_close (void)
 
   if (ferror (stdout))
     {
-      error (0, errno, _("standard output"));
+      error (0, 0, _("write error"));
       err = 1;
     }
 
@@ -1063,6 +1063,7 @@ static int
 skip (uintmax_t n_skip)
 {
   int err = 0;
+  int in_errno = 0;
 
   if (n_skip == 0)
     return 0;
@@ -1097,7 +1098,7 @@ skip (uintmax_t n_skip)
                {
                  if (fseeko (in_stream, n_skip, SEEK_CUR) != 0)
                    {
-                     error (0, errno, "%s", input_filename);
+                     in_errno = errno;
                      err = 1;
                    }
                  n_skip = 0;
@@ -1119,7 +1120,12 @@ skip (uintmax_t n_skip)
                  n_bytes_read = fread (buf, 1, n_bytes_to_read, in_stream);
                  n_skip -= n_bytes_read;
                  if (n_bytes_read != n_bytes_to_read)
-                   break;
+                   {
+                     in_errno = errno;
+                     err = 1;
+                     n_skip = 0;
+                     break;
+                   }
                }
            }
 
@@ -1133,7 +1139,7 @@ skip (uintmax_t n_skip)
          err = 1;
        }
 
-      err |= check_and_close ();
+      err |= check_and_close (in_errno);
 
       err |= open_next_file ();
     }
@@ -1291,7 +1297,7 @@ read_char (int *c)
       if (*c != EOF)
        break;
 
-      err |= check_and_close ();
+      err |= check_and_close (errno);
 
       err |= open_next_file ();
     }
@@ -1338,7 +1344,7 @@ read_block (size_t n, char *block, size_t *n_bytes_in_buffer)
       if (n_read == n_needed)
        break;
 
-      err |= check_and_close ();
+      err |= check_and_close (errno);
 
       err |= open_next_file ();
     }
@@ -1419,8 +1425,8 @@ dump (void)
   int err;
   size_t n_bytes_read;
 
-  block[0] = (char *) alloca (bytes_per_block);
-  block[1] = (char *) alloca (bytes_per_block);
+  block[0] = alloca (bytes_per_block);
+  block[1] = alloca (bytes_per_block);
 
   current_offset = n_bytes_to_skip;
 
@@ -1483,7 +1489,7 @@ dump (void)
   format_address (current_offset, '\n');
 
   if (limit_bytes_to_format && current_offset >= end_offset)
-    err |= check_and_close ();
+    err |= check_and_close (0);
 
   return err;
 }
@@ -1603,7 +1609,7 @@ dump_strings (void)
 
   free (buf);
 
-  err |= check_and_close ();
+  err |= check_and_close (0);
   return err;
 }
 
@@ -1809,7 +1815,7 @@ it must be one character from [doxn]"),
 
        case_GETOPT_HELP_CHAR;
 
-       case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
+       case_GETOPT_VERSION_CHAR (PROGRAM_NAME, WRITTEN_BY);
 
        default:
          usage (EXIT_FAILURE);