--- bash-3.2.48/lib/sh/snprintf.c.orig Tue Dec 12 12:10:18 2006 +++ bash-3.2.48/lib/sh/snprintf.c Fri Apr 13 05:30:04 2012 @@ -352,7 +352,7 @@ while (0) #define PUT_PLUS(d, p, zero) \ - if ((d) > zero && (p)->justify == RIGHT) \ + if (((p)->flags & PF_PLUS) && (d) > zero) \ PUT_CHAR('+', p) #define PUT_SPACE(d, p, zero) \ @@ -907,7 +907,7 @@ double d; { #ifdef DBL_MAX - if (d < DBL_MIN) + if (d < -DBL_MAX) return -1; else if (d > DBL_MAX) return 1; @@ -994,8 +994,10 @@ ((p->flags & PF_SPACE) ? 1:0) - strlen(tmp) - p->precision - ((p->precision != 0 || (p->flags & PF_ALTFORM)) ? 1 : 0); /* radix char */ - PAD_RIGHT(p); + if (*tmp == '-') + PUT_CHAR(*tmp++, p); PUT_PLUS(d, p, 0.); + PAD_RIGHT(p); PUT_SPACE(d, p, 0.); while (*tmp) @@ -1276,10 +1278,6 @@ case '#': data->flags |= PF_ALTFORM; continue; - case '0': - data->flags |= PF_ZEROPAD; - data->pad = '0'; - continue; case '*': if (data->flags & PF_DOT) data->flags |= PF_STAR_P; @@ -1303,7 +1301,8 @@ if ((data->flags & PF_DOT) == 0) { data->flags |= PF_PLUS; - data->justify = RIGHT; + if ((data->flags & PF_LADJUST) == 0) + data->justify = RIGHT; } continue; case '\'': @@ -1310,6 +1309,13 @@ data->flags |= PF_THOUSANDS; continue; + case '0': + if ((data->flags & (PF_DOT|PF_LADJUST)) == 0) + { + data->flags |= PF_ZEROPAD; + data->pad = '0'; + continue; + } case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':