.
authorJim Meyering <jim@meyering.net>
Wed, 15 Nov 1995 21:58:58 +0000 (21:58 +0000)
committerJim Meyering <jim@meyering.net>
Wed, 15 Nov 1995 21:58:58 +0000 (21:58 +0000)
lib/xstrtod.c [new file with mode: 0644]
lib/xstrtod.h [new file with mode: 0644]

diff --git a/lib/xstrtod.c b/lib/xstrtod.c
new file mode 100644 (file)
index 0000000..838c5c4
--- /dev/null
@@ -0,0 +1,48 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#else
+double strtod ();
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <limits.h>
+#include <ctype.h>
+#include "xstrtod.h"
+
+int
+xstrtod (str, ptr, result)
+     const char *str;
+     const char **ptr;
+     double *result;
+{
+  double val;
+  char *terminator;
+  int fail;
+
+  fail = 0;
+  errno = 0;
+  val = strtod (str, &terminator);
+
+  /* Having a non-zero terminator is an error only when PTR is NULL. */
+  if (terminator == str || (ptr == NULL && *terminator != '\0'))
+    fail = 1;
+  else
+    {
+      /* Allow underflow (in which case strtod returns zero),
+        but flag overflow as an error. */
+      if (val != 0.0 && errno == ERANGE)
+       fail = 1;
+    }
+
+  if (ptr != NULL)
+    *ptr = terminator;
+
+  *result = val;
+  return fail;
+}
+
diff --git a/lib/xstrtod.h b/lib/xstrtod.h
new file mode 100644 (file)
index 0000000..69c7877
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef XSTRTOD_H
+#define XSTRTOD_H 1
+
+#ifndef __P
+# if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
+#  define __P(args) args
+# else
+#  define __P(args) ()
+# endif  /* GCC.  */
+#endif  /* Not __P.  */
+
+int
+  xstrtod (const char *str, const char **ptr, double *result);
+
+#endif /* XSTRTOD_H */