/* Convert string to double, using the C locale.
- Copyright (C) 2003, 2004, 2006, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2003-2004, 2006, 2009-2012 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
#include <errno.h>
#include <locale.h>
#include <stdlib.h>
-
-#include "xalloc.h"
+#include <string.h>
#if LONG
# define C_STRTOD c_strtold
# 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
{
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)
{
if (endptr)
- *endptr = nptr;
+ *endptr = (char *) nptr;
return 0; /* errno is set here */
}
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");
}