summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/sort/xstrtod.c
diff options
context:
space:
mode:
authornate <nate@FreeBSD.org>1996-02-12 06:39:49 +0000
committernate <nate@FreeBSD.org>1996-02-12 06:39:49 +0000
commita541000ba091bdab04b610bf2ad4f8a20c4a910e (patch)
tree1caff7110bb1e55436543bca0ce06022550e79fb /gnu/usr.bin/sort/xstrtod.c
parentc0ae8aaae29c16a516aabe7b88b3b7f97779077d (diff)
parent4778ca641d25e08c667c809693e9d1d8a79098e3 (diff)
downloadFreeBSD-src-a541000ba091bdab04b610bf2ad4f8a20c4a910e.zip
FreeBSD-src-a541000ba091bdab04b610bf2ad4f8a20c4a910e.tar.gz
This commit was generated by cvs2svn to compensate for changes in r14049,
which included commits to RCS files with non-trunk default branches.
Diffstat (limited to 'gnu/usr.bin/sort/xstrtod.c')
-rw-r--r--gnu/usr.bin/sort/xstrtod.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/gnu/usr.bin/sort/xstrtod.c b/gnu/usr.bin/sort/xstrtod.c
new file mode 100644
index 0000000..838c5c4
--- /dev/null
+++ b/gnu/usr.bin/sort/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;
+}
+
OpenPOWER on IntegriCloud