sprintf bug in 1.9.0?

M

Mark Hubbart

I just compiled the latest release of Ruby 1.9.0, and I'm getting
unexpected behavior from it...

mark@imac% /usr/local/bin/ruby -e'puts sprintf("%08b",0),RUBY_VERSION'
11111110
1.9.0
mark@imac% /usr/bin/ruby -e'puts sprintf("%08b",0),RUBY_VERSION'
00000000
1.6.8

it looks like sprintf, when you ask it to pad binary values with zeros,
is instead padding with ones! It doesn't seem t have a problem with
hex, just binary.

-Mark
 
N

nobu.nokada

Hi,

At Mon, 16 Feb 2004 19:49:36 +0900,
Mark Hubbart wrote in [ruby-talk:92961]:
I just compiled the latest release of Ruby 1.9.0, and I'm getting
unexpected behavior from it...

mark@imac% /usr/local/bin/ruby -e'puts sprintf("%08b",0),RUBY_VERSION'
11111110
1.9.0
mark@imac% /usr/bin/ruby -e'puts sprintf("%08b",0),RUBY_VERSION'
00000000
1.6.8

What's your platform?

$ ruby -v -e'puts sprintf("%08b",0),RUBY_VERSION'
ruby 1.9.0 (2004-02-15) [i686-linux]
00000000
1.9.0
 
T

ts

n> $ ruby -v -e'puts sprintf("%08b",0),RUBY_VERSION'

moulon% ruby -ve 'puts sprintf("%08b",0),RUBY_VERSION'
ruby 1.8.1 (2003-12-25) [sparc-solaris2.7]
11111110
1.8.1
moulon%


Guy Decoux
 
M

Mark Hubbart

What's your platform?

Guess I should have mentioned that :) Again, but with full
version/release/platform tag:

mark@imac% /usr/bin/ruby -ve 'puts sprintf("%08b",0)'
ruby 1.6.8 (2002-12-24) [powerpc-darwin7.0]
00000000
mark@imac% /usr/local/bin/ruby -ve 'puts sprintf("%08b",0)'
ruby 1.9.0 (2004-02-14) [powerpc-darwin]
11111110
 
M

Mark Hubbart

n> $ ruby -v -e'puts sprintf("%08b",0),RUBY_VERSION'

moulon% ruby -ve 'puts sprintf("%08b",0),RUBY_VERSION'
ruby 1.8.1 (2003-12-25) [sparc-solaris2.7]
11111110
1.8.1
moulon%


Guy Decoux
Hmmmm... I hadn't thought to check 1.8, but I had it hanging around,
too, so:
mark@imac% /usr/local-old/bin/ruby -ve 'puts sprintf("%08b",0)'
ruby 1.8.0 (2003-08-04) [powerpc-darwin]
11111110

there we are! I hadn't noticed that bug before, but then I guess I
don't convert to binary strings very often...
 
T

ts

t> moulon% ruby -ve 'puts sprintf("%08b",0),RUBY_VERSION'
t> ruby 1.8.1 (2003-12-25) [sparc-solaris2.7]

Not really sure (the problem is on line 566 in sprintf.c)

if (bignum && !RBIGNUM(val)->sign)
c = sign_bits(base, p);


moulon% diff -u sprintf.c~ sprintf.c
--- sprintf.c~ Thu Jul 3 13:00:18 2003
+++ sprintf.c Mon Feb 16 13:40:08 2004
@@ -345,6 +345,7 @@
long v = 0;
int base, bignum = 0;
int len, pos;
+ VALUE tmp;

switch (*p) {
case 'd':
@@ -472,8 +473,8 @@
}

if (sign) {
- val = rb_big2str(val, base);
- s = RSTRING(val)->ptr;
+ tmp = rb_big2str(val, base);
+ s = RSTRING(tmp)->ptr;
if (s[0] == '-') {
s++;
sc = '-';
@@ -493,8 +494,8 @@
val = rb_big_clone(val);
rb_big_2comp(val);
}
- val = rb_big2str(val, base);
- s = RSTRING(val)->ptr;
+ tmp = rb_big2str(val, base);
+ s = RSTRING(tmp)->ptr;
if (*s == '-') {
if (base == 10) {
rb_warning("negative number for %%u specifier");
@@ -502,8 +503,8 @@
}
else {
remove_sign_bits(++s, base);
- val = rb_str_new(0, 3+strlen(s));
- t = RSTRING(val)->ptr;
+ tmp = rb_str_new(0, 3+strlen(s));
+ t = RSTRING(tmp)->ptr;
if (!(flags&FPREC)) {
strcpy(t, "..");
t += 2;
@@ -520,7 +521,7 @@
bignum = 2;
}
}
- s = RSTRING(val)->ptr;
+ s = RSTRING(tmp)->ptr;

format_integer:
pos = -1;
moulon%


Guy Decoux
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,999
Messages
2,570,244
Members
46,838
Latest member
KandiceChi

Latest Threads

Top