<<< Date Index >>>     <<< Thread Index >>>

Re: Compatibility problem when calling mutt_pretty_size



Ping?


Corinna

On Oct  8 21:06, Corinna Vinschen wrote:
> Hi,
> 
> The third parameter to function mutt_pretty_size, defined as long, gets
> a size argument.  From browser.c, function folder_format_str,
> mutt_pretty_size is called with the st_size member of struct stat.  Per
> POSIX, the st_size member is defined as off_t, and using long for file
> sizes is not portable.  On some systems, off_t is defined as a 64 bit
> type, while long is 32 bit.  This is the case for instance on Cygwin.
> Or, on 32 bit Linux with -D_FILE_OFFSET_BITS=64.
> 
> Wouldn't it be better to change the third parameter to mutt_pretty_size
> as an intmax_t and use the 'j' format specifier in calls to printf?  Ok,
> I admit that mailbox sizes of more than 2 Gigs are rather seldom...
> 
> If you don't want to rely on intmax_t and the 'j' specifier being
> available, there would also be the alternative to define the third
> parameter as long long and use the lld format specifier.
> 
> The below patch, implementing the intmax_t approach, is against the
> latest snapshot (20071008).
> 
> ChangeLog:
> 
>       * muttlib.c: Change third parameter of mutt_pretty_size to intmax_t.
>       * protos.h: Change prototype accordingly.
> 
> --- muttlib.c.ORIG      2007-10-08 12:50:41.000000000 +0200
> +++ muttlib.c   2007-10-08 12:51:28.000000000 +0200
> @@ -812,7 +812,7 @@ void mutt_pretty_mailbox (char *s)
>    }
>  }
>  
> -void mutt_pretty_size (char *s, size_t len, long n)
> +void mutt_pretty_size (char *s, size_t len, intmax_t n)
>  {
>    if (n == 0)
>      strfcpy (s, "0K", len);
> @@ -821,14 +821,14 @@ void mutt_pretty_size (char *s, size_t l
>    else if (n < 1023949) /* 10K - 999K */
>    {
>      /* 51 is magic which causes 10189/10240 to be rounded up to 10 */
> -    snprintf (s, len, "%ldK", (n + 51) / 1024);
> +    snprintf (s, len, "%ljK", (n + 51) / 1024);
>    }
>    else if (n < 10433332) /* 1.0M - 9.9M */
>      snprintf (s, len, "%3.1fM", n / 1048576.0);
>    else /* 10M+ */
>    {
>      /* (10433332 + 52428) / 1048576 = 10 */
> -    snprintf (s, len, "%ldM", (n + 52428) / 1048576);
> +    snprintf (s, len, "%ljM", (n + 52428) / 1048576);
>    }
>  }
>  
> --- protos.h.ORIG       2007-10-08 12:50:46.000000000 +0200
> +++ protos.h    2007-10-08 12:51:38.000000000 +0200
> @@ -229,7 +229,7 @@ void mutt_perror (const char *);
>  void mutt_prepare_envelope (ENVELOPE *, int);
>  void mutt_unprepare_envelope (ENVELOPE *);
>  void mutt_pretty_mailbox (char *);
> -void mutt_pretty_size (char *, size_t, long);
> +void mutt_pretty_size (char *, size_t, intmax_t);
>  void mutt_pipe_message (HEADER *);
>  void mutt_print_message (HEADER *);
>  void mutt_print_patchlist (void);