libc: minimal: Add support for %F conversion specifiers
For some reason %F wasn't supported initially. Its simple enough to
handle the case difference in infinity and NaN handling to add support
for %F.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
diff --git a/lib/libc/minimal/source/stdout/prf.c b/lib/libc/minimal/source/stdout/prf.c
index 1bb8802..47bc0b8 100644
--- a/lib/libc/minimal/source/stdout/prf.c
+++ b/lib/libc/minimal/source/stdout/prf.c
@@ -229,18 +229,34 @@
*buf++ = '-';
}
if (!fract) {
- *buf++ = 'i';
- *buf++ = 'n';
- *buf++ = 'f';
+ if (isupper(c)) {
+ *buf++ = 'I';
+ *buf++ = 'N';
+ *buf++ = 'F';
+ } else {
+ *buf++ = 'i';
+ *buf++ = 'n';
+ *buf++ = 'f';
+ }
} else {
- *buf++ = 'n';
- *buf++ = 'a';
- *buf++ = 'n';
+ if (isupper(c)) {
+ *buf++ = 'N';
+ *buf++ = 'A';
+ *buf++ = 'N';
+ } else {
+ *buf++ = 'n';
+ *buf++ = 'a';
+ *buf++ = 'n';
+ }
}
*buf = 0;
return buf - start;
}
+ if (c == 'F') {
+ c = 'f';
+ }
+
if ((exp | fract) != 0) {
exp -= (1023 - 1); /* +1 since .1 vs 1. */
fract |= HIGHBIT64;
@@ -545,6 +561,7 @@
case 'e':
case 'E':
case 'f':
+ case 'F':
case 'g':
case 'G':
/* standard platforms which supports double */
diff --git a/tests/lib/sprintf/src/main.c b/tests/lib/sprintf/src/main.c
index b7e38b0..fc6e544 100644
--- a/tests/lib/sprintf/src/main.c
+++ b/tests/lib/sprintf/src/main.c
@@ -77,24 +77,40 @@
zassert_true((strcmp(buffer, "inf") == 0),
"sprintf(inf) - incorrect output '%s'\n", buffer);
+ sprintf(buffer, "%F", var.d);
+ zassert_true((strcmp(buffer, "INF") == 0),
+ "sprintf(INF) - incorrect output '%s'\n", buffer);
+
var.u1 = 0x00000000;
var.u2 = 0xfff00000; /* Bit pattern for -INF (double) */
sprintf(buffer, "%f", var.d);
zassert_true((strcmp(buffer, "-inf") == 0),
"sprintf(-INF) - incorrect output '%s'\n", buffer);
+ sprintf(buffer, "%F", var.d);
+ zassert_true((strcmp(buffer, "-INF") == 0),
+ "sprintf(-INF) - incorrect output '%s'\n", buffer);
+
var.u1 = 0x00000000;
var.u2 = 0x7ff80000; /* Bit pattern for NaN (double) */
sprintf(buffer, "%f", var.d);
zassert_true((strcmp(buffer, "nan") == 0),
"sprintf(nan) - incorrect output '%s'\n", buffer);
+ sprintf(buffer, "%F", var.d);
+ zassert_true((strcmp(buffer, "NAN") == 0),
+ "sprintf(NAN) - incorrect output '%s'\n", buffer);
+
var.u1 = 0x00000000;
var.u2 = 0xfff80000; /* Bit pattern for -NaN (double) */
sprintf(buffer, "%f", var.d);
zassert_true((strcmp(buffer, "-nan") == 0),
"sprintf(-nan) - incorrect output '%s'\n", buffer);
+ sprintf(buffer, "%F", var.d);
+ zassert_true((strcmp(buffer, "-NAN") == 0),
+ "sprintf(-NAN) - incorrect output '%s'\n", buffer);
+
var.d = 1.0;
sprintf(buffer, "%f", var.d);
zassert_true((strcmp(buffer, "1.000000") == 0),