Piotr Caban : msvcrt: Added wctob implementation.
Alexandre Julliard
julliard at winehq.org
Wed Apr 6 11:36:35 CDT 2011
Module: wine
Branch: master
Commit: f989011be243ab670462fb7a4e1e5a09a8ea3c76
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f989011be243ab670462fb7a4e1e5a09a8ea3c76
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Apr 5 23:47:22 2011 +0200
msvcrt: Added wctob implementation.
---
dlls/msvcr100/msvcr100.spec | 2 +-
dlls/msvcr80/msvcr80.spec | 2 +-
dlls/msvcr90/msvcr90.spec | 2 +-
dlls/msvcrt/msvcrt.spec | 2 +-
dlls/msvcrt/tests/string.c | 39 +++++++++++++++++++++++++++++++++++++++
dlls/msvcrt/wcs.c | 17 ++++++++++++++++-
6 files changed, 59 insertions(+), 5 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 88655cf..cf5b3e1 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1659,7 +1659,7 @@
@ cdecl wcstombs_s(ptr ptr long wstr long) msvcrt.wcstombs_s
@ cdecl wcstoul(wstr ptr long) msvcrt.wcstoul
@ stub wcsxfrm
-@ stub wctob
+@ cdecl wctob(long) msvcrt.wctob
@ cdecl wctomb(ptr long) msvcrt.wctomb
@ stub wctomb_s
@ stub wmemcpy_s
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 8dc251b..e2aec87 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -1513,7 +1513,7 @@
@ cdecl wcstombs_s(ptr ptr long wstr long) msvcrt.wcstombs_s
@ cdecl wcstoul(wstr ptr long) msvcrt.wcstoul
@ stub wcsxfrm
-@ stub wctob
+@ cdecl wctob(long) msvcrt.wctob
@ cdecl wctomb(ptr long) msvcrt.wctomb
@ stub wctomb_s
@ varargs wprintf(wstr) msvcrt.wprintf
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 94810e5..36c7bdb 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -1497,7 +1497,7 @@
@ cdecl wcstombs_s(ptr ptr long wstr long) msvcrt.wcstombs_s
@ cdecl wcstoul(wstr ptr long) msvcrt.wcstoul
@ stub wcsxfrm
-@ stub wctob
+@ cdecl wctob(long) msvcrt.wctob
@ cdecl wctomb(ptr long) msvcrt.wctomb
@ stub wctomb_s
@ varargs wprintf(wstr) msvcrt.wprintf
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index ef88e71..9777e32 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1468,7 +1468,7 @@
@ cdecl wcstombs_s(ptr ptr long wstr long) MSVCRT_wcstombs_s
@ cdecl wcstoul(wstr ptr long) ntdll.wcstoul
@ stub wcsxfrm #(ptr wstr long) MSVCRT_wcsxfrm
-# stub wctob
+@ cdecl wctob(long) MSVCRT_wctob
@ cdecl wctomb(ptr long) MSVCRT_wctomb
# stub wctomb_s
@ varargs wprintf(wstr) MSVCRT_wprintf
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 6aba883..8b0494b 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -78,6 +78,7 @@ static _invalid_parameter_handler (__cdecl *p_set_invalid_parameter_handler)(_in
static int (__cdecl *p_wcslwr_s)(wchar_t*,size_t);
static errno_t (__cdecl *p_mbsupr_s)(unsigned char *str, size_t numberOfElements);
static errno_t (__cdecl *p_mbslwr_s)(unsigned char *str, size_t numberOfElements);
+static int (__cdecl *p_wctob)(wint_t);
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(hMsvcrt,y)
#define SET(x,y) SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y)
@@ -1913,6 +1914,40 @@ static void test__ultoa_s(void)
buffer);
}
+static void test_wctob(void)
+{
+ int ret;
+
+ if(!p_wctob || !setlocale(LC_ALL, "chinese-traditional")) {
+ win_skip("Skipping wctob tests\n");
+ return;
+ }
+
+ ret = p_wctob(0x8141);
+ ok(ret == EOF, "ret = %x\n", ret);
+
+ ret = p_wctob(0x81);
+ ok(ret == EOF, "ret = %x\n", ret);
+
+ ret = p_wctob(0xe0);
+ ok(ret == 0x61, "ret = %x\n", ret);
+
+ _setmbcp(1250);
+ ret = p_wctob(0x81);
+ /* wctob should not be affected by _setmbcp */
+ todo_wine ok(ret == EOF, "ret = %x\n", ret);
+
+ setlocale(LC_ALL, "C");
+ ret = p_wctob(0x8141);
+ ok(ret == EOF, "ret = %x\n", ret);
+
+ ret = p_wctob(0x81);
+ ok(ret == (int)(char)0x81, "ret = %x\n", ret);
+
+ ret = p_wctob(0xe0);
+ ok(ret == (int)(char)0xe0, "ret = %x\n", ret);
+}
+
START_TEST(string)
{
char mem[100];
@@ -1947,6 +1982,7 @@ START_TEST(string)
p_wcslwr_s = (void*)GetProcAddress(hMsvcrt, "_wcslwr_s");
p_mbsupr_s = (void*)GetProcAddress(hMsvcrt, "_mbsupr_s");
p_mbslwr_s = (void*)GetProcAddress(hMsvcrt, "_mbslwr_s");
+ p_wctob = (void*)GetProcAddress(hMsvcrt, "wctob");
/* MSVCRT memcpy behaves like memmove for overlapping moves,
MFC42 CString::Insert seems to rely on that behaviour */
@@ -1989,4 +2025,7 @@ START_TEST(string)
test__wcslwr_s();
test__mbsupr_s();
test__mbslwr_s();
+
+ /* This test is changing locale */
+ test_wctob();
}
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index fc77656..65b2eae 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -1501,11 +1501,26 @@ MSVCRT_wchar_t * CDECL MSVCRT_wcstok( MSVCRT_wchar_t *str, const MSVCRT_wchar_t
}
/*********************************************************************
+ * wctob (MSVCRT.@)
+ */
+INT CDECL MSVCRT_wctob( MSVCRT_wint_t wchar )
+{
+ MSVCRT__locale_t locale = get_locale();
+ char out;
+ BOOL error;
+
+ if(WideCharToMultiByte( locale->locinfo->lc_codepage, 0, &wchar, 1, &out, 1, NULL, &error ) && !error)
+ return (INT)out;
+ return MSVCRT_EOF;
+}
+
+/*********************************************************************
* wctomb (MSVCRT.@)
*/
INT CDECL MSVCRT_wctomb( char *dst, MSVCRT_wchar_t ch )
{
- return WideCharToMultiByte( CP_ACP, 0, &ch, 1, dst, 6, NULL, NULL );
+ MSVCRT__locale_t locale = get_locale();
+ return WideCharToMultiByte( locale->locinfo->lc_codepage, 0, &ch, 1, dst, 6, NULL, NULL );
}
/*********************************************************************
More information about the wine-cvs
mailing list