All,
I discovered a bug in sprintf.c. When a width is specified for one of
the ‘d’ field types and a positive Bignum is supplied for the argument,
the string is padded by one too few characters:
%ruby -ve 'puts “(%12d)\n(%12d)\n(%12s)” %
[9876543210,-9876543210,9876543210]'
ruby 1.6.8 (2002-12-24) [i386-freebsd4.7]
( 9876543210)
( -9876543210)
( 9876543210)
This is caused by the Bignum code decrementing the width even if there
is no sign character. The patch to fix this is:
— sprintf.c.original Thu Dec 12 03:16:44 2002
+++ sprintf.c Fri Apr 4 11:23:05 2003
@@ -436,14 +436,16 @@
if (s[0] == ‘-’) {
s++;
sc = ‘-’;
-
width--; } else if (flags & FPLUS) { sc = '+';
-
width--; } else if (flags & FSPACE) { sc = ' ';
-
width--; }
-
width--; goto format_integer; } if (!RBIGNUM(val)->sign) {
This does not appear to be fixed in the latest snapshot:
%ruby -ve 'puts “(%12d)\n(%12d)\n(%12s)” %
[9876543210,-9876543210,9876543210]'
ruby 1.8.0 (2003-04-03) [i386-freebsd4.7]
( 9876543210)
( -9876543210)
( 9876543210)
- Warren Brown