Module: wine Branch: stable Commit: 76172bf91172ca59296c4b72ef478929a4d3547d URL: https://source.winehq.org/git/wine.git/?a=commit;h=76172bf91172ca59296c4b72e...
Author: Piotr Caban piotr@codeweavers.com Date: Fri Apr 14 18:21:21 2017 +0200
msvcr120: Add wctype implementation.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 42ccd8d9ecb386bb9da311c1faa5c14a12d26de3) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
.../api-ms-win-crt-string-l1-1-0.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120/tests/msvcr120.c | 32 ++++++++++++++++++++++ dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcrt/ctype.c | 30 ++++++++++++++++++++ dlls/ucrtbase/ucrtbase.spec | 2 +- 6 files changed, 66 insertions(+), 4 deletions(-)
diff --git a/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec b/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec index 0095feb..5e8e7b4 100644 --- a/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec +++ b/dlls/api-ms-win-crt-string-l1-1-0/api-ms-win-crt-string-l1-1-0.spec @@ -173,6 +173,6 @@ @ cdecl wcstok(wstr wstr) ucrtbase.wcstok @ cdecl wcstok_s(ptr wstr ptr) ucrtbase.wcstok_s @ cdecl wcsxfrm(ptr wstr long) ucrtbase.wcsxfrm -@ stub wctype +@ cdecl wctype(str) ucrtbase.wctype @ cdecl wmemcpy_s(ptr long ptr long) ucrtbase.wmemcpy_s @ cdecl wmemmove_s(ptr long ptr long) ucrtbase.wmemmove_s diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index a15db46..8bc3467 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -2487,7 +2487,7 @@ @ cdecl wctomb(ptr long) MSVCRT_wctomb @ cdecl wctomb_s(ptr ptr long long) MSVCRT_wctomb_s @ stub wctrans -@ stub wctype +@ cdecl wctype(str) @ cdecl wmemcpy_s(ptr long ptr long) @ cdecl wmemmove_s(ptr long ptr long) @ varargs wprintf(wstr) MSVCRT_wprintf diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c index 13f3672..de0ccc4 100644 --- a/dlls/msvcr120/tests/msvcr120.c +++ b/dlls/msvcr120/tests/msvcr120.c @@ -182,6 +182,7 @@ static int (CDECL *p_fegetenv)(fenv_t*); 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*);
/* make sure we use the correct errno */ #undef errno @@ -236,6 +237,7 @@ static BOOL init(void) p_errno = (void*)GetProcAddress(module, "_errno"); p_wcreate_locale = (void*)GetProcAddress(module, "_wcreate_locale"); p_free_locale = (void*)GetProcAddress(module, "_free_locale"); + SET(p_wctype, "wctype"); SET(p_fegetenv, "fegetenv"); SET(p__clearfp, "_clearfp"); if(sizeof(void*) == 8) { /* 64-bit initialization */ @@ -880,6 +882,35 @@ static void test__Condition_variable(void) CloseHandle(thread_initialized); }
+static void test_wctype(void) +{ + static const struct { + const char *name; + unsigned short mask; + } properties[] = { + { "alnum", 0x107 }, + { "alpha", 0x103 }, + { "cntrl", 0x020 }, + { "digit", 0x004 }, + { "graph", 0x117 }, + { "lower", 0x002 }, + { "print", 0x157 }, + { "punct", 0x010 }, + { "space", 0x008 }, + { "upper", 0x001 }, + { "xdigit", 0x080 }, + { "ALNUM", 0x000 }, + { "Alnum", 0x000 }, + { "", 0x000 } + }; + int i, ret; + + for(i=0; i<sizeof(properties)/sizeof(properties[0]); i++) { + ret = p_wctype(properties[i].name); + ok(properties[i].mask == ret, "%d - Expected %x, got %x\n", i, properties[i].mask, ret); + } +} + START_TEST(msvcr120) { if (!init()) return; @@ -896,4 +927,5 @@ START_TEST(msvcr120) test_fegetenv(); test__wcreate_locale(); test__Condition_variable(); + test_wctype(); } diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 1226fa5..4cf772d 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -2149,7 +2149,7 @@ @ cdecl wctomb(ptr long) msvcr120.wctomb @ cdecl wctomb_s(ptr ptr long long) msvcr120.wctomb_s @ stub wctrans -@ stub wctype +@ cdecl wctype(str) msvcr120.wctype @ cdecl wmemcpy_s(ptr long ptr long) msvcr120.wmemcpy_s @ cdecl wmemmove_s(ptr long ptr long) msvcr120.wmemmove_s @ varargs wprintf(wstr) msvcr120.wprintf diff --git a/dlls/msvcrt/ctype.c b/dlls/msvcrt/ctype.c index 8b9d14c..a88df58 100644 --- a/dlls/msvcrt/ctype.c +++ b/dlls/msvcrt/ctype.c @@ -452,3 +452,33 @@ int CDECL MSVCRT__tolower(int c) { return c + 0x20; /* sic */ } + +/********************************************************************* + * wctype (MSVCR120.@) + */ +unsigned short __cdecl wctype(const char *property) +{ + static const struct { + const char *name; + unsigned short mask; + } properties[] = { + { "alnum", MSVCRT__DIGIT|MSVCRT__ALPHA }, + { "alpha", MSVCRT__ALPHA }, + { "cntrl", MSVCRT__CONTROL }, + { "digit", MSVCRT__DIGIT }, + { "graph", MSVCRT__DIGIT|MSVCRT__PUNCT|MSVCRT__ALPHA }, + { "lower", MSVCRT__LOWER }, + { "print", MSVCRT__DIGIT|MSVCRT__PUNCT|MSVCRT__BLANK|MSVCRT__ALPHA }, + { "punct", MSVCRT__PUNCT }, + { "space", MSVCRT__SPACE }, + { "upper", MSVCRT__UPPER }, + { "xdigit", MSVCRT__HEX } + }; + unsigned int i; + + for(i=0; i<sizeof(properties)/sizeof(properties[0]); i++) + if(!strcmp(property, properties[i].name)) + return properties[i].mask; + + return 0; +} diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index a6b2043..ee95ee4 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -2594,6 +2594,6 @@ @ cdecl wctomb(ptr long) MSVCRT_wctomb @ cdecl wctomb_s(ptr ptr long long) MSVCRT_wctomb_s @ stub wctrans -@ stub wctype +@ cdecl wctype(str) @ cdecl wmemcpy_s(ptr long ptr long) @ cdecl wmemmove_s(ptr long ptr long)