Subject: bug#7325: new test failure due to non-portability of printf formats like %05.3s

From: Eric Blake <[email-masked]>
Date: Wed, 03 Nov 2010 15:32:55 -0600

On 11/03/2010 03:26 PM, Jim Meyering wrote:
>> I agree that %05.3:X resulting in 00023 would be ideal.  And I agree
>> that we'd have to trim off the 0 modifier before calling the underlying
>> printf %s, and thus be responsible for putting in '0' padding ourselves
>> rather than relying on printf() padding.
> 
> Thanks for confirming.
> Here's the patch I'm considering:
> 
> diff --git a/src/stat.c b/src/stat.c
> index d05a93b..993db48 100644
> --- a/src/stat.c
> +++ b/src/stat.c
> @@ -472,6 +472,23 @@ epoch_sec (struct timespec t)
>    return timetostr (t.tv_sec, str);
>  }
> 
> +/* Convert a LEN-byte FORMAT modifier, e.g., "0009.4", to "9.4".
> +   Do it in place and return the new length.  */
> +static size_t
> +sanitize_format_string (char *format, size_t len)
> +{
> +  char *p = format;
> +  char const *end = format + len;
> +  while (p < end && *p == '0')
> +    p++;
> +  if (p == format)
> +    return len;
> +
> +  len -= p - format;
> +  memmove (format, p, len);
> +  return len;
> +}

Not just leading zeros.  Think also about "%-0 010.4:X", which must
sanitize to "%- 10.4s" - that is, you must strip any zero until the
first non-zero digit or '.' is found.

-- 
Eric Blake   [email-masked]    +1-801-349-2682
Libvirt virtualization library http://libvirt.org