From 795cbb98c6950d732f112063bd16de02ec54db67 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Fri, 27 Sep 2013 18:16:46 +0200 Subject: [PATCH] printf-hook-builtin: Print NaN/Infinity floating point values as such --- src/libstrongswan/tests/test_printf.c | 14 +++++++++++ .../utils/printf_hook/printf_hook_builtin.c | 24 +++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/libstrongswan/tests/test_printf.c b/src/libstrongswan/tests/test_printf.c index a7b19d96e0..6c15fbea19 100644 --- a/src/libstrongswan/tests/test_printf.c +++ b/src/libstrongswan/tests/test_printf.c @@ -16,6 +16,7 @@ #include "test_suite.h" #include +#include static void verify(char *expected, char *format, ...) { @@ -133,6 +134,19 @@ START_TEST(test_printf_float) verify("-1.12", "%.2f", -1.1249); verify("-1.124", "%.3f", -1.12351); verify("-1.123", "%.3f", -1.12349); + +#ifdef NAN + verify("nan", "%.3f", NAN); + verify(" nan", "%5.3f", NAN); + verify("NAN", "%.3F", NAN); + verify("NAN ", "%-5.3F", NAN); +#endif +#ifdef INFINITY + verify("inf", "%.3f", INFINITY); + verify("-inf", "%.4f", -INFINITY); + verify("INF", "%.3F", INFINITY); + verify("-INF", "%.4F", -INFINITY); +#endif } END_TEST diff --git a/src/libstrongswan/utils/printf_hook/printf_hook_builtin.c b/src/libstrongswan/utils/printf_hook/printf_hook_builtin.c index a28ce7f487..ec0a418d81 100644 --- a/src/libstrongswan/utils/printf_hook/printf_hook_builtin.c +++ b/src/libstrongswan/utils/printf_hook/printf_hook_builtin.c @@ -923,9 +923,29 @@ int builtin_vsnprintf(char *buffer, size_t n, const char *format, va_list ap) } is_double: { + double dval; + + dval = va_arg(ap, double); + if (isinf(dval) == 1) + { + sarg = flags & FL_UPPER ? "INF" : "inf"; + slen = strlen(sarg); + goto is_string; + } + if (isinf(dval) == -1) + { + sarg = flags & FL_UPPER ? "-INF" : "-inf"; + slen = strlen(sarg); + goto is_string; + } + if (isnan(dval)) + { + sarg = flags & FL_UPPER ? "NAN" : "nan"; + slen = strlen(sarg); + goto is_string; + } sz = format_double(q, (o < n) ? n - o : 0, - va_arg(ap, double), - flags, base, width, prec); + dval, flags, base, width, prec); q += sz; o += sz; break; -- 2.47.2