diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-06-22 14:38:21 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-06-22 14:38:21 +0000 |
commit | a28006f959e36e11e6d7ca1cd82220c1d58b753b (patch) | |
tree | 65a18f191504732b699290f8e712899371c42731 /sprintf.c | |
parent | 29904b93f4e001150e63a77f08cac8574d2c0307 (diff) | |
download | ruby-a28006f959e36e11e6d7ca1cd82220c1d58b753b.tar.gz |
* 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.c | 26 |
1 files changed, 23 insertions, 3 deletions
@@ -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] = '+'; |