On 4/12/12 12:25 PM, Petr Sumbera wrote:
> Hi,
> 
> we are running Bash 3.2.38 on Solaris 10 where asprintf() isn't available.
> Thus code in snprintf.c is used.
> 
> There is a problem with following command:
> 
> bash -c 'printf "x%10.0fx\n" 123'
> x0000000123x
> 
> Where correct output should be:
> x       123x
> 
> It seems that '0' after '.' enables zero padding. Please see proposed patch
> bellow:
> 
> --- bash-3.2.48/lib/sh/snprintf.c       Tue Dec 12 12:10:18 2006
> +++ bash-3.2.48/lib/sh/snprintf.c       Thu Apr 12 08:55:44 2012
> @@ -1277,6 +1277,8 @@
>                 data->flags |= PF_ALTFORM;
>                 continue;
>               case '0':
> +               if (data->flags & PF_DOT)
> +                 continue;
>                 data->flags |= PF_ZEROPAD;
>                 data->pad = '0';
>                 continue;
> 
> The same code seems to be also in Bash 4.1 so I guess the problem is still
> there.
> 
> Any comments?

Thanks for the report.  Try this slightly improved patch; yours (and the
original code) doesn't treat a precision specifier beginning with a `0'
correctly.  (And the test has to use `printf -v' to exercise the right
code in bash-4.0 and later.)

Chet

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
                 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRU    c...@case.edu    http://cnswww.cns.cwru.edu/~chet/
*** ../bash-4.2-patched/lib/sh/snprintf.c	2010-05-30 18:34:52.000000000 -0400
--- lib/sh/snprintf.c	2012-04-12 20:12:56.000000000 -0400
***************
*** 1296,1303 ****
  		data->flags |= PF_ALTFORM;
  		continue;
- 	      case '0':
- 		data->flags |= PF_ZEROPAD;
- 		data->pad = '0';
- 		continue;
  	      case '*':
  		if (data->flags & PF_DOT)
--- 1289,1292 ----
***************
*** 1330,1333 ****
--- 1319,1329 ----
  		continue;
  
+ 	      case '0':
+ 	        if ((data->flags & PF_DOT) == 0)
+ 		  {
+ 		    data->flags |= PF_ZEROPAD;
+ 		    data->pad = '0';
+ 		    continue;
+ 		  }
  	      case '1': case '2': case '3':
  	      case '4': case '5': case '6':

Reply via email to