mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[RTL] Properly implement RtlUnicodeToOemN
CORE-17571
This commit is contained in:
parent
4e0ce779d7
commit
1b08836338
1 changed files with 25 additions and 47 deletions
|
@ -634,9 +634,10 @@ RtlUnicodeToMultiByteSize(OUT PULONG MbSize,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
NTSTATUS NTAPI
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
RtlUnicodeToOemN(OUT PCHAR OemString,
|
RtlUnicodeToOemN(OUT PCHAR OemString,
|
||||||
IN ULONG OemSize,
|
IN ULONG OemSize,
|
||||||
OUT PULONG ResultSize OPTIONAL,
|
OUT PULONG ResultSize OPTIONAL,
|
||||||
|
@ -644,68 +645,45 @@ RtlUnicodeToOemN(OUT PCHAR OemString,
|
||||||
IN ULONG UnicodeSize)
|
IN ULONG UnicodeSize)
|
||||||
{
|
{
|
||||||
ULONG Size = 0;
|
ULONG Size = 0;
|
||||||
ULONG i;
|
|
||||||
|
|
||||||
PAGED_CODE_RTL();
|
PAGED_CODE_RTL();
|
||||||
|
|
||||||
|
/* Bytes -> chars */
|
||||||
|
UnicodeSize /= sizeof(WCHAR);
|
||||||
|
|
||||||
if (!NlsMbOemCodePageTag)
|
if (!NlsMbOemCodePageTag)
|
||||||
{
|
{
|
||||||
/* single-byte code page */
|
while (OemSize && UnicodeSize)
|
||||||
if (UnicodeSize > (OemSize * sizeof(WCHAR)))
|
|
||||||
Size = OemSize;
|
|
||||||
else
|
|
||||||
Size = UnicodeSize / sizeof(WCHAR);
|
|
||||||
|
|
||||||
if (ResultSize)
|
|
||||||
*ResultSize = Size;
|
|
||||||
|
|
||||||
for (i = 0; i < Size; i++)
|
|
||||||
{
|
{
|
||||||
*OemString = NlsUnicodeToOemTable[*UnicodeString];
|
OemString[Size] = NlsUnicodeToOemTable[*UnicodeString++];
|
||||||
OemString++;
|
Size++;
|
||||||
UnicodeString++;
|
OemSize--;
|
||||||
|
UnicodeSize--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* multi-byte code page */
|
while (OemSize && UnicodeSize)
|
||||||
/* FIXME */
|
|
||||||
|
|
||||||
USHORT WideChar;
|
|
||||||
USHORT OemChar;
|
|
||||||
|
|
||||||
for (i = OemSize, Size = UnicodeSize / sizeof(WCHAR); i && Size; i--, Size--)
|
|
||||||
{
|
{
|
||||||
WideChar = *UnicodeString++;
|
USHORT OemChar = NlsUnicodeToMbOemTable[*UnicodeString++];
|
||||||
|
|
||||||
if (WideChar < 0x80)
|
if (HIBYTE(OemChar))
|
||||||
{
|
{
|
||||||
*OemString++ = LOBYTE(WideChar);
|
if (OemSize < 2)
|
||||||
continue;
|
break;
|
||||||
|
OemString[Size++] = HIBYTE(OemChar);
|
||||||
|
OemSize--;
|
||||||
}
|
}
|
||||||
|
OemString[Size++] = LOBYTE(OemChar);
|
||||||
OemChar = NlsUnicodeToMbOemTable[WideChar];
|
OemSize--;
|
||||||
|
UnicodeSize--;
|
||||||
if (!HIBYTE(OemChar))
|
|
||||||
{
|
|
||||||
*OemString++ = LOBYTE(OemChar);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 2)
|
|
||||||
{
|
|
||||||
*OemString++ = HIBYTE(OemChar);
|
|
||||||
*OemString++ = LOBYTE(OemChar);
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
else break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ResultSize)
|
|
||||||
*ResultSize = OemSize - i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
if (ResultSize)
|
||||||
|
*ResultSize = Size;
|
||||||
|
|
||||||
|
return UnicodeSize ? STATUS_BUFFER_OVERFLOW : STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue