1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
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:
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: }