mirror of
https://github.com/reactos/reactos.git
synced 2024-08-08 20:28:09 +00:00
[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:
parent
84351186d5
commit
d0228d56b4
|
@ -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))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue