X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fxstrtod.c;h=1a0b4d46038df6cfbdb595af1644e0a333724858;hb=11a85c350e8b872d617843487e1c77ea157880be;hp=838c5c463213ad4d805db6d36d26c2054eab186c;hpb=386767027dea095d9b5985d55243d46788e1d960;p=gnulib.git diff --git a/lib/xstrtod.c b/lib/xstrtod.c index 838c5c463..1a0b4d460 100644 --- a/lib/xstrtod.c +++ b/lib/xstrtod.c @@ -1,24 +1,46 @@ +/* error-checking interface to strtod-like functions + Copyright (C) 1996, 1999, 2000, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Jim Meyering. */ + #ifdef HAVE_CONFIG_H -#include +# include #endif -#ifdef STDC_HEADERS -#include -#else -double strtod (); -#endif +#include "xstrtod.h" #include -#include #include -#include -#include "xstrtod.h" +#include + +/* Tell the compiler that non-default rounding modes are used. */ +#if 199901 <= __STDC_VERSION__ + #pragma STDC FENV_ACCESS ON +#endif + +/* An interface to strtod that encapsulates all the error checking + one should usually perform. Like strtod, but upon successful + conversion put the result in *RESULT and return zero. Return + non-zero and don't modify *RESULT upon any failure. CONVERT + specifies the conversion function, e.g., strtod itself. */ int -xstrtod (str, ptr, result) - const char *str; - const char **ptr; - double *result; +xstrtod (char const *str, char const **ptr, double *result, + double (*convert) (char const *, char **)) { double val; char *terminator; @@ -26,7 +48,7 @@ xstrtod (str, ptr, result) fail = 0; errno = 0; - val = strtod (str, &terminator); + val = convert (str, &terminator); /* Having a non-zero terminator is an error only when PTR is NULL. */ if (terminator == str || (ptr == NULL && *terminator != '\0')) @@ -45,4 +67,3 @@ xstrtod (str, ptr, result) *result = val; return fail; } -