[RTL]
authorDmitry Chapyshev <dmitry@reactos.org>
Sun, 4 Sep 2016 22:57:44 +0000 (22:57 +0000)
committerDmitry Chapyshev <dmitry@reactos.org>
Sun, 4 Sep 2016 22:57:44 +0000 (22:57 +0000)
- Implement RtlIsValidOemCharacter function

* Fixes all new tests for this function

svn path=/trunk/; revision=72580

reactos/sdk/lib/rtl/nls.c
reactos/sdk/lib/rtl/unicode.c

index 30dfd07..0704fae 100644 (file)
@@ -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 */
 
index 7bca567..60bd080 100644 (file)
@@ -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;
 }
 
 /*