From 06871729dd93553cdc826662b33dc2303ccbaadc Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Wed, 17 Apr 2013 07:40:48 -0600 Subject: [PATCH] Support for printing NaN and infinity from Andrew Tridgell --- libc/stdio/lib_libdtoa.c | 43 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/libc/stdio/lib_libdtoa.c b/libc/stdio/lib_libdtoa.c index a9a86817cf..7f39701271 100644 --- a/libc/stdio/lib_libdtoa.c +++ b/libc/stdio/lib_libdtoa.c @@ -44,6 +44,8 @@ * Included Files ****************************************************************************/ +#include + #include "lib_internal.h" /**************************************************************************** @@ -84,6 +86,10 @@ * Private Variables ****************************************************************************/ +/**************************************************************************** + * Private Functions + ****************************************************************************/ + /**************************************************************************** * Name: zeroes * @@ -103,9 +109,21 @@ static void zeroes(FAR struct lib_outstream_s *obj, int nzeroes) } /**************************************************************************** - * Private Functions + * Name: lib_dtoa_string + * + * Description: + * Print the specified string + * ****************************************************************************/ +static void lib_dtoa_string(FAR struct lib_outstream_s *obj, const char *str) +{ + while (*str) + { + obj->put(obj, *str++); + } +} + /**************************************************************************** * Name: lib_dtoa * @@ -140,6 +158,25 @@ static void lib_dtoa(FAR struct lib_outstream_s *obj, int fmt, int prec, int dsgn; /* Unused sign indicator */ int i; + /* Special handling for NaN and Infinity */ + + if (isnan(value)) + { + lib_dtoa_string(obj, "NaN"); + return; + } + + if (isinf(value)) + { + if (value < 0.0d) + { + obj->put(obj, '-'); + } + + lib_dtoa_string(obj, "Infinity"); + return; + } + /* Non-zero... positive or negative */ if (value < 0) @@ -173,7 +210,7 @@ static void lib_dtoa(FAR struct lib_outstream_s *obj, int fmt, int prec, obj->put(obj, '0'); - /* A decimal point is printed only in the alternate form or if a + /* A decimal point is printed only in the alternate form or if a * particular precision is requested. */ @@ -227,7 +264,7 @@ static void lib_dtoa(FAR struct lib_outstream_s *obj, int fmt, int prec, for (i = expt; i > 0; i--) { if (*digits != '\0') - { + { obj->put(obj, *digits); digits++; }