Reactos
at listview 164 lines 4.2 kB view raw
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 15#include <corecrt_internal_strtox.h> 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{}; 37 SLD_STATUS const status = __crt_strtox::parse_floating_point( 38 locale_update.GetLocaleT(), 39 __crt_strtox::make_c_string_character_source(string, end_ptr), 40 &result); 41 42 if (status == SLD_OVERFLOW || status == SLD_UNDERFLOW) 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}