X-Git-Url: https://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fc-strtod.c;h=2705a2b5af9743787c0908f4e1b166d86fe0862d;hb=8e0f64e4cd12f7779113bc438afd106dad3e1f1a;hp=3d0fae99560dff70ba53334aff83f4faf5bfa2fd;hpb=0f4a0409cb0fa10631b9fe2241a2c8083f37daf5;p=gnulib.git diff --git a/lib/c-strtod.c b/lib/c-strtod.c index 3d0fae995..2705a2b5a 100644 --- a/lib/c-strtod.c +++ b/lib/c-strtod.c @@ -1,6 +1,6 @@ /* Convert string to double, using the C locale. - Copyright (C) 2003, 2004, 2006, 2009 Free Software Foundation, Inc. + Copyright (C) 2003-2004, 2006, 2009-2013 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 @@ -24,8 +24,7 @@ #include #include #include - -#include "xalloc.h" +#include #if LONG # define C_STRTOD c_strtold @@ -44,7 +43,7 @@ # define STRTOD strtod #endif -#ifdef LC_ALL_MASK +#if defined LC_ALL_MASK && (LONG ? HAVE_STRTOLD_L : HAVE_STRTOD_L) /* Cache for the C locale object. Marked volatile so that different threads see the same value @@ -53,7 +52,7 @@ static volatile locale_t c_locale_cache; /* Return the C locale object, or (locale_t) 0 with errno set if it cannot be created. */ -static inline locale_t +static locale_t c_locale (void) { if (!c_locale_cache) @@ -68,11 +67,15 @@ C_STRTOD (char const *nptr, char **endptr) { DOUBLE r; -#ifdef LC_ALL_MASK +#if defined LC_ALL_MASK && (LONG ? HAVE_STRTOLD_L : HAVE_STRTOD_L) locale_t locale = c_locale (); if (!locale) - return 0; /* errno is set here */ + { + if (endptr) + *endptr = (char *) nptr; + return 0; /* errno is set here */ + } r = STRTOD_L (nptr, endptr, locale); @@ -82,7 +85,13 @@ C_STRTOD (char const *nptr, char **endptr) if (saved_locale) { - saved_locale = xstrdup (saved_locale); + saved_locale = strdup (saved_locale); + if (saved_locale == NULL) + { + if (endptr) + *endptr = (char *) nptr; + return 0; /* errno is set here */ + } setlocale (LC_NUMERIC, "C"); }