bug-textutils
[Top][All Lists]
Advanced

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

Re: textutils -> od 2.0.14 bug - solved


From: Jim Meyering
Subject: Re: textutils -> od 2.0.14 bug - solved
Date: Tue, 14 May 2002 23:33:40 +0200
User-agent: Gnus/5.090006 (Oort Gnus v0.06) Emacs/21.2.50 (i686-pc-linux-gnu)

Tony Kocurko <address@hidden> wrote:

> Hi,
>
>   I believe that lines 137 and 138 of od.c ought to be changed
> from this:
>
>   sizeof (long int),
>   sizeof (float),
>
> to this:
>
>   sizeof (long int),
>   sizeof (long long),
>   sizeof (float),
>
>   Without that change on our RedHat Linux 7.2 Intel systems, the
> "od -t f8" command complains about an incorrect size and
> substitutes a size of 12 for a double, rather than using the 8
> that it should.

Thanks a lot for the reports and patch.
Here's how I've fixed it:

        This bug was introduced with my change of 2000-10-22 (textutils-2.0.8).
        * src/od.c (ulonglong_t): Move declaration to precede new use.
        [enum size_spec] (N_SIZE_SPECS): New member.
        (width_bytes): Add initializer corresponding to ulonglong_t type.
        (struct assert_width_bytes_matches_size_spec_decl): Declare.
        Based on a patch from Tony Kocurko.

Index: od.c
===================================================================
RCS file: /fetish/textutils/src/od.c,v
retrieving revision 1.125
retrieving revision 1.126
diff -u -p -u -r1.125 -r1.126
--- od.c        16 Feb 2002 07:37:15 -0000      1.125
+++ od.c        14 May 2002 21:31:42 -0000      1.126
@@ -66,6 +66,14 @@ typedef double LONG_DOUBLE;
 # define LDBL_DIG DBL_DIG
 #endif

+#if HAVE_UNSIGNED_LONG_LONG
+typedef unsigned long long ulonglong_t;
+#else
+/* This is just a place-holder to avoid a few `#if' directives.
+   In this case, the type isn't actually used.  */
+typedef unsigned long int ulonglong_t;
+#endif
+
 enum size_spec
   {
     NO_SIZE,
@@ -77,7 +85,8 @@ enum size_spec
     /* FIXME: add INTMAX support, too */
     FLOAT_SINGLE,
     FLOAT_DOUBLE,
-    FLOAT_LONG_DOUBLE
+    FLOAT_LONG_DOUBLE,
+    N_SIZE_SPECS
   };

 enum output_format
@@ -136,11 +145,20 @@ static const int width_bytes[] =
   sizeof (short int),
   sizeof (int),
   sizeof (long int),
+  sizeof (ulonglong_t),
   sizeof (float),
   sizeof (double),
   sizeof (LONG_DOUBLE)
 };

+/* Ensure that for each member of `enum size_spec' there is an
+   initializer in the width_bytes array.  */
+struct assert_width_bytes_matches_size_spec_decl
+{
+  int t1[sizeof width_bytes / sizeof width_bytes[0] - N_SIZE_SPECS];
+  int t2[N_SIZE_SPECS - sizeof width_bytes / sizeof width_bytes[0]];
+};
+
 /* Names for some non-printing characters.  */
 static const char *const charname[33] =
 {
@@ -230,14 +248,6 @@ static FILE *in_stream;

 /* If nonzero, at least one of the files we read was standard input.  */
 static int have_read_stdin;
-
-#if HAVE_UNSIGNED_LONG_LONG
-typedef unsigned long long ulonglong_t;
-#else
-/* This is just a place-holder to avoid a few `#if' directives.
-   In this case, the type isn't actually used.  */
-typedef unsigned long int ulonglong_t;
-#endif

 #define MAX_INTEGRAL_TYPE_SIZE sizeof (ulonglong_t)
 static enum size_spec integral_type_size[MAX_INTEGRAL_TYPE_SIZE + 1];



reply via email to

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