(linenum→info "unix/slp.c:2238")

coreutils/6.9/lib/c-strtod.c

    1: /* Convert string to double, using the C locale.
    2: 
    3:    Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
    4: 
    5:    This program is free software; you can redistribute it and/or modify
    6:    it under the terms of the GNU General Public License as published by
    7:    the Free Software Foundation; either version 2, or (at your option)
    8:    any later version.
    9: 
   10:    This program is distributed in the hope that it will be useful,
   11:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   13:    GNU General Public License for more details.
   14: 
   15:    You should have received a copy of the GNU General Public License
   16:    along with this program; if not, write to the Free Software Foundation,
   17:    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
   18: 
   19: /* Written by Paul Eggert.  */
   20: 
   21: #include <config.h>
   22: 
   23: #include "c-strtod.h"
   24: 
   25: #include <locale.h>
   26: #include <stdlib.h>
   27: 
   28: #include "xalloc.h"
   29: 
   30: #if LONG
   31: # define C_STRTOD c_strtold
   32: # define DOUBLE long double
   33: # define STRTOD_L strtold_l
   34: #else
   35: # define C_STRTOD c_strtod
   36: # define DOUBLE double
   37: # define STRTOD_L strtod_l
   38: #endif
   39: 
   40: /* c_strtold falls back on strtod if strtold doesn't conform to C99.  */
   41: #if LONG && HAVE_C99_STRTOLD
   42: # define STRTOD strtold
   43: #else
   44: # define STRTOD strtod
   45: #endif
   46: 
   47: DOUBLE
   48: C_STRTOD (char const *nptr, char **endptr)
   49: {
   50:   DOUBLE r;
   51: 
   52: #ifdef LC_ALL_MASK
   53: 
   54:   locale_t c_locale = newlocale (LC_ALL_MASK, "C", 0);
   55:   r = STRTOD_L (nptr, endptr, c_locale);
   56:   freelocale (c_locale);
   57: 
   58: #else
   59: 
   60:   char *saved_locale = setlocale (LC_NUMERIC, NULL);
   61: 
   62:   if (saved_locale)
   63:     {
   64:       saved_locale = xstrdup (saved_locale);
   65:       setlocale (LC_NUMERIC, "C");
   66:     }
   67: 
   68:   r = STRTOD (nptr, endptr);
   69: 
   70:   if (saved_locale)
   71:     {
   72:       setlocale (LC_NUMERIC, saved_locale);
   73:       free (saved_locale);
   74:     }
   75: 
   76: #endif
   77: 
   78:   return r;
   79: }
Syntax (Markdown)