From 84351186d57a1c99b39cfd641c0668a3746ce445 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sun, 18 Sep 2016 17:26:59 +0000 Subject: [PATCH] [KERNEL32] Implement MB_USEGLYPHCHARS flag for MultiByteToWideChar. Add checks for "Private Use" characters. More correct checks for input parameters. * Fixes 6 tests for kernel32:codepage svn path=/trunk/; revision=72729 --- .../dll/win32/kernel32/winnls/string/nls.c | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/reactos/dll/win32/kernel32/winnls/string/nls.c b/reactos/dll/win32/kernel32/winnls/string/nls.c index 9e76227c705..8a44bf873f7 100644 --- a/reactos/dll/win32/kernel32/winnls/string/nls.c +++ b/reactos/dll/win32/kernel32/winnls/string/nls.c @@ -436,6 +436,7 @@ IntMultiByteToWideCharCP(UINT CodePage, { PCODEPAGE_ENTRY CodePageEntry; PCPTABLEINFO CodePageTable; + PUSHORT MultiByteTable; LPCSTR TempString; INT TempLength; @@ -446,10 +447,22 @@ IntMultiByteToWideCharCP(UINT CodePage, SetLastError(ERROR_INVALID_PARAMETER); return 0; } + CodePageTable = &CodePageEntry->CodePageTable; + /* If MB_USEGLYPHCHARS flag present and glyph table present */ + if ((Flags & MB_USEGLYPHCHARS) && CodePageTable->MultiByteTable[256]) + { + /* Use glyph table */ + MultiByteTable = CodePageTable->MultiByteTable + 256 + 1; + } + else + { + MultiByteTable = CodePageTable->MultiByteTable; + } + /* Different handling for DBCS code pages. */ - if (CodePageTable->MaximumCharacterSize > 1) + if (CodePageTable->DBCSCodePage) { UCHAR Char; USHORT DBCSOffset; @@ -498,7 +511,7 @@ IntMultiByteToWideCharCP(UINT CodePage, if (!DBCSOffset) { - *WideCharString++ = CodePageTable->MultiByteTable[Char]; + *WideCharString++ = MultiByteTable[Char]; continue; } @@ -523,9 +536,12 @@ IntMultiByteToWideCharCP(UINT CodePage, TempLength > 0; TempString++, TempLength--) { - if (CodePageTable->MultiByteTable[(UCHAR)*TempString] == - CodePageTable->UniDefaultChar && - *TempString != CodePageEntry->CodePageTable.DefaultChar) + USHORT WideChar = MultiByteTable[(UCHAR)*TempString]; + + if ((WideChar == CodePageTable->UniDefaultChar && + *TempString != CodePageEntry->CodePageTable.TransUniDefaultChar) || + /* "Private Use" characters */ + (WideChar >= 0xE000 && WideChar <= 0xF8FF)) { SetLastError(ERROR_NO_UNICODE_TRANSLATION); return 0; @@ -542,7 +558,7 @@ IntMultiByteToWideCharCP(UINT CodePage, TempLength > 0; MultiByteString++, TempLength--) { - *WideCharString++ = CodePageTable->MultiByteTable[(UCHAR)*MultiByteString]; + *WideCharString++ = MultiByteTable[(UCHAR)*MultiByteString]; } /* Adjust buffer size. Wine trick ;-) */ @@ -1434,9 +1450,9 @@ MultiByteToWideChar(UINT CodePage, { /* Check the parameters. */ if (MultiByteString == NULL || - MultiByteCount == 0 || - (WideCharString == NULL && WideCharCount > 0) || - (PVOID)MultiByteString == (PVOID)WideCharString) + MultiByteCount == 0 || WideCharCount < 0 || + (WideCharCount && (WideCharString == NULL || + (PVOID)MultiByteString == (PVOID)WideCharString))) { SetLastError(ERROR_INVALID_PARAMETER); return 0;