bug-textutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: od -t x8 broken on 64 bit platforms


From: Jim Meyering
Subject: Re: od -t x8 broken on 64 bit platforms
Date: Wed Sep 18 01:50:01 2002
User-agent: Gnus/5.090008 (Oort Gnus v0.08) Emacs/21.3.50 (i686-pc-linux-gnu)

Thanks a lot for the report and patch!
That is a problem even on 32-bit systems:
(note that your patch wouldn't help on 32-bit systems)

This demonstrates it:

  $ echo -n abcdefgh|od -An -t x8
   0000000064636261

Here's the fixed version:

  $ echo -n abcdefgh|./od -An -t x8
   6867666564636261

Arun Sharma <address@hidden> wrote:
> This bug report is against textutils-2.0.14 running on ia64.
>
> $ od -t x4 file | head
> 0000000 00000000 20000000 fef583a1 00100001
> 0000020 00004000 20000000 feef43a1 00100001
...
> $ od -t x8 file | head
> 0000000 0000000000000000 00000000fef583a1
> 0000020 0000000000004000 00000000feef43a1
...
>
> As you can see, the higher bits are gone from the dump.
>
> The following patch fixes the problem for me.
...

Here's the fix, relative to this package:

  ftp://alpha.gnu.org/gnu/fetish/coreutils-4.5.1.tar.gz

(just a reminder that the coreutils package is the new name
for the combination of the fileutils, textutils, and sh-utils)

Note that the patch below is incomplete in that it omits the autoconf
tests that would set PRI_MACROS_BROKEN on losing systems like AIX 4.3.3.
But it should work fine on other systems.

The complete patch will appear in coreutils-4.5.2.

Index: od.c
===================================================================
RCS file: /fetish/cu/src/od.c,v
retrieving revision 1.130
retrieving revision 1.131
diff -u -p -u -r1.130 -r1.131
--- od.c        2 Sep 2002 07:23:09 -0000       1.130
+++ od.c        17 Sep 2002 22:06:21 -0000      1.131
@@ -742,6 +742,11 @@ this system doesn't provide a %lu-byte i
          break;
        }
 
+#define ISPEC_TO_FORMAT(Spec, Min_format, Long_format, Max_format)     \
+  ((Spec) == LONG_LONG ? (Max_format)                                  \
+   : ((Spec) == LONG ? (Long_format)                                   \
+      : (Min_format)))                                                 \
+
 #define FMT_BYTES_ALLOCATED 9
       fmt_string = xmalloc (FMT_BYTES_ALLOCATED);
 
@@ -751,32 +756,30 @@ this system doesn't provide a %lu-byte i
        {
        case 'd':
          fmt = SIGNED_DECIMAL;
-         sprintf (fmt_string, " %%%u%sd",
+         sprintf (fmt_string, " %%%u%s",
                   (field_width = bytes_to_signed_dec_digits[size]),
-                  (size_spec == LONG ? "l"
-                   : (size_spec == LONG_LONG ? "ll"
-                      : "")));
+                  ISPEC_TO_FORMAT (size_spec, "d", "ld", PRIdMAX));
          break;
 
        case 'o':
          fmt = OCTAL;
-         sprintf (fmt_string, " %%0%u%so",
+         sprintf (fmt_string, " %%0%u%s",
                   (field_width = bytes_to_oct_digits[size]),
-                  (size_spec == LONG ? "l" : ""));
+                  ISPEC_TO_FORMAT (size_spec, "o", "lo", PRIoMAX));
          break;
 
        case 'u':
          fmt = UNSIGNED_DECIMAL;
-         sprintf (fmt_string, " %%%u%su",
+         sprintf (fmt_string, " %%%u%s",
                   (field_width = bytes_to_unsigned_dec_digits[size]),
-                  (size_spec == LONG ? "l" : ""));
+                  ISPEC_TO_FORMAT (size_spec, "u", "lu", PRIuMAX));
          break;
 
        case 'x':
          fmt = HEXADECIMAL;
-         sprintf (fmt_string, " %%0%u%sx",
+         sprintf (fmt_string, " %%0%u%s",
                   (field_width = bytes_to_hex_digits[size]),
-                  (size_spec == LONG ? "l" : ""));
+                  ISPEC_TO_FORMAT (size_spec, "x", "lx", PRIxMAX));
          break;
 
        default:
@@ -1646,6 +1649,8 @@ main (int argc, char **argv)
   integral_type_size[sizeof (int)] = INT;
   integral_type_size[sizeof (long int)] = LONG;
 #if HAVE_UNSIGNED_LONG_LONG
+  /* If `long' and `long long' have the same size, it's fine
+     to overwrite the entry for `long' with this one.  */
   integral_type_size[sizeof (ulonglong_t)] = LONG_LONG;
 #endif
 
Index: sys2.h
===================================================================
RCS file: /fetish/cu/src/sys2.h,v
retrieving revision 1.69
retrieving revision 1.70
diff -u -p -u -r1.69 -r1.70
--- sys2.h      15 Jun 2002 06:53:57 -0000      1.69
+++ sys2.h      17 Sep 2002 14:41:43 -0000      1.70
@@ -264,6 +264,23 @@ char *alloca ();
 # include <inttypes.h> /* for the definition of UINTMAX_MAX */
 #endif
 
+#if !defined PRIdMAX || PRI_MACROS_BROKEN
+# undef PRIdMAX
+# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld")
+#endif
+#if !defined PRIoMAX || PRI_MACROS_BROKEN
+# undef PRIoMAX
+# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo")
+#endif
+#if !defined PRIuMAX || PRI_MACROS_BROKEN
+# undef PRIuMAX
+# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu")
+#endif
+#if !defined PRIxMAX || PRI_MACROS_BROKEN
+# undef PRIxMAX
+# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx")
+#endif
+
 #include <ctype.h>
 
 /* Jim Meyering writes:




reply via email to

[Prev in Thread] Current Thread [Next in Thread]