[KERNEL32] Implement MB_ERR_INVALID_CHARS flag for DBCS codepages

* Fixes 3 tests for kernel32:codepage

svn path=/trunk/; revision=72730
This commit is contained in:
Dmitry Chapyshev 2016-09-18 18:21:30 +00:00
parent 84351186d5
commit d0228d56b4

View file

@ -439,6 +439,7 @@ IntMultiByteToWideCharCP(UINT CodePage,
PUSHORT MultiByteTable; PUSHORT MultiByteTable;
LPCSTR TempString; LPCSTR TempString;
INT TempLength; INT TempLength;
USHORT WideChar;
/* Get code page table. */ /* Get code page table. */
CodePageEntry = IntGetCodePageEntry(CodePage); CodePageEntry = IntGetCodePageEntry(CodePage);
@ -471,8 +472,48 @@ IntMultiByteToWideCharCP(UINT CodePage,
if (Flags & MB_ERR_INVALID_CHARS) if (Flags & MB_ERR_INVALID_CHARS)
{ {
/* FIXME */ TempString = MultiByteString;
DPRINT1("IntMultiByteToWideCharCP: MB_ERR_INVALID_CHARS case not implemented!\n");
while (TempString < MbsEnd)
{
DBCSOffset = CodePageTable->DBCSOffsets[*TempString];
if (DBCSOffset)
{
/* If lead byte is presented, but behind it there is no symbol */
if (((TempString + 1) == MbsEnd) || (*(TempString + 1) == 0))
{
SetLastError(ERROR_NO_UNICODE_TRANSLATION);
return 0;
}
WideChar = CodePageTable->DBCSOffsets[*(TempString + 1) + DBCSOffset];
if (WideChar == CodePageTable->UniDefaultChar &&
MAKEWORD(*(TempString + 1), *TempString) != CodePageTable->TransUniDefaultChar)
{
SetLastError(ERROR_NO_UNICODE_TRANSLATION);
return 0;
}
TempString++;
}
else
{
USHORT WideChar = MultiByteTable[(UCHAR)*TempString];
if ((WideChar == CodePageTable->UniDefaultChar &&
*TempString != CodePageTable->TransUniDefaultChar) ||
/* "Private Use" characters */
(WideChar >= 0xE000 && WideChar <= 0xF8FF))
{
SetLastError(ERROR_NO_UNICODE_TRANSLATION);
return 0;
}
}
TempString++;
}
} }
/* Does caller query for output buffer size? */ /* Does caller query for output buffer size? */
@ -536,10 +577,10 @@ IntMultiByteToWideCharCP(UINT CodePage,
TempLength > 0; TempLength > 0;
TempString++, TempLength--) TempString++, TempLength--)
{ {
USHORT WideChar = MultiByteTable[(UCHAR)*TempString]; WideChar = MultiByteTable[(UCHAR)*TempString];
if ((WideChar == CodePageTable->UniDefaultChar && if ((WideChar == CodePageTable->UniDefaultChar &&
*TempString != CodePageEntry->CodePageTable.TransUniDefaultChar) || *TempString != CodePageTable->TransUniDefaultChar) ||
/* "Private Use" characters */ /* "Private Use" characters */
(WideChar >= 0xE000 && WideChar <= 0xF8FF)) (WideChar >= 0xE000 && WideChar <= 0xF8FF))
{ {