diff options
author | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-01-16 18:48:20 +0000 |
---|---|---|
committer | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-01-16 18:48:20 +0000 |
commit | b4406583e6fe03f92fe2672a7d611359464f9c49 (patch) | |
tree | 7b1af6fe8d6a84e4bfb3ad5c2b99c4991e79113f /sprintf.c | |
parent | 0df980f610dcf6b72b3236a1eeb3b77c29978e1a (diff) |
* sprintf.c (rb_f_sprintf): Fix a bug caused by an uninitialized
variable v, that a bignum unexpectedly gets converted into a
string with its higher figures all filled with ./f/7/1,
depending on the base. This bug seems to have been introduced
in rev.1.27.
* sprintf.c (rb_f_sprintf): Use switch instead of a sequence of
else-if's.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3349 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'sprintf.c')
-rw-r--r-- | sprintf.c | 40 |
1 files changed, 29 insertions, 11 deletions
@@ -319,7 +319,7 @@ rb_f_sprintf(argc, argv) char *prefix = 0; int sign = 0; char sc = 0; - long v; + long v = 0; int base, bignum = 0; int len, pos; @@ -338,11 +338,18 @@ rb_f_sprintf(argc, argv) break; } if (flags & FSHARP) { - if (*p == 'o') prefix = "0"; - else if (*p == 'x') prefix = "0x"; - else if (*p == 'X') prefix = "0X"; - else if (*p == 'b') prefix = "0b"; - else if (*p == 'B') prefix = "0B"; + switch (*p) { + case 'o': + prefix = "0"; break; + case 'x': + prefix = "0x"; break; + case 'X': + prefix = "0X"; break; + case 'b': + prefix = "0b"; break; + case 'B': + prefix = "0B"; break; + } if (prefix) { width -= strlen(prefix); } @@ -369,10 +376,21 @@ rb_f_sprintf(argc, argv) goto bin_retry; } - if (*p == 'u' || *p == 'd' || *p == 'i') base = 10; - else if (*p == 'x' || *p == 'X') base = 16; - else if (*p == 'o') base = 8; - else if (*p == 'b' || *p == 'B') base = 2; + switch (*p) { + case 'o': + base = 8; break; + case 'x': + case 'X': + base = 16; break; + case 'b': + case 'B': + base = 2; break; + case 'u': + case 'd': + case 'i': + default: + base = 10; break; + } if (!bignum) { if (base == 2) { val = rb_int2big(v); @@ -510,7 +528,7 @@ rb_f_sprintf(argc, argv) PUSH(prefix, plen); } CHECK(prec - len); - if (v < 0) { + if (!bignum && v < 0) { char c = '.'; switch (base) { |