summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-sprintf/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-04-24 09:06:57 +0900
committerGitHub <[email protected]>2017-04-24 09:06:57 +0900
commit6088276cc833c104d0228f5c03140601c7fc06df (patch)
tree266d68cf1185668d7a5f553c73c43fc219d99ae7 /mrbgems/mruby-sprintf/src
parent72bdb6a93f5f80c0b84f8db21464afcf74103ada (diff)
parentcd4e9a0518266f367e732955b36a16f62e258ae9 (diff)
downloadmruby-6088276cc833c104d0228f5c03140601c7fc06df.tar.gz
mruby-6088276cc833c104d0228f5c03140601c7fc06df.zip
Merge pull request #3630 from nobu/bug/sprintf-sp3inf
Fix space flag with inf/nan
Diffstat (limited to 'mrbgems/mruby-sprintf/src')
-rw-r--r--mrbgems/mruby-sprintf/src/sprintf.c36
1 files changed, 14 insertions, 22 deletions
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c
index 3d96573a7..7dab63a17 100644
--- a/mrbgems/mruby-sprintf/src/sprintf.c
+++ b/mrbgems/mruby-sprintf/src/sprintf.c
@@ -1040,6 +1040,7 @@ retry:
if (!isfinite(fval)) {
const char *expr;
const int elen = 3;
+ char sign = '\0';
if (isnan(fval)) {
expr = "NaN";
@@ -1048,35 +1049,26 @@ retry:
expr = "Inf";
}
need = elen;
- if ((!isnan(fval) && fval < 0.0) || (flags & FPLUS))
- need++;
+ if (!isnan(fval) && fval < 0.0)
+ sign = '-';
+ else if (flags & (FPLUS|FSPACE))
+ sign = (flags & FPLUS) ? '+' : ' ';
+ if (sign)
+ ++need;
if ((flags & FWIDTH) && need < width)
need = width;
- CHECK(need + 1);
- n = snprintf(&buf[blen], need + 1, "%*s", need, "");
- if (n < 0) {
- mrb_raise(mrb, E_RUNTIME_ERROR, "formatting error");
- }
+ FILL(' ', need);
if (flags & FMINUS) {
- if (!isnan(fval) && fval < 0.0)
- buf[blen++] = '-';
- else if (flags & FPLUS)
- buf[blen++] = '+';
- else if (flags & FSPACE)
- blen++;
- memcpy(&buf[blen], expr, elen);
+ if (sign)
+ buf[blen - need--] = sign;
+ memcpy(&buf[blen - need], expr, elen);
}
else {
- if (!isnan(fval) && fval < 0.0)
- buf[blen + need - elen - 1] = '-';
- else if (flags & FPLUS)
- buf[blen + need - elen - 1] = '+';
- else if ((flags & FSPACE) && need > width)
- blen++;
- memcpy(&buf[blen + need - elen], expr, elen);
+ if (sign)
+ buf[blen - elen - 1] = sign;
+ memcpy(&buf[blen - elen], expr, elen);
}
- blen += strlen(&buf[blen]);
break;
}