Mail Archives: djgpp-workers/2003/02/26/13:38:55
Hello.
Here's what I've cooked up for supporting inf and nan in
strtod.c. When we're happt with this one I'll take care of strtof()
and strtold().
Right,
						MartinS
New file, djgpp/src/libc/c99/math/nan.c:
/* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */
#include <libc/ieee.h>
float_t __dj_nan = { 0x7fffff, 0xff, 0x0 };
Patch:
Index: djgpp/include/math.h
===================================================================
RCS file: /cvs/djgpp/djgpp/include/math.h,v
retrieving revision 1.7
diff -p -u -r1.7 math.h
--- djgpp/include/math.h	20 Feb 2003 19:04:02 -0000	1.7
+++ djgpp/include/math.h	26 Feb 2003 18:26:53 -0000
@@ -51,6 +51,11 @@ extern long double __dj_huge_vall;
 #define HUGE_VALF __dj_huge_valf
 #define HUGE_VALL __dj_huge_vall
 
+#define INFINITY  HUGE_VALF
+
+extern float       __dj_nan;
+#define NAN        __dj_nan
+
 #endif /* (__STDC_VERSION__ >= 199901L) || !__STRICT_ANSI__ */
   
 #ifndef __STRICT_ANSI__
Index: djgpp/src/libc/ansi/stdlib/strtod.c
===================================================================
RCS file: /cvs/djgpp/djgpp/src/libc/ansi/stdlib/strtod.c,v
retrieving revision 1.5
diff -p -u -r1.5 strtod.c
--- djgpp/src/libc/ansi/stdlib/strtod.c	17 Oct 2002 23:00:24 -0000	1.5
+++ djgpp/src/libc/ansi/stdlib/strtod.c	26 Feb 2003 18:26:56 -0000
@@ -8,6 +8,7 @@
 #include <float.h>
 #include <errno.h>
 #include <ctype.h>
+#include <string.h>
 #include <libc/unconst.h>
 
 double
@@ -32,6 +33,7 @@ strtod(const char *s, char **sret)
   while (isspace((unsigned char) *s))
     s++;
 
+  /* Handle leading sign. */
   if (*s == '+')
     s++;
   else if (*s == '-')
@@ -40,6 +42,65 @@ strtod(const char *s, char **sret)
     s++;
   }
 
+  /* Handle INF and INFINITY. */
+  if ( ! strnicmp( "INF", s, 3 ) )
+  {
+    if( sret )
+    {
+      if ( ! strnicmp( "INITY", &s[3], 5 ) )
+      {
+	*sret = unconst((&s[8]), char *);
+      }
+      else
+      {
+	*sret = unconst((&s[3]), char *);
+      }
+    }
+
+    if( 0 <= sign )
+    {
+      return INFINITY;
+    }
+    else
+    {
+      return -INFINITY;
+    }
+  }
+
+  /* Handle NAN and NAN(<whatever>). */
+  if ( ! strnicmp( "NAN", s, 3 ) )
+  {
+    if( s[3] == '(' )
+    {
+      int end_of_n_char_sequence = 4;
+
+      while( s[end_of_n_char_sequence] != 0 && 
+	     s[end_of_n_char_sequence] != ')' )
+      {
+	end_of_n_char_sequence++;
+      }
+      if( s[end_of_n_char_sequence] == ')' )
+      {
+	/* If we are going to support "nan(0x1234) for setting specific bits, 
+	 * that code goes here. Something like "bits = strtoul( &s[4], &end_p,
+	 * 0);".
+	 */
+	if( sret )
+	{
+	  *sret = unconst((&s[end_of_n_char_sequence+1]), char *);
+	  return NAN;
+	}
+      }
+      /* The subject sequence didn't match NAN(), so match only NAN. */
+    }
+    if( sret )
+    {
+      *sret = unconst((&s[3]), char *);
+    }
+    return NAN;
+  }
+
+  /* Handle ordinary numbers. */
   while ((*s >= '0') && (*s <= '9'))
   {
     flags |= 1;
Index: djgpp/src/libc/c99/math/makefile
===================================================================
RCS file: /cvs/djgpp/djgpp/src/libc/c99/math/makefile,v
retrieving revision 1.1
diff -p -u -r1.1 makefile
--- djgpp/src/libc/c99/math/makefile	23 Jan 2003 19:50:51 -0000	1.1
+++ djgpp/src/libc/c99/math/makefile	26 Feb 2003 18:26:57 -0000
@@ -3,5 +3,6 @@ TOP=../..
 
 SRC += hugevalf.c
 SRC += hugevall.c
+SRC += nan.c
 
 include $(TOP)/../makefile.inc
Index: djgpp/tests/libc/ansi/stdlib/strtod.c
===================================================================
RCS file: /cvs/djgpp/djgpp/tests/libc/ansi/stdlib/strtod.c,v
retrieving revision 1.1
diff -p -u -r1.1 strtod.c
--- djgpp/tests/libc/ansi/stdlib/strtod.c	1 Jan 1998 21:45:46 -0000	1.1
+++ djgpp/tests/libc/ansi/stdlib/strtod.c	26 Feb 2003 18:27:05 -0000
@@ -9,6 +9,9 @@ static const char *testnum[] = {
   "1e6000000000",	/* overflow */
   "1e400",		/* ditto */
   "1e-400",		/* underflow */
+  "InF",		/* infinity */
+  "nAn",		/* nan */
+  "Nan()",		/* nan */
   0
 };
 
- Raw text -