summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-07-05 18:13:37 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-07-05 18:13:37 +0900
commitb68e7a605ce09e72fe0e0734da1200c2d97ffe93 (patch)
tree36f7426f7c0217060ee811ce076f7abdf39439ec /mrbgems
parentb643a1a8bc89b7898d05dc2e26d87f708a5edc32 (diff)
downloadmruby-b68e7a605ce09e72fe0e0734da1200c2d97ffe93.tar.gz
mruby-b68e7a605ce09e72fe0e0734da1200c2d97ffe93.zip
Negation was not a good way to handle negative integers; fix #3729
There's a number that negation does not work (-2147483648 in 32bit environment).
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-sprintf/src/sprintf.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c
index d62a28e8c..e02627b86 100644
--- a/mrbgems/mruby-sprintf/src/sprintf.c
+++ b/mrbgems/mruby-sprintf/src/sprintf.c
@@ -860,11 +860,11 @@ retry:
else {
sc = '-';
width--;
- v = -v;
}
mrb_assert(base == 10);
snprintf(nbuf, sizeof(nbuf), "%" MRB_PRId, v);
s = nbuf;
+ if (v < 0) s++; /* skip minus sign */
}
else {
s = nbuf;
@@ -974,13 +974,12 @@ retry:
if (prec > len) {
CHECK(prec - len);
- if (v < 0) {
- char c = sign_bits(base, p);
- FILL(c, prec - len);
- }
- else if ((flags & (FMINUS|FPREC)) != FMINUS) {
+ if ((flags & (FMINUS|FPREC)) != FMINUS) {
char c = '0';
FILL(c, prec - len);
+ } else if (v < 0) {
+ char c = sign_bits(base, p);
+ FILL(c, prec - len);
}
}
PUSH(s, len);