From: Dmitry Chapyshev Date: Sun, 4 Sep 2016 22:57:44 +0000 (+0000) Subject: [RTL] X-Git-Tag: backups/sndblst@72664~80 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=468c2342d633c0a7169a6e21f3938799f5b4dcc5 [RTL] - Implement RtlIsValidOemCharacter function * Fixes all new tests for this function svn path=/trunk/; revision=72580 --- diff --git a/reactos/sdk/lib/rtl/nls.c b/reactos/sdk/lib/rtl/nls.c index 30dfd07a727..0704fae8978 100644 --- a/reactos/sdk/lib/rtl/nls.c +++ b/reactos/sdk/lib/rtl/nls.c @@ -29,7 +29,7 @@ PUSHORT NlsLeadByteInfo = NULL; /* exported */ USHORT NlsOemCodePage = 0; BOOLEAN NlsMbOemCodePageTag = FALSE; /* exported */ PWCHAR NlsOemToUnicodeTable = NULL; -PCHAR NlsUnicodeToOemTable =NULL; +PCHAR NlsUnicodeToOemTable = NULL; PWCHAR NlsDbcsUnicodeToOemTable = NULL; PUSHORT NlsOemLeadByteInfo = NULL; /* exported */ diff --git a/reactos/sdk/lib/rtl/unicode.c b/reactos/sdk/lib/rtl/unicode.c index 7bca567ba91..60bd080b8a5 100644 --- a/reactos/sdk/lib/rtl/unicode.c +++ b/reactos/sdk/lib/rtl/unicode.c @@ -24,6 +24,9 @@ extern BOOLEAN NlsMbOemCodePageTag; extern PUSHORT NlsLeadByteInfo; extern USHORT NlsOemDefaultChar; extern USHORT NlsUnicodeDefaultChar; +extern PUSHORT NlsOemLeadByteInfo; +extern PWCHAR NlsOemToUnicodeTable; +extern PCHAR NlsUnicodeToOemTable; /* FUNCTIONS *****************************************************************/ @@ -503,14 +506,47 @@ RtlpDidUnicodeToOemWork(IN PCUNICODE_STRING UnicodeString, } /* -* @unimplemented +* @implemented */ BOOLEAN NTAPI RtlIsValidOemCharacter(IN PWCHAR Char) { - UNIMPLEMENTED; - return FALSE; + WCHAR UnicodeChar; + WCHAR OemChar; + UCHAR Index; + + /* If multi-byte code page present */ + if (NlsMbOemCodePageTag) + { + USHORT Offset = 0; + + OemChar = NlsUnicodeToOemTable[*Char]; + + /* If character has Lead Byte */ + if (NlsOemLeadByteInfo[HIBYTE(OemChar)]) + Offset = NlsOemLeadByteInfo[HIBYTE(OemChar)]; + + Index = LOBYTE(OemChar) + Offset; + } + else + { + Index = NlsUnicodeToOemTable[*Char]; + } + + /* Receive Unicode character from the table */ + UnicodeChar = RtlUpcaseUnicodeChar(NlsOemToUnicodeTable[Index]); + + /* Receive OEM character from the table */ + OemChar = NlsUnicodeToOemTable[UnicodeChar]; + + /* Not valid character, failed */ + if (OemChar == NlsOemDefaultChar) + return FALSE; + + *Char = UnicodeChar; + + return TRUE; } /*