ReactOS 0.4.16-dev-835-gd769f56
strtod.cpp
Go to the documentation of this file.
1//
2// strtod.cpp
3//
4// Copyright (c) Microsoft Corporation. All rights reserved.
5//
6// Definitions of the functions that convert strings to floating point numbers.
7// These functions, the strtox and wcstox functions for floating point types,
8// recogize an optional sequence of tabs and space, then an optional sign, then
9// a sequence of digits optionally containing a decimal point, then an optional
10// e or E followed by an optionally signed integer, and converts all of this to
11// a floating point number. The first unrecognized character ends the string.
12// The *end_ptr pointer is updated to point to the last character of the string
13//
14#define _ALLOW_OLD_VALIDATE_MACROS
16#include <stdlib.h>
17
18
19
20template <typename FloatingType, typename Character>
21static FloatingType __cdecl common_strtod_l(
22 _In_z_ Character const* const string,
23 _Out_opt_ _Deref_post_z_ Character** const end_ptr,
24 _locale_t const locale
25 ) throw()
26{
27 if (end_ptr)
28 {
29 *end_ptr = const_cast<Character*>(string);
30 }
31
32 _VALIDATE_RETURN(string != nullptr, EINVAL, 0.0);
33
34 _LocaleUpdate locale_update(locale);
35
36 FloatingType result{};
38 locale_update.GetLocaleT(),
40 &result);
41
43 {
44 errno = ERANGE;
45 }
46
47 return result;
48}
49
50//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51//
52// Narrow Strings => Floating Point
53//
54//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55extern "C" float __cdecl strtof(
56 char const* const string,
57 char** const end_ptr
58 )
59{
60 return common_strtod_l<float>(string, end_ptr, nullptr);
61}
62
63extern "C" float __cdecl _strtof_l(
64 char const* const string,
65 char** const end_ptr,
66 _locale_t const locale
67 )
68{
69 return common_strtod_l<float>(string, end_ptr, locale);
70}
71
72extern "C" double __cdecl strtod(
73 char const* const string,
74 char** const end_ptr
75 )
76{
77 return common_strtod_l<double>(string, end_ptr, nullptr);
78}
79
80extern "C" double __cdecl _strtod_l(
81 char const* const string,
82 char** const end_ptr,
83 _locale_t const locale
84 )
85{
86 return common_strtod_l<double>(string, end_ptr, locale);
87}
88
89extern "C" long double __cdecl strtold(
90 char const* const string,
91 char** const end_ptr
92 )
93{
94 return common_strtod_l<double>(string, end_ptr, nullptr);
95}
96
97
98extern "C" long double __cdecl _strtold_l(
99 char const* const string,
100 char** const end_ptr,
101 _locale_t const locale
102 )
103{
104 return common_strtod_l<double>(string, end_ptr, locale);
105}
106
107
108
109//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
110//
111// Wide Strings => Floating Point
112//
113//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
114extern "C" float __cdecl wcstof(
115 wchar_t const* const string,
116 wchar_t** const end_ptr
117 )
118{
119 return common_strtod_l<float>(string, end_ptr, nullptr);
120}
121
122extern "C" float __cdecl _wcstof_l(
123 wchar_t const* const string,
124 wchar_t** const end_ptr,
125 _locale_t const locale
126 )
127{
128 return common_strtod_l<float>(string, end_ptr, locale);
129}
130
131extern "C" double __cdecl wcstod(
132 wchar_t const* const string,
133 wchar_t** const end_ptr
134 )
135{
136 return common_strtod_l<double>(string, end_ptr, nullptr);
137}
138
139extern "C" double __cdecl _wcstod_l(
140 wchar_t const* const string,
141 wchar_t** const end_ptr,
142 _locale_t const locale
143 )
144{
145 return common_strtod_l<double>(string, end_ptr, locale);
146}
147
148extern "C" long double __cdecl wcstold(
149 wchar_t const* const string,
150 wchar_t** const end_ptr
151 )
152{
153 return common_strtod_l<double>(string, end_ptr, nullptr);
154}
155
156
157extern "C" long double __cdecl _wcstold_l(
158 wchar_t const* const string,
159 wchar_t** const end_ptr,
160 _locale_t const locale
161 )
162{
163 return common_strtod_l<double>(string, end_ptr, locale);
164}
#define EINVAL
Definition: acclib.h:90
#define ERANGE
Definition: acclib.h:92
#define __cdecl
Definition: accygwin.h:79
Definition: _locale.h:75
#define _VALIDATE_RETURN(expr, errorcode, retexpr)
GLuint64EXT * result
Definition: glext.h:11304
char string[160]
Definition: util.h:11
#define _Deref_post_z_
Definition: ms_sal.h:1121
c_string_character_source< Character > __cdecl make_c_string_character_source(Character const *const string, EndPointer const end)
SLD_STATUS __cdecl parse_floating_point(_locale_t const locale, CharacterSource source, FloatingType *const result)
#define _Out_opt_
Definition: no_sal2.h:214
#define _In_z_
Definition: no_sal2.h:164
#define errno
Definition: errno.h:18
float __cdecl strtof(char const *const string, char **const end_ptr)
Definition: strtod.cpp:55
static FloatingType __cdecl common_strtod_l(_In_z_ Character const *const string, _Out_opt_ _Deref_post_z_ Character **const end_ptr, _locale_t const locale)
Definition: strtod.cpp:21
long double __cdecl _wcstold_l(wchar_t const *const string, wchar_t **const end_ptr, _locale_t const locale)
Definition: strtod.cpp:157
float __cdecl wcstof(wchar_t const *const string, wchar_t **const end_ptr)
Definition: strtod.cpp:114
long double __cdecl _strtold_l(char const *const string, char **const end_ptr, _locale_t const locale)
Definition: strtod.cpp:98
double __cdecl wcstod(wchar_t const *const string, wchar_t **const end_ptr)
Definition: strtod.cpp:131
float __cdecl _strtof_l(char const *const string, char **const end_ptr, _locale_t const locale)
Definition: strtod.cpp:63
double __cdecl strtod(char const *const string, char **const end_ptr)
Definition: strtod.cpp:72
long double __cdecl wcstold(wchar_t const *const string, wchar_t **const end_ptr)
Definition: strtod.cpp:148
double __cdecl _strtod_l(char const *const string, char **const end_ptr, _locale_t const locale)
Definition: strtod.cpp:80
long double __cdecl strtold(char const *const string, char **const end_ptr)
Definition: strtod.cpp:89
float __cdecl _wcstof_l(wchar_t const *const string, wchar_t **const end_ptr, _locale_t const locale)
Definition: strtod.cpp:122
double __cdecl _wcstod_l(wchar_t const *const string, wchar_t **const end_ptr, _locale_t const locale)
Definition: strtod.cpp:139
Definition: ps.c:97