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>
This commit is contained in:
Kumar Gala 2018-07-12 12:41:56 -05:00 committed by Kumar Gala
commit e66da3f9e0
2 changed files with 39 additions and 6 deletions

View file

@ -229,18 +229,34 @@ static int _to_float(char *buf, uint64_t double_temp, int c,
*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 @@ int _prf(int (*func)(), void *dest, char *format, va_list vargs)
case 'e':
case 'E':
case 'f':
case 'F':
case 'g':
case 'G':
/* standard platforms which supports double */

View file

@ -77,24 +77,40 @@ void test_sprintf_double(void)
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),