summaryrefslogtreecommitdiff
path: root/sprintf.c
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-06-22 14:38:21 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-06-22 14:38:21 +0000
commita28006f959e36e11e6d7ca1cd82220c1d58b753b (patch)
tree65a18f191504732b699290f8e712899371c42731 /sprintf.c
parent29904b93f4e001150e63a77f08cac8574d2c0307 (diff)
* sprintf.c (rb_f_sprintf): support FZERO and FSPACE with NaN/Inf.
* test/ruby/test_sprintf.rb (test_nan, test_inf): add tests. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6495 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'sprintf.c')
-rw-r--r--sprintf.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/sprintf.c b/sprintf.c
index be22578a8d..17bcce1330 100644
--- a/sprintf.c
+++ b/sprintf.c
@@ -698,7 +698,7 @@ rb_f_sprintf(argc, argv)
expr = "Inf";
}
need = strlen(expr);
- if (fval < 0.0 || (flags & FPLUS))
+ if ((!isnan(fval) && fval < 0.0) || (flags & FPLUS))
need++;
if ((flags & FWIDTH) && need < width)
need = width;
@@ -706,14 +706,34 @@ rb_f_sprintf(argc, argv)
CHECK(need);
sprintf(&buf[blen], "%*s", need, "");
if (flags & FMINUS) {
- if (fval < 0.0)
+ if (!isnan(fval) && fval < 0.0)
buf[blen++] = '-';
else if (flags & FPLUS)
buf[blen++] = '+';
+ else if (flags & FSPACE)
+ blen++;
+ strncpy(&buf[blen], expr, strlen(expr));
+ }
+ else if (flags & FZERO) {
+ if (!isnan(fval) && fval < 0.0) {
+ buf[blen++] = '-';
+ need--;
+ }
+ else if (flags & FPLUS) {
+ buf[blen++] = '+';
+ need--;
+ }
+ else if (flags & FSPACE) {
+ blen++;
+ need--;
+ }
+ while (need-- - strlen(expr) > 0) {
+ buf[blen++] = '0';
+ }
strncpy(&buf[blen], expr, strlen(expr));
}
else {
- if (fval < 0.0)
+ if (!isnan(fval) && fval < 0.0)
buf[blen + need - strlen(expr) - 1] = '-';
else if (flags & FPLUS)
buf[blen + need - strlen(expr) - 1] = '+';