mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 21:32:56 +00:00
[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
This commit is contained in:
parent
dc52ede2f3
commit
84351186d5
1 changed files with 25 additions and 9 deletions
|
@ -436,6 +436,7 @@ IntMultiByteToWideCharCP(UINT CodePage,
|
||||||
{
|
{
|
||||||
PCODEPAGE_ENTRY CodePageEntry;
|
PCODEPAGE_ENTRY CodePageEntry;
|
||||||
PCPTABLEINFO CodePageTable;
|
PCPTABLEINFO CodePageTable;
|
||||||
|
PUSHORT MultiByteTable;
|
||||||
LPCSTR TempString;
|
LPCSTR TempString;
|
||||||
INT TempLength;
|
INT TempLength;
|
||||||
|
|
||||||
|
@ -446,10 +447,22 @@ IntMultiByteToWideCharCP(UINT CodePage,
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CodePageTable = &CodePageEntry->CodePageTable;
|
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. */
|
/* Different handling for DBCS code pages. */
|
||||||
if (CodePageTable->MaximumCharacterSize > 1)
|
if (CodePageTable->DBCSCodePage)
|
||||||
{
|
{
|
||||||
UCHAR Char;
|
UCHAR Char;
|
||||||
USHORT DBCSOffset;
|
USHORT DBCSOffset;
|
||||||
|
@ -498,7 +511,7 @@ IntMultiByteToWideCharCP(UINT CodePage,
|
||||||
|
|
||||||
if (!DBCSOffset)
|
if (!DBCSOffset)
|
||||||
{
|
{
|
||||||
*WideCharString++ = CodePageTable->MultiByteTable[Char];
|
*WideCharString++ = MultiByteTable[Char];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -523,9 +536,12 @@ IntMultiByteToWideCharCP(UINT CodePage,
|
||||||
TempLength > 0;
|
TempLength > 0;
|
||||||
TempString++, TempLength--)
|
TempString++, TempLength--)
|
||||||
{
|
{
|
||||||
if (CodePageTable->MultiByteTable[(UCHAR)*TempString] ==
|
USHORT WideChar = MultiByteTable[(UCHAR)*TempString];
|
||||||
CodePageTable->UniDefaultChar &&
|
|
||||||
*TempString != CodePageEntry->CodePageTable.DefaultChar)
|
if ((WideChar == CodePageTable->UniDefaultChar &&
|
||||||
|
*TempString != CodePageEntry->CodePageTable.TransUniDefaultChar) ||
|
||||||
|
/* "Private Use" characters */
|
||||||
|
(WideChar >= 0xE000 && WideChar <= 0xF8FF))
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_NO_UNICODE_TRANSLATION);
|
SetLastError(ERROR_NO_UNICODE_TRANSLATION);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -542,7 +558,7 @@ IntMultiByteToWideCharCP(UINT CodePage,
|
||||||
TempLength > 0;
|
TempLength > 0;
|
||||||
MultiByteString++, TempLength--)
|
MultiByteString++, TempLength--)
|
||||||
{
|
{
|
||||||
*WideCharString++ = CodePageTable->MultiByteTable[(UCHAR)*MultiByteString];
|
*WideCharString++ = MultiByteTable[(UCHAR)*MultiByteString];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Adjust buffer size. Wine trick ;-) */
|
/* Adjust buffer size. Wine trick ;-) */
|
||||||
|
@ -1434,9 +1450,9 @@ MultiByteToWideChar(UINT CodePage,
|
||||||
{
|
{
|
||||||
/* Check the parameters. */
|
/* Check the parameters. */
|
||||||
if (MultiByteString == NULL ||
|
if (MultiByteString == NULL ||
|
||||||
MultiByteCount == 0 ||
|
MultiByteCount == 0 || WideCharCount < 0 ||
|
||||||
(WideCharString == NULL && WideCharCount > 0) ||
|
(WideCharCount && (WideCharString == NULL ||
|
||||||
(PVOID)MultiByteString == (PVOID)WideCharString)
|
(PVOID)MultiByteString == (PVOID)WideCharString)))
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue