OpenCoverage

c-strtod.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/c-strtod.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* Convert string to double, using the C locale.-
2-
3 Copyright (C) 2003-2004, 2006, 2009-2018 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 3 of the License, or-
8 (at your option) 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, see <https://www.gnu.org/licenses/>. */-
17-
18/* Written by Paul Eggert. */-
19-
20#include <config.h>-
21-
22#include "c-strtod.h"-
23-
24#include <errno.h>-
25#include <locale.h>-
26#include <stdlib.h>-
27#include <string.h>-
28-
29#if LONG-
30# define C_STRTOD c_strtold-
31# define DOUBLE long double-
32# define STRTOD_L strtold_l-
33#else-
34# define C_STRTOD c_strtod-
35# define DOUBLE double-
36# define STRTOD_L strtod_l-
37#endif-
38-
39/* c_strtold falls back on strtod if strtold doesn't conform to C99. */-
40#if LONG && HAVE_C99_STRTOLD-
41# define STRTOD strtold-
42#else-
43# define STRTOD strtod-
44#endif-
45-
46#if defined LC_ALL_MASK && (LONG ? HAVE_STRTOLD_L : HAVE_STRTOD_L)-
47-
48/* Cache for the C locale object.-
49 Marked volatile so that different threads see the same value-
50 (avoids locking). */-
51static volatile locale_t c_locale_cache;-
52-
53/* Return the C locale object, or (locale_t) 0 with errno set-
54 if it cannot be created. */-
55static locale_t-
56c_locale (void)-
57{-
58 if (!c_locale_cache)
!c_locale_cacheDescription
TRUEevaluated 601 times by 5 tests
Evaluated by:
  • printf
  • seq
  • sleep
  • tail
  • timeout
FALSEevaluated 221 times by 2 tests
Evaluated by:
  • seq
  • sleep
221-601
59 c_locale_cache = newlocale (LC_ALL_MASK, "C", (locale_t) 0);
executed 601 times by 5 tests: c_locale_cache = newlocale ( ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10) | (1 << 11) | (1 << 12) ) , "C", (locale_t) 0);
Executed by:
  • printf
  • seq
  • sleep
  • tail
  • timeout
601
60 return c_locale_cache;
executed 822 times by 5 tests: return c_locale_cache;
Executed by:
  • printf
  • seq
  • sleep
  • tail
  • timeout
822
61}-
62-
63#endif-
64-
65DOUBLE-
66C_STRTOD (char const *nptr, char **endptr)-
67{-
68 DOUBLE r;-
69-
70#if defined LC_ALL_MASK && (LONG ? HAVE_STRTOLD_L : HAVE_STRTOD_L)-
71-
72 locale_t locale = c_locale ();-
73 if (!locale)
!localeDescription
TRUEnever evaluated
FALSEevaluated 822 times by 5 tests
Evaluated by:
  • printf
  • seq
  • sleep
  • tail
  • timeout
0-822
74 {-
75 if (endptr)
endptrDescription
TRUEnever evaluated
FALSEnever evaluated
0
76 *endptr = (char *) nptr;
never executed: *endptr = (char *) nptr;
0
77 return 0; /* errno is set here */
never executed: return 0;
0
78 }-
79-
80 r = STRTOD_L (nptr, endptr, locale);-
81-
82#else-
83-
84 char *saved_locale = setlocale (LC_NUMERIC, NULL);-
85-
86 if (saved_locale)-
87 {-
88 saved_locale = strdup (saved_locale);-
89 if (saved_locale == NULL)-
90 {-
91 if (endptr)-
92 *endptr = (char *) nptr;-
93 return 0; /* errno is set here */-
94 }-
95 setlocale (LC_NUMERIC, "C");-
96 }-
97-
98 r = STRTOD (nptr, endptr);-
99-
100 if (saved_locale)-
101 {-
102 int saved_errno = errno;-
103-
104 setlocale (LC_NUMERIC, saved_locale);-
105 free (saved_locale);-
106 errno = saved_errno;-
107 }-
108-
109#endif-
110-
111 return r;
executed 822 times by 5 tests: return r;
Executed by:
  • printf
  • seq
  • sleep
  • tail
  • timeout
822
112}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2