(print_long_format): If a file size is negative, assume
authorJim Meyering <jim@meyering.net>
Fri, 10 Aug 2001 07:51:52 +0000 (07:51 +0000)
committerJim Meyering <jim@meyering.net>
Fri, 10 Aug 2001 07:51:52 +0000 (07:51 +0000)
the typical case where it has wrapped around from a positive value.

src/ls.c

index 6c2cefa..dbbac57 100644 (file)
--- a/src/ls.c
+++ b/src/ls.c
@@ -2637,8 +2637,17 @@ print_long_format (const struct fileinfo *f)
   else
     {
       char hbuf[LONGEST_HUMAN_READABLE + 1];
+      uintmax_t size = f->stat.st_size;
+
+      /* POSIX requires that the size be printed without a sign, even
+        when negative.  Assume the typical case where negative sizes
+        are actually positive values that have wrapped around.  */
+      if (sizeof f->stat.st_size < sizeof size)
+       size += ((uintmax_t) (f->stat.st_size < 0)
+                << (sizeof f->stat.st_size * CHAR_BIT));
+
       sprintf (p, "%8s ",
-              human_readable ((uintmax_t) f->stat.st_size, hbuf, 1,
+              human_readable (size, hbuf, 1,
                               output_block_size < 0 ? output_block_size : 1));
     }