diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-31 22:38:53 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-31 22:38:53 +0000 |
commit | 478bd3128c96b5e26e81ea23de6aa1a33e449218 (patch) | |
tree | 96374bd9d16c79e6adcfdaa9ce58c07b4a00856d /bignum.c | |
parent | 39a00c67107a3ae41a49b8897fdaa51cbaede7fb (diff) | |
download | ruby-478bd3128c96b5e26e81ea23de6aa1a33e449218.tar.gz |
* bignum.c (big2str_orig): Use temporary buffer when trim mode.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42302 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'bignum.c')
-rw-r--r-- | bignum.c | 21 |
1 files changed, 16 insertions, 5 deletions
@@ -4224,13 +4224,23 @@ static size_t big2str_orig(struct big2str_struct *b2s, VALUE x, char* ptr, size_t len, int trim) { long i = RBIGNUM_LEN(x); - size_t j = len; + size_t j; int k; BDIGIT* ds = BDIGITS(x); BDIGIT_DBL num; + char buf[SIZEOF_BDIGIT_DBL*CHAR_BIT], *p; assert(i <= 2); + if (trim) { + p = buf; + j = sizeof(buf); + } + else { + p = ptr; + j = len; + } + num = 0; if (0 < i) num = ds[0]; @@ -4239,15 +4249,16 @@ big2str_orig(struct big2str_struct *b2s, VALUE x, char* ptr, size_t len, int tri k = b2s->hbase2_numdigits; while (k--) { - ptr[--j] = ruby_digitmap[num % b2s->base]; + p[--j] = ruby_digitmap[num % b2s->base]; num /= b2s->base; if (j <= 0) break; if (trim && num == 0) break; } if (trim) { - while (j < len && ptr[j] == '0') j++; - MEMMOVE(ptr, ptr + j, char, len - j); - len -= j; + while (j < sizeof(buf) && p[j] == '0') j++; + assert(sizeof(buf)-j <= len); + MEMCPY(ptr, p + j, char, sizeof(buf) - j); + len = sizeof(buf) - j; } return len; } |