e$B$J$+$@$G$9!#e(B
At Mon, 21 Jan 2008 02:50:50 +0900,
Tanaka A. wrote in [ruby-dev:33224]:
printf e$B$Ne(B %0x e$B$KIi$N@0?t$rM?$($k$H!"CM$K$h$C$Fe(B … e$B$,$D$$$?$je(B
e$B$D$+$J$+$C$?$j$7$^$9!#e(B
% ./ruby -ve ‘[-0x40000000, -0x40000001].each {|v| printf “%0x\n”, v }’
ruby 1.9.0 (2008-01-19 revision 0) [i686-linux]
…fc0000000
fbfffffff
e$B$=$l0J30$K$b!"@:EY$r;XDj$9$k$HL/$J46$8$G$9!#e(B
$ ruby19 -ve ‘printf “|%1$.4x|%1$04x|%1$6.4x|\n”, -1’
ruby 1.9.0 (2008-01-19 revision 15119) [i686-linux]
|f…f|f…f| f…f|
test/ruby/test_sprintf.rbe$B$K$Oe(B%be$B$N%F%9%H$7$+$J$$$N$G$9$,!“Ii$NCMe(B
e$B$Ge(B”…"e$B$,$D$+$J$$$H$$$&$N$O%F%9%H$N$[$&$,$*$+$7$/$J$$$G$7$g$&$+!#e(B
-
sprintf.c (remove_sign_bits): returns pointer to the first char to
be used, instead of copying.
-
sprintf.c (rb_str_format): negative indicator dots should come
before sign digits always. [ruby-dev:33224]
Index: sprintf.c
— sprintf.c (revision 15146)
+++ sprintf.c (working copy)
@@ -47,10 +47,6 @@ remove_sign_bits(char *str, int base)
}
}
-
if (t > s) {
-
while (*t) *s++ = *t++;
-
*s = ‘\0’;
-
}
-
return str;
@@ -509,8 +505,9 @@ rb_str_format(int argc, const VALUE *arg
case ‘u’:
{
- volatile VALUE tmp1;
volatile VALUE val = GETARG();
- char fbuf[32], nbuf[64], *s, *t;
- char fbuf[32], nbuf[64], *s;
const char *prefix = 0;
@@ -633,10 +630,8 @@ rb_str_format(int argc, const VALUE *arg
}
if (d && *s != d) {
@@ -667,24 +661,17 @@ rb_str_format(int argc, const VALUE *arg
s = RSTRING_PTR(tmp);
if (*s == ‘-’) {
-
remove_sign_bits(++s, base);
-
tmp = rb_str_new(0, 3+strlen(s));
-
t = RSTRING_PTR(tmp);
-
if (!(flags&(FPREC|FZERO))) {
-
strcpy(t, "..");
-
t += 2;
-
}
@@ -693,4 +680,8 @@ rb_str_format(int argc, const VALUE *arg
pos = -1;
len = strlen(s);
-
if (dots) {
-
prec -= 2;
-
width -= 2;
-
}
if (*p == ‘X’) {
@@ -722,4 +713,8 @@ rb_str_format(int argc, const VALUE *arg
}
CHECK(prec - len);
-
if (dots) {
-
memcpy(&buf[blen], "..", 2);
-
blen += 2;
-
}
if (!bignum && v < 0) {
char c = sign_bits(base, p);
Index: test/ruby/test_sprintf.rb
===================================================================
— test/ruby/test_sprintf.rb (revision 15146)
+++ test/ruby/test_sprintf.rb (working copy)
@@ -20,15 +20,15 @@ class TestSprintf < Test::Unit::TestCase
assert_equal(“0001”, sprintf("%04b", 1))
assert_equal(“0010”, sprintf("%04b", 2))
- assert_equal(“1111”, sprintf("%04b", -1))
-
assert_equal("…11", sprintf("%04b", -1))
assert_equal(“0000”, sprintf("%.4b", 0))
assert_equal(“0001”, sprintf("%.4b", 1))
assert_equal(“0010”, sprintf("%.4b", 2))
- assert_equal(“1111”, sprintf("%.4b", -1))
-
assert_equal("…11", sprintf("%.4b", -1))
assert_equal(" 0000", sprintf("%6.4b", 0))
assert_equal(" 0001", sprintf("%6.4b", 1))
assert_equal(" 0010", sprintf("%6.4b", 2))
- assert_equal(" 1111", sprintf("%6.4b", -1))
-
assert_equal(" …11", sprintf("%6.4b", -1))
assert_equal(" 0b0", sprintf("%#4b", 0))
@@ -40,15 +40,15 @@ class TestSprintf < Test::Unit::TestCase
assert_equal(“0b01”, sprintf("%#04b", 1))
assert_equal(“0b10”, sprintf("%#04b", 2))
- assert_equal(“0b11”, sprintf("%#04b", -1))
-
assert_equal(“0b…1”, sprintf("%#04b", -1))
assert_equal(“0b0000”, sprintf("%#.4b", 0))
assert_equal(“0b0001”, sprintf("%#.4b", 1))
assert_equal(“0b0010”, sprintf("%#.4b", 2))
- assert_equal(“0b1111”, sprintf("%#.4b", -1))
-
assert_equal(“0b…11”, sprintf("%#.4b", -1))
assert_equal(“0b0000”, sprintf("%#6.4b", 0))
assert_equal(“0b0001”, sprintf("%#6.4b", 1))
assert_equal(“0b0010”, sprintf("%#6.4b", 2))
- assert_equal(“0b1111”, sprintf("%#6.4b", -1))
-
assert_equal(“0b…11”, sprintf("%#6.4b", -1))
assert_equal("+0", sprintf("%+b", 0))