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:
parent
409c9e751f
commit
e66da3f9e0
2 changed files with 39 additions and 6 deletions
|
@ -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 */
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue