Module: wine Branch: stable Commit: 119bdb8343d20cd64e9cda2e1f9318a8085d4855 URL: http://source.winehq.org/git/wine.git/?a=commit;h=119bdb8343d20cd64e9cda2e1f...
Author: Bernhard Übelacker bernhardu@vr-web.de Date: Thu Feb 18 16:10:00 2016 +0100
msvcr120: Implement strtof and _strtof_l.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 78716aebf8c3ff1b4657189b3e01ae7452fb414d) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
.../api-ms-win-crt-convert-l1-1-0.spec | 4 +- dlls/msvcr120/msvcr120.spec | 4 +- dlls/msvcr120/tests/msvcr120.c | 49 ++++++++++++++++++++++ dlls/msvcr120_app/msvcr120_app.spec | 4 +- dlls/msvcrt/string.c | 16 +++++++ dlls/ucrtbase/ucrtbase.spec | 4 +- 6 files changed, 73 insertions(+), 8 deletions(-)
diff --git a/dlls/api-ms-win-crt-convert-l1-1-0/api-ms-win-crt-convert-l1-1-0.spec b/dlls/api-ms-win-crt-convert-l1-1-0/api-ms-win-crt-convert-l1-1-0.spec index 40b131a..f926ba8 100644 --- a/dlls/api-ms-win-crt-convert-l1-1-0/api-ms-win-crt-convert-l1-1-0.spec +++ b/dlls/api-ms-win-crt-convert-l1-1-0/api-ms-win-crt-convert-l1-1-0.spec @@ -30,7 +30,7 @@ @ cdecl _ltow(long ptr long) ucrtbase._ltow @ cdecl _ltow_s(long ptr long long) ucrtbase._ltow_s @ cdecl _strtod_l(str ptr ptr) ucrtbase._strtod_l -@ stub _strtof_l +@ cdecl _strtof_l(str ptr ptr) ucrtbase._strtof_l @ cdecl -ret64 _strtoi64(str ptr long) ucrtbase._strtoi64 @ cdecl -ret64 _strtoi64_l(str ptr long ptr) ucrtbase._strtoi64_l @ stub _strtoimax_l @@ -93,7 +93,7 @@ @ cdecl mbstowcs_s(ptr ptr long str long) ucrtbase.mbstowcs_s @ cdecl mbtowc(ptr str long) ucrtbase.mbtowc @ cdecl strtod(str ptr) ucrtbase.strtod -@ stub strtof +@ cdecl strtof(str ptr) ucrtbase.strtof @ stub strtoimax @ cdecl strtol(str ptr long) ucrtbase.strtol @ stub strtold diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 5f69b0d..4c0e95a 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1731,7 +1731,7 @@ @ cdecl _strtime(ptr) MSVCRT__strtime @ cdecl _strtime_s(ptr long) @ cdecl _strtod_l(str ptr ptr) MSVCRT_strtod_l -@ stub _strtof_l +@ cdecl _strtof_l(str ptr ptr) MSVCRT__strtof_l @ cdecl -ret64 _strtoi64(str ptr long) MSVCRT_strtoi64 @ cdecl -ret64 _strtoi64_l(str ptr long ptr) MSVCRT_strtoi64_l @ stub _strtoimax_l @@ -2386,7 +2386,7 @@ @ cdecl strspn(str str) ntdll.strspn @ cdecl strstr(str str) MSVCRT_strstr @ cdecl strtod(str ptr) MSVCRT_strtod -@ stub strtof +@ cdecl strtof(str ptr) MSVCRT_strtof @ stub strtoimax @ cdecl strtok(str str) MSVCRT_strtok @ cdecl strtok_s(ptr str ptr) MSVCRT_strtok_s diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c index d6936f5..34ad1da 100644 --- a/dlls/msvcr120/tests/msvcr120.c +++ b/dlls/msvcr120/tests/msvcr120.c @@ -21,6 +21,8 @@ #include <stdlib.h> #include <wchar.h> #include <stdio.h> +#include <float.h> +#include <limits.h>
#include <windef.h> #include <winbase.h> @@ -68,6 +70,8 @@ static wchar_t** (CDECL *p____lc_locale_name_func)(void); static unsigned int (CDECL *p__GetConcurrency)(void); static void* (CDECL *p__W_Gettnames)(void); static void (CDECL *p_free)(void*); +static float (CDECL *p_strtof)(const char *, char **); +static int (CDECL *p__finite)(double);
static BOOL init(void) { @@ -89,6 +93,8 @@ static BOOL init(void) p__GetConcurrency = (void*)GetProcAddress(module,"?_GetConcurrency@details@Concurrency@@YAIXZ"); p__W_Gettnames = (void*)GetProcAddress(module, "_W_Gettnames"); p_free = (void*)GetProcAddress(module, "free"); + p_strtof = (void*)GetProcAddress(module, "strtof"); + p__finite = (void*)GetProcAddress(module, "_finite"); return TRUE; }
@@ -285,6 +291,48 @@ static void test__W_Gettnames(void) p_setlocale(LC_ALL, "C"); }
+static void test__strtof(void) +{ + const char float1[] = "12.0"; + const char float2[] = "3.402823466e+38"; /* FLT_MAX */ + const char float3[] = "-3.402823466e+38"; + const char float4[] = "1.7976931348623158e+308"; /* DBL_MAX */ + + char *end; + float f; + + f = p_strtof(float1, &end); + ok(f == 12.0, "f = %lf\n", f); + ok(end == float1+4, "incorrect end (%d)\n", (int)(end-float1)); + + f = p_strtof(float2, &end); + ok(f == FLT_MAX, "f = %lf\n", f); + ok(end == float2+15, "incorrect end (%d)\n", (int)(end-float2)); + + f = p_strtof(float3, &end); + ok(f == -FLT_MAX, "f = %lf\n", f); + ok(end == float3+16, "incorrect end (%d)\n", (int)(end-float3)); + + f = p_strtof(float4, &end); + ok(!p__finite(f), "f = %lf\n", f); + ok(end == float4+23, "incorrect end (%d)\n", (int)(end-float4)); + + f = p_strtof("inf", NULL); + ok(f == 0, "f = %lf\n", f); + + f = p_strtof("INF", NULL); + ok(f == 0, "f = %lf\n", f); + + f = p_strtof("1.#inf", NULL); + ok(f == 1, "f = %lf\n", f); + + f = p_strtof("INFINITY", NULL); + ok(f == 0, "f = %lf\n", f); + + f = p_strtof("0x12", NULL); + ok(f == 0, "f = %lf\n", f); +} + START_TEST(msvcr120) { if (!init()) return; @@ -293,4 +341,5 @@ START_TEST(msvcr120) test____lc_locale_name_func(); test__GetConcurrency(); test__W_Gettnames(); + test__strtof(); } diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 9aa0978..d7979d6 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -1442,7 +1442,7 @@ @ cdecl _strtime(ptr) msvcr120._strtime @ cdecl _strtime_s(ptr long) msvcr120._strtime_s @ cdecl _strtod_l(str ptr ptr) msvcr120._strtod_l -@ stub _strtof_l +@ cdecl _strtof_l(str ptr ptr) msvcr120._strtof_l @ cdecl -ret64 _strtoi64(str ptr long) msvcr120._strtoi64 @ cdecl -ret64 _strtoi64_l(str ptr long ptr) msvcr120._strtoi64_l @ stub _strtoimax_l @@ -2049,7 +2049,7 @@ @ cdecl strspn(str str) msvcr120.strspn @ cdecl strstr(str str) msvcr120.strstr @ cdecl strtod(str ptr) msvcr120.strtod -@ stub strtof +@ cdecl strtof(str ptr) msvcr120.strtof @ stub strtoimax @ cdecl strtok(str str) msvcr120.strtok @ cdecl strtok_s(ptr str ptr) msvcr120.strtok_s diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c index dde95ac..15a2f97 100644 --- a/dlls/msvcrt/string.c +++ b/dlls/msvcrt/string.c @@ -497,6 +497,22 @@ double CDECL MSVCRT_strtod( const char *str, char **end ) }
/********************************************************************* + * strtof_l (MSVCR120.@) + */ +float CDECL MSVCRT__strtof_l( const char *str, char **end, MSVCRT__locale_t locale ) +{ + return MSVCRT_strtod_l(str, end, locale); +} + +/********************************************************************* + * strtof (MSVCR120.@) + */ +float CDECL MSVCRT_strtof( const char *str, char **end ) +{ + return MSVCRT__strtof_l(str, end, NULL); +} + +/********************************************************************* * atof (MSVCRT.@) */ double CDECL MSVCRT_atof( const char *str ) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 5bad345..bbae921 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -1949,7 +1949,7 @@ @ cdecl _strtime(ptr) MSVCRT__strtime @ cdecl _strtime_s(ptr long) @ cdecl _strtod_l(str ptr ptr) MSVCRT_strtod_l -@ stub _strtof_l +@ cdecl _strtof_l(str ptr ptr) MSVCRT__strtof_l @ cdecl -ret64 _strtoi64(str ptr long) MSVCRT_strtoi64 @ cdecl -ret64 _strtoi64_l(str ptr long ptr) MSVCRT_strtoi64_l @ stub _strtoimax_l @@ -2516,7 +2516,7 @@ @ cdecl strspn(str str) ntdll.strspn @ cdecl strstr(str str) MSVCRT_strstr @ cdecl strtod(str ptr) MSVCRT_strtod -@ stub strtof +@ cdecl strtof(str ptr) MSVCRT_strtof @ stub strtoimax @ cdecl strtok(str str) MSVCRT_strtok @ cdecl strtok_s(ptr str ptr) MSVCRT_strtok_s