Mercurial > hg > octave-lyh > gnulib-hg
changeset 11070:42d47e0b9b24
Improve error handling of c_strtod.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Wed, 21 Jan 2009 23:35:43 +0100 |
parents | 8488a80e49bc |
children | 784aa6a7ca43 |
files | ChangeLog lib/c-strtod.c |
diffstat | 2 files changed, 21 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-01-21 Bruno Haible <bruno@clisp.org> + + * lib/c-strtod.c: Include errno.h. + (C_STRTOD): Check against NULL return from newlocale. Preserve errno + value from STRTOD_L and STRTOD. + 2009-01-21 Bruno Haible <bruno@clisp.org> and Jim Meyering <meyering@redhat.com>
--- 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 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2006, 2009 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 @@ -21,6 +21,7 @@ #include "c-strtod.h" +#include <errno.h> #include <locale.h> #include <stdlib.h> @@ -50,9 +51,18 @@ #ifdef LC_ALL_MASK - locale_t c_locale = newlocale (LC_ALL_MASK, "C", 0); + locale_t c_locale; + int saved_errno; + + c_locale = newlocale (LC_ALL_MASK, "C", (locale_t) 0); + if (!c_locale) + return 0; /* errno is set here */ + r = STRTOD_L (nptr, endptr, c_locale); + + saved_errno = errno; freelocale (c_locale); + errno = saved_errno; #else @@ -68,8 +78,11 @@ if (saved_locale) { + int saved_errno = errno; + setlocale (LC_NUMERIC, saved_locale); free (saved_locale); + errno = saved_errno; } #endif