changeset 513:9af85df20faa

.
author Jim Meyering <jim@meyering.net>
date Wed, 15 Nov 1995 21:58:58 +0000
parents a5a56f3cde83
children 93d8f8f3e23e
files lib/xstrtod.c lib/xstrtod.h
diffstat 2 files changed, 63 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/lib/xstrtod.c
@@ -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;
+}
+
new file mode 100644
--- /dev/null
+++ b/lib/xstrtod.h
@@ -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 */