summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1995-11-15 21:58:58 +0000
committerJim Meyering <jim@meyering.net>1995-11-15 21:58:58 +0000
commite99f53404625a16651beb66659896311dbc56006 (patch)
tree72702266a38023d6609f0a548f7e4331c3b3f281 /lib
parentaeac9910cbd3e9b078204a27af0618b382e80c22 (diff)
downloadcoreutils-e99f53404625a16651beb66659896311dbc56006.tar.xz
.
Diffstat (limited to 'lib')
-rw-r--r--lib/xstrtod.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/xstrtod.c b/lib/xstrtod.c
new file mode 100644
index 000000000..838c5c463
--- /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;
+}
+