bug-coreutils
[Top][All Lists]
Advanced

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

Re: coreutils-5.90 released


From: Jim Meyering
Subject: Re: coreutils-5.90 released
Date: Fri, 30 Sep 2005 18:28:25 +0200

Paul Eggert <address@hidden> wrote:
> address@hidden (Eric Blake) writes:
>
>> dd.c:1661: warning: long unsigned int format, size_t arg (arg 5)
>
> Thanks; I installed this patch.
>
> Jim -- I'm not sure what version number you want at the top of
> ChangeLog so I left it out for now.

I've taken care of that. 5.91-cvs.

> 2005-09-29  Paul Eggert  <address@hidden>
>
>       * src/dd.c (main): Don't assume size_t has the same width
>       as unsigned long.  Problem reported by Eric Blake.
>
> --- src/dd.c  16 Sep 2005 09:35:47 -0000      1.187
> +++ src/dd.c  30 Sep 2005 05:07:11 -0000      1.188
> @@ -1652,13 +1652,14 @@ main (int argc, char **argv)
>        if (seek_records != 0 && !(conversions_mask & C_NOTRUNC))
>       {
>         uintmax_t size = seek_records * output_blocksize;
> +       unsigned long int obs = output_blocksize;
>  
>         if (OFF_T_MAX / output_blocksize < seek_records)
>           error (EXIT_FAILURE, 0,
>                  _("offset too large: "
>                    "cannot truncate to a length of seek=%"PRIuMAX""
>                    " (%lu-byte) blocks"),
> -                seek_records, output_blocksize);
> +                seek_records, obs);
>  
>         if (ftruncate (STDOUT_FILENO, size) != 0)
>           {

I think it's about time we started using a format string for size_t values,
rather than trying to shoe-horn them into some other format.
How about something like this:

Index: dd.c
===================================================================
RCS file: /fetish/cu/src/dd.c,v
retrieving revision 1.188
diff -u -p -r1.188 dd.c
--- dd.c        30 Sep 2005 05:07:11 -0000      1.188
+++ dd.c        30 Sep 2005 07:39:33 -0000
@@ -1652,14 +1652,13 @@ main (int argc, char **argv)
       if (seek_records != 0 && !(conversions_mask & C_NOTRUNC))
        {
          uintmax_t size = seek_records * output_blocksize;
-         unsigned long int obs = output_blocksize;
 
          if (OFF_T_MAX / output_blocksize < seek_records)
            error (EXIT_FAILURE, 0,
                   _("offset too large: "
                     "cannot truncate to a length of seek=%"PRIuMAX""
-                    " (%lu-byte) blocks"),
-                  seek_records, obs);
+                    " (%"PRI_z"-byte) blocks"),
+                  seek_records, output_blocksize);
 
          if (ftruncate (STDOUT_FILENO, size) != 0)
            {

Then we need to define PRI_z.
Probably need an autoconf test, but this might just do, assuming
the needed symbols are always defined.

I deliberately omitted unsigned long long, on the presumption
that that type has the same size as either unsigned long or uintmax_t,
and because it's a little trickier.  Does anyone know of a system
where that's not true?


Index: system.h
===================================================================
RCS file: /fetish/cu/src/system.h,v
retrieving revision 1.137
diff -u -p -r1.137 system.h
--- system.h    28 Sep 2005 22:11:06 -0000      1.137
+++ system.h    30 Sep 2005 15:28:31 -0000
@@ -57,6 +57,17 @@ you must include <sys/types.h> before in
 #include "pathmax.h"
 #include "localedir.h"
 
+/* Determine a printf conversion specifier that is appropriate for size_t.
+   Ideally, we'd just use the c99-specified `z' length modifier, defining
+   PRI_z to "zu", but that's not portable.  */
+#if SIZE_MAX == UINT_MAX
+# define PRI_z "u"
+#elif SIZE_MAX == ULONG_MAX
+# define PRI_z "lu"
+#else
+# define PRI_z PRIuMAX
+#endif
+
 #if TIME_WITH_SYS_TIME
 # include <sys/time.h>
 # include <time.h>




reply via email to

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