changeset 5114:e0eddd7ceb40

Imported from coreutils.
author Paul Eggert <eggert@cs.ucla.edu>
date Thu, 05 Aug 2004 23:27:27 +0000
parents 558a239cba94
children aca53f1533ed
files lib/c-strtod.c lib/c-strtod.h lib/c-strtold.c m4/c-strtod.m4 modules/c-strtod modules/c-strtold
diffstat 6 files changed, 163 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/lib/c-strtod.c
@@ -0,0 +1,81 @@
+/* Convert string to double, using the C locale.
+
+   Copyright (C) 2003, 2004 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 Paul Eggert.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "c-strtod.h"
+
+#include <locale.h>
+#include <stdlib.h>
+
+#include "xalloc.h"
+
+#if LONG
+# define C_STRTOD c_strtold
+# define DOUBLE long double
+# define STRTOD_L strtold_l
+#else
+# define C_STRTOD c_strtod
+# define DOUBLE double
+# define STRTOD_L strtod_l
+#endif
+
+/* c_strtold falls back on strtod if strtold isn't declared.  */
+#if LONG && HAVE_DECL_STRTOLD
+# define STRTOD strtold
+#else
+# define STRTOD strtod
+#endif
+
+DOUBLE
+C_STRTOD (char const *nptr, char **endptr)
+{
+  DOUBLE r;
+
+#ifdef LC_ALL_MASK
+
+  locale_t c_locale = newlocale (LC_ALL_MASK, "C", 0);
+  r = STRTOD_L (nptr, endptr, c_locale);
+  freelocale (c_locale);
+
+#else
+
+  char *saved_locale = setlocale (LC_NUMERIC, NULL);
+
+  if (saved_locale)
+    {
+      saved_locale = xstrdup (saved_locale);
+      setlocale (LC_NUMERIC, "C");
+    }
+
+  r = STRTOD (nptr, endptr);
+
+  if (saved_locale)
+    {
+      setlocale (LC_NUMERIC, saved_locale);
+      free (saved_locale);
+    }
+
+#endif
+
+  return r;
+}
new file mode 100644
--- /dev/null
+++ b/lib/c-strtod.h
@@ -0,0 +1,2 @@
+double c_strtod (char const *, char **);
+long double c_strtold (char const *, char **);
new file mode 100644
--- /dev/null
+++ b/lib/c-strtold.c
@@ -0,0 +1,2 @@
+#define LONG 1
+#include "c-strtod.c"
new file mode 100644
--- /dev/null
+++ b/m4/c-strtod.m4
@@ -0,0 +1,33 @@
+# c-strtod.m4 serial 3
+
+# Copyright (C) 2004 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 Paul Eggert.
+
+AC_DEFUN([gl_C_STRTOD],
+[
+  dnl Prerequisites of lib/c-strtod.c.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  :
+])
+
+AC_DEFUN([gl_C_STRTOLD],
+[
+  dnl Prerequisites of lib/c-strtold.c.
+  AC_REQUIRE([gl_C_STRTOD])
+  AC_CHECK_DECLS_ONCE([strtold])
+])
new file mode 100644
--- /dev/null
+++ b/modules/c-strtod
@@ -0,0 +1,22 @@
+Description:
+Convert string to double in C locale.
+
+Files:
+lib/c-strtod.h
+lib/c-strtod.c
+
+Depends-on:
+extensions
+
+configure.ac:
+gl_C_STRTOD
+
+Makefile.am:
+lib_SOURCES += c-strtod.h c-strtod.c
+
+Include:
+"c-strtod.h"
+
+Maintainer:
+Paul Eggert, Jim Meyering
+
new file mode 100644
--- /dev/null
+++ b/modules/c-strtold
@@ -0,0 +1,23 @@
+Description:
+Convert string to long double in C locale.
+
+Files:
+lib/c-strtod.h
+lib/c-strtod.c
+lib/c-strtold.c
+
+Depends-on:
+extensions
+
+configure.ac:
+gl_C_STRTOLD
+
+Makefile.am:
+lib_SOURCES += c-strtod.h c-strtod.c c-strtold.c
+
+Include:
+"c-strtod.h"
+
+Maintainer:
+Paul Eggert, Jim Meyering
+