Mercurial > hg > octave-nkf > gnulib-hg
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 */