[PATCH] msvcr120: Added vsscanf() and vswscanf()

Nikolay Sivov nsivov at codeweavers.com
Sat Sep 23 12:16:45 CDT 2017


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---

For https://bugs.winehq.org/show_bug.cgi?id=43324

 dlls/msvcr120/msvcr120.spec         |  4 ++--
 dlls/msvcr120/tests/msvcr120.c      | 26 ++++++++++++++++++++++++++
 dlls/msvcr120_app/msvcr120_app.spec |  4 ++--
 dlls/msvcrt/scanf.c                 | 20 ++++++++++++++++++++
 4 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index c091bd152d..ad25b1793b 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -2436,10 +2436,10 @@
 @ stub vscanf_s
 @ cdecl vsprintf(ptr str ptr) MSVCRT_vsprintf
 @ cdecl vsprintf_s(ptr long str ptr) MSVCRT_vsprintf_s
-@ stub vsscanf
+@ cdecl vsscanf(ptr str ptr) MSVCRT_vsscanf
 @ stub vsscanf_s
 @ cdecl vswprintf_s(ptr long wstr ptr) MSVCRT_vswprintf_s
-@ stub vswscanf
+@ cdecl vswscanf(ptr wstr ptr) MSVCRT_vswscanf
 @ stub vswscanf_s
 @ cdecl vwprintf(wstr ptr) MSVCRT_vwprintf
 @ cdecl vwprintf_s(wstr ptr) MSVCRT_vwprintf_s
diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c
index de0ccc480e..7a6e696a77 100644
--- a/dlls/msvcr120/tests/msvcr120.c
+++ b/dlls/msvcr120/tests/msvcr120.c
@@ -183,6 +183,7 @@ static int (CDECL *p__clearfp)(void);
 static _locale_t (__cdecl *p_wcreate_locale)(int, const wchar_t *);
 static void (__cdecl *p_free_locale)(_locale_t);
 static unsigned short (__cdecl *p_wctype)(const char*);
+static int (__cdecl *p_vsscanf)(const char*, const char *, __ms_va_list valist);
 
 /* make sure we use the correct errno */
 #undef errno
@@ -240,6 +241,7 @@ static BOOL init(void)
     SET(p_wctype, "wctype");
     SET(p_fegetenv, "fegetenv");
     SET(p__clearfp, "_clearfp");
+    SET(p_vsscanf, "vsscanf");
     if(sizeof(void*) == 8) { /* 64-bit initialization */
         SET(p_critical_section_ctor,
                 "??0critical_section at Concurrency@@QEAA at XZ");
@@ -911,6 +913,29 @@ static void test_wctype(void)
     }
 }
 
+static int __cdecl _vsscanf_wrapper(const char *buffer, const char *format, ...)
+{
+    int ret;
+    __ms_va_list valist;
+    __ms_va_start(valist, format);
+    ret = p_vsscanf(buffer, format, valist);
+    __ms_va_end(valist);
+    return ret;
+}
+
+static void test_vsscanf(void)
+{
+    static const char *fmt = "%d";
+    char buff[16];
+    int ret, v;
+
+    v = 0;
+    strcpy(buff, "10");
+    ret = _vsscanf_wrapper(buff, fmt, &v);
+    ok(ret == 1, "Unexpected ret %d.\n", ret);
+    ok(v == 10, "got %d.\n", v);
+}
+
 START_TEST(msvcr120)
 {
     if (!init()) return;
@@ -928,4 +953,5 @@ START_TEST(msvcr120)
     test__wcreate_locale();
     test__Condition_variable();
     test_wctype();
+    test_vsscanf();
 }
diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec
index 01932825b2..b37ab32e64 100644
--- a/dlls/msvcr120_app/msvcr120_app.spec
+++ b/dlls/msvcr120_app/msvcr120_app.spec
@@ -2098,10 +2098,10 @@
 @ stub vscanf_s
 @ cdecl vsprintf(ptr str ptr) msvcr120.vsprintf
 @ cdecl vsprintf_s(ptr long str ptr) msvcr120.vsprintf_s
-@ stub vsscanf
+@ cdecl vsscanf(ptr str ptr) msvcr120.vsscanf
 @ stub vsscanf_s
 @ cdecl vswprintf_s(ptr long wstr ptr) msvcr120.vswprintf_s
-@ stub vswscanf
+@ cdecl vswscanf(ptr wstr ptr) msvcr120.vswscanf
 @ stub vswscanf_s
 @ cdecl vwprintf(wstr ptr) msvcr120.vwprintf
 @ cdecl vwprintf_s(wstr ptr) msvcr120.vwprintf_s
diff --git a/dlls/msvcrt/scanf.c b/dlls/msvcrt/scanf.c
index fd776a640e..63ff8b17f9 100644
--- a/dlls/msvcrt/scanf.c
+++ b/dlls/msvcrt/scanf.c
@@ -795,3 +795,23 @@ int CDECL MSVCRT__snwscanf_s_l(MSVCRT_wchar_t *input, MSVCRT_size_t length,
     __ms_va_end(valist);
     return res;
 }
+
+/*********************************************************************
+ *		vsscanf (MSVCRT120.@)
+ */
+int CDECL MSVCRT_vsscanf(const char *buffer, const char *format, __ms_va_list valist)
+{
+    if (!MSVCRT_CHECK_PMT(buffer != NULL && format != NULL)) return -1;
+
+    return MSVCRT_vsscanf_l(buffer, format, NULL, valist);
+}
+
+/*********************************************************************
+ *		vswscanf (MSVCRT120.@)
+ */
+int CDECL MSVCRT_vswscanf(const MSVCRT_wchar_t *buffer, const MSVCRT_wchar_t *format, __ms_va_list valist)
+{
+    if (!MSVCRT_CHECK_PMT(buffer != NULL && format != NULL)) return -1;
+
+    return MSVCRT_vswscanf_l(buffer, format, NULL, valist);
+}
-- 
2.14.1




More information about the wine-patches mailing list