diff options
-rw-r--r-- | THANKS.in | 1 | ||||
-rw-r--r-- | lib/c-strtod.c | 81 | ||||
-rw-r--r-- | lib/c-strtod.h | 2 | ||||
-rw-r--r-- | lib/c-strtold.c | 2 | ||||
-rw-r--r-- | m4/c-strtod.m4 | 55 | ||||
-rw-r--r-- | m4/np_coreutils.m4 | 1 | ||||
-rw-r--r-- | plugins/Makefile.am | 4 |
7 files changed, 145 insertions, 1 deletions
@@ -184,3 +184,4 @@ Jason Kau Michael Tiernan Jeremy Reed Holger Weiss +Cire Iriarte diff --git a/lib/c-strtod.c b/lib/c-strtod.c new file mode 100644 index 00000000..031f5f87 --- /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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 doesn't conform to C99. */ +#if LONG && HAVE_C99_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; +} diff --git a/lib/c-strtod.h b/lib/c-strtod.h new file mode 100644 index 00000000..ca9a9e7c --- /dev/null +++ b/lib/c-strtod.h @@ -0,0 +1,2 @@ +double c_strtod (char const *, char **); +long double c_strtold (char const *, char **); diff --git a/lib/c-strtold.c b/lib/c-strtold.c new file mode 100644 index 00000000..5510e4a4 --- /dev/null +++ b/lib/c-strtold.c @@ -0,0 +1,2 @@ +#define LONG 1 +#include "c-strtod.c" diff --git a/m4/c-strtod.m4 b/m4/c-strtod.m4 new file mode 100644 index 00000000..ffeb4588 --- /dev/null +++ b/m4/c-strtod.m4 @@ -0,0 +1,55 @@ +# c-strtod.m4 serial 6 + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Written by Paul Eggert. + +AC_DEFUN([gl_C99_STRTOLD], +[ + AC_CACHE_CHECK([whether strtold conforms to C99], + [gl_cv_func_c99_strtold], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[/* On HP-UX before 11.23, strtold returns a struct instead of + long double. Reject implementations like that, by requiring + compatibility with the C99 prototype. */ + #include <stdlib.h> + static long double (*p) (char const *, char **) = strtold; + static long double + test (char const *nptr, char **endptr) + { + long double r; + r = strtold (nptr, endptr); + return r; + }]], + [[return test ("1.0", NULL) != 1 || p ("1.0", NULL) != 1;]])], + [gl_cv_func_c99_strtold=yes], + [gl_cv_func_c99_strtold=no])]) + if test $gl_cv_func_c99_strtold = yes; then + AC_DEFINE([HAVE_C99_STRTOLD], 1, [Define to 1 if strtold conforms to C99.]) + fi +]) + +AC_DEFUN([gl_C_STRTOD], +[ + AC_LIBSOURCES([c-strtod.c, c-strtod.h]) + AC_LIBOBJ([c-strtod]) + + dnl Prerequisites of lib/c-strtod.c. + AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) + : +]) + +AC_DEFUN([gl_C_STRTOLD], +[ + AC_LIBSOURCES([c-strtold.c, c-strtod.h]) + AC_LIBOBJ([c-strtold]) + + dnl Prerequisites of lib/c-strtold.c. + AC_REQUIRE([gl_C_STRTOD]) + AC_REQUIRE([gl_C99_STRTOLD]) + : +]) diff --git a/m4/np_coreutils.m4 b/m4/np_coreutils.m4 index 44aa3b80..18c5f66b 100644 --- a/m4/np_coreutils.m4 +++ b/m4/np_coreutils.m4 @@ -11,6 +11,7 @@ dnl Usually in coreutils' prereq.m4, but this is a subset that we need AC_DEFUN([np_COREUTILS], [ AC_REQUIRE([AM_STDBOOL_H]) + AC_REQUIRE([gl_C_STRTOLD]) AC_REQUIRE([gl_GETOPT]) AC_REQUIRE([gl_AFS]) AC_REQUIRE([gl_EXITFAIL]) diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 183f4f11..81645b82 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -11,7 +11,9 @@ localedir = $(datadir)/locale DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ LIBS = @LIBINTL@ @LIBS@ @SSLLIBS@ MATHLIBS = @MATHLIBS@ -AM_CFLAGS = -Wall + +# This is not portable. Run ". tools/devmode" to get development compile flags +#AM_CFLAGS = -Wall libexec_PROGRAMS = check_apt check_disk check_dummy check_http check_load \ check_mrtg check_mrtgtraf check_ntp check_nwstat check_overcr check_ping \ |