=?UTF-8?Q?Bernhard=20=C3=9Cbelacker=20?=: msvcr120: Implement strtof and _strtof_l.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Feb 19 08:56:21 CST 2016


Module: wine
Branch: master
Commit: 78716aebf8c3ff1b4657189b3e01ae7452fb414d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=78716aebf8c3ff1b4657189b3e01ae7452fb414d

Author: Bernhard Übelacker <bernhardu at vr-web.de>
Date:   Thu Feb 18 16:10:00 2016 +0100

msvcr120: Implement strtof and _strtof_l.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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 6ac93d3..6d3e4f6 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 5f6533c..2305026 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 aa78c4f..c37d8f7 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>
@@ -83,6 +85,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)
 {
@@ -105,6 +109,8 @@ static BOOL init(void)
     p__GetConcurrency = (void*)GetProcAddress(module,"?_GetConcurrency at 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;
 }
 
@@ -321,6 +327,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;
@@ -330,4 +378,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 f938eff..682f2c7 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 1946b27..85f09ad 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 801cb99..2a6906f 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




More information about the wine-cvs mailing list