summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-11-27 17:42:12 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-11-27 17:42:12 +0000
commit6eea7a7c718acdeb2c800d52c5e738ef22d4c467 (patch)
tree5f5e5eb95e169f5831e7fe2cdec9ed9aa5334cd7
parent0cdd3bced5e42557ed4ee3c7f3cd35f7f56cbcf0 (diff)
* bignum.c (big2str_find_n1): removed extraneous element.
[ruby-dev:32351], [ruby-dev:32365] * bignum.c (big2str_find_n1): returns necessary digits now. * sprintf.c (remove_sign_bits): extends sign bit first. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14034 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog14
-rw-r--r--bignum.c41
-rw-r--r--sprintf.c8
3 files changed, 35 insertions, 28 deletions
diff --git a/ChangeLog b/ChangeLog
index bd360cfea5..c295a19c64 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Wed Nov 28 02:42:10 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * bignum.c (big2str_find_n1): removed extraneous element.
+ [ruby-dev:32351], [ruby-dev:32365]
+
+ * bignum.c (big2str_find_n1): returns necessary digits now.
+
+ * sprintf.c (remove_sign_bits): extends sign bit first.
+
Tue Nov 27 15:53:43 2007 Koichi Sasada <ko1@atdot.net>
* compile.c (iseq_compile_each): "when *[],1" dumps core.
@@ -61,11 +70,6 @@ Mon Nov 26 23:18:46 2007 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
* test/drb/test_drb.rb (TestDRbEval): ignored.
-Mon Nov 26 18:38:00 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
-
- * sprintf.c (rb_str_format): always trim preceding zeros.
- [ruby-dev:32351]
-
Mon Nov 26 17:32:16 2007 Tanaka Akira <akr@fsij.org>
* re.c (Init_Regexp): new method Regexp#fixed_encoding?
diff --git a/bignum.c b/bignum.c
index 71e0fb8da7..dd6d7b134c 100644
--- a/bignum.c
+++ b/bignum.c
@@ -786,18 +786,18 @@ static long
big2str_find_n1(VALUE x, int base)
{
static const double log_2[] = {
- 1.0, 1.58496250072116, 2.0,
- 2.32192809488736, 2.584962500721, 2.58496250072116,
- 2.8073549220576, 3.0, 3.16992500144231,
- 3.32192809488736, 3.4594316186373, 3.58496250072116,
- 3.70043971814109, 3.8073549220576, 3.90689059560852,
- 4.0, 4.08746284125034, 4.16992500144231,
- 4.24792751344359, 4.32192809488736, 4.39231742277876,
- 4.4594316186373, 4.52356195605701, 4.58496250072116,
- 4.64385618977472, 4.70043971814109, 4.75488750216347,
- 4.8073549220576, 4.85798099512757, 4.90689059560852,
- 4.95419631038688, 5.0, 5.04439411935845,
- 5.08746284125034, 5.12928301694497, 5.16992500144231
+ 1.0, 1.58496250072116, 2.0,
+ 2.32192809488736, 2.58496250072116, 2.8073549220576,
+ 3.0, 3.16992500144231, 3.32192809488736,
+ 3.4594316186373, 3.58496250072116, 3.70043971814109,
+ 3.8073549220576, 3.90689059560852, 4.0,
+ 4.08746284125034, 4.16992500144231, 4.24792751344359,
+ 4.32192809488736, 4.39231742277876, 4.4594316186373,
+ 4.52356195605701, 4.58496250072116, 4.64385618977472,
+ 4.70043971814109, 4.75488750216347, 4.8073549220576,
+ 4.85798099512757, 4.90689059560852, 4.95419631038688,
+ 5.0, 5.04439411935845, 5.08746284125034,
+ 5.12928301694497, 5.16992500144231
};
long bits;
@@ -814,7 +814,7 @@ big2str_find_n1(VALUE x, int base)
bits = BITSPERDIG*RBIGNUM_LEN(x);
}
- return (long)ceil(bits/(2*log_2[base - 2]));
+ return (long)ceil(bits/log_2[base - 2]);
}
static long
@@ -898,7 +898,7 @@ rb_big2str0(VALUE x, int base, int trim)
{
int off;
VALUE ss, xx;
- long n1, len, hbase;
+ long n1, n2, len, hbase;
char* ptr;
if (FIXNUM_P(x)) {
@@ -911,8 +911,9 @@ rb_big2str0(VALUE x, int base, int trim)
if (base < 2 && 36 < base)
rb_raise(rb_eArgError, "illegal radix %d", base);
- n1 = big2str_find_n1(x, base);
- ss = rb_str_new(0, 2*n1 + 1); /* plus one for sign */
+ n2 = big2str_find_n1(x, base);
+ n1 = (n2 + 1) / 2;
+ ss = rb_str_new(0, n2 + 1); /* plus one for sign */
ptr = RSTRING_PTR(ss);
ptr[0] = RBIGNUM_SIGN(x) ? '+' : '-';
@@ -924,11 +925,11 @@ rb_big2str0(VALUE x, int base, int trim)
xx = rb_big_clone(x);
RBIGNUM_SET_SIGN(xx, 1);
if (n1 <= KARATSUBA_DIGITS) {
- len = off + big2str_orig(xx, base, ptr + off, 2*n1, hbase, trim);
+ len = off + big2str_orig(xx, base, ptr + off, n2, hbase, trim);
}
else {
len = off + big2str_karatsuba(xx, base, ptr + off, n1,
- 2*n1, hbase, trim);
+ n2, hbase, trim);
}
ptr[len] = '\0';
@@ -2442,7 +2443,7 @@ static VALUE
rb_big_odd_p(VALUE num)
{
if (BDIGITS(num)[0] & 1) {
- return Qtrue;
+ return Qtrue;
}
return Qfalse;
}
@@ -2458,7 +2459,7 @@ static VALUE
rb_big_even_p(VALUE num)
{
if (BDIGITS(num)[0] & 1) {
- return Qfalse;
+ return Qfalse;
}
return Qtrue;
}
diff --git a/sprintf.c b/sprintf.c
index 62731a5f26..ed02e01aeb 100644
--- a/sprintf.c
+++ b/sprintf.c
@@ -19,6 +19,8 @@
#include <stdarg.h>
#define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */
+#define BITSPERDIG (SIZEOF_BDIGITS*CHAR_BIT)
+#define EXTENDSIGN(n, l) (((~0 << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0 << (n)))
static void fmt_setup(char*,int,int,int,int);
@@ -35,7 +37,7 @@ remove_sign_bits(char *str, int base)
}
}
else if (base == 8) {
- if (*t == '3') t++;
+ *t |= EXTENDSIGN(3, strlen(t));
while (*t == '7') {
t++;
}
@@ -662,7 +664,7 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
val = rb_big_clone(val);
rb_big_2comp(val);
}
- tmp1 = tmp = rb_big2str0(val, base, Qtrue);
+ tmp1 = tmp = rb_big2str0(val, base, RBIGNUM_SIGN(val));
s = RSTRING_PTR(tmp);
if (*s == '-') {
if (base == 10) {
@@ -695,7 +697,7 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
if (*p == 'X') {
char *pp = s;
int c;
- while (c = (int)*pp) {
+ while ((c = (int)(unsigned char)*pp) != 0) {
*pp = rb_enc_toupper(c, enc);
pp++;
}