[ros-diffs] [dgorbachev] 26835: - Add some code to deal with multibyte code pages.

dgorbachev at svn.reactos.org dgorbachev at svn.reactos.org
Sat May 19 12:11:23 CEST 2007


Author: dgorbachev
Date: Sat May 19 14:11:22 2007
New Revision: 26835

URL: http://svn.reactos.org/svn/reactos?rev=26835&view=rev
Log:
- Add some code to deal with multibyte code pages.

Modified:
    trunk/reactos/lib/rtl/nls.c

Modified: trunk/reactos/lib/rtl/nls.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/nls.c?rev=26835&r1=26834&r2=26835&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/nls.c (original)
+++ trunk/reactos/lib/rtl/nls.c Sat May 19 14:11:22 2007
@@ -254,7 +254,35 @@
    {
       /* multi-byte code page */
       /* FIXME */
-      ASSERT(FALSE);
+
+      UCHAR Char;
+      USHORT LeadByteInfo;
+      PCSTR MbEnd = MbString + MbSize;
+
+      for (i = 0; i < UnicodeSize / sizeof(WCHAR) && MbString < MbEnd; i++)
+      {
+         Char = *(PUCHAR)MbString++;
+
+         if (Char < 0x80)
+         {
+            *UnicodeString++ = Char;
+            continue;
+         }
+
+         LeadByteInfo = NlsLeadByteInfo[Char];
+
+         if (!LeadByteInfo)
+         {
+            *UnicodeString++ = NlsAnsiToUnicodeTable[Char];
+            continue;
+         }
+
+         if (MbString < MbEnd)
+            *UnicodeString++ = NlsLeadByteInfo[LeadByteInfo + *(PUCHAR)MbString++];
+      }
+
+      if (ResultSize != NULL)
+         *ResultSize = i * sizeof(WCHAR);
    }
 
    return(STATUS_SUCCESS);
@@ -281,12 +309,16 @@
     else
     {
         /* multi-byte code page */
+        /* FIXME */
+
         while (MbSize--)
         {
-            if (NlsLeadByteInfo[*(PUCHAR)MbString++])
+            UCHAR Char = *(PUCHAR)MbString++;
+
+            if (Char >= 0x80 && NlsLeadByteInfo[Char])
             {
-            	if (MbSize)
-            	{
+                if (MbSize)
+                {
                     /* Move on */
                     MbSize--;
                     MbString++;
@@ -342,7 +374,36 @@
    {
       /* multi-byte code page */
       /* FIXME */
-      ASSERT(FALSE);
+
+      UCHAR Char;
+      USHORT OemLeadByteInfo;
+      PCHAR OemEnd = OemString + OemSize;
+
+      for (i = 0; i < UnicodeSize / sizeof(WCHAR) && OemString < OemEnd; i++)
+      {
+         Char = *(PUCHAR)OemString++;
+
+         if (Char < 0x80)
+         {
+            *UnicodeString++ = Char;
+            continue;
+         }
+
+         OemLeadByteInfo = NlsOemLeadByteInfo[Char];
+
+         if (!OemLeadByteInfo)
+         {
+            *UnicodeString++ = NlsOemToUnicodeTable[Char];
+            continue;
+         }
+
+         if (OemString < OemEnd)
+            *UnicodeString++ =
+               NlsOemLeadByteInfo[OemLeadByteInfo + *(PUCHAR)OemString++];
+      }
+
+      if (ResultSize != NULL)
+         *ResultSize = i * sizeof(WCHAR);
    }
 
    return STATUS_SUCCESS;
@@ -461,7 +522,39 @@
    {
       /* multi-byte code page */
       /* FIXME */
-      ASSERT(FALSE);
+
+      USHORT WideChar;
+      USHORT MbChar;
+
+      for (i = MbSize, Size = UnicodeSize / sizeof(WCHAR); i && Size; i--, Size--)
+      {
+         WideChar = *UnicodeString++;
+
+         if (WideChar < 0x80)
+         {
+            *MbString++ = LOBYTE(WideChar);
+            continue;
+         }
+
+         MbChar = NlsDbcsUnicodeToAnsiTable[WideChar];
+
+         if (!HIBYTE(MbChar))
+         {
+            *MbString++ = LOBYTE(MbChar);
+            continue;
+         }
+
+         if (i >= 2)
+         {
+            *MbString++ = HIBYTE(MbChar);
+            *MbString++ = LOBYTE(MbChar);
+            i--;
+         }
+         else break;
+      }
+
+      if (ResultSize != NULL)
+         *ResultSize = MbSize - i;
    }
 
    return STATUS_SUCCESS;
@@ -487,9 +580,13 @@
     else
     {
         /* multi-byte code page */
+        /* FIXME */
+
         while (UnicodeLength--)
         {
-            if (HIBYTE(NlsUnicodeToAnsiTable[*UnicodeString++]))
+            USHORT WideChar = *UnicodeString++;
+
+            if (WideChar >= 0x80 && HIBYTE(NlsDbcsUnicodeToAnsiTable[WideChar]))
             {
                 MbLength += sizeof(WCHAR);
             }
@@ -498,7 +595,7 @@
                 MbLength++;
             }
         }
-    
+
         *MbSize = MbLength;
     }
 
@@ -541,7 +638,39 @@
    {
       /* multi-byte code page */
       /* FIXME */
-      ASSERT(FALSE);
+
+      USHORT WideChar;
+      USHORT OemChar;
+
+      for (i = OemSize, Size = UnicodeSize / sizeof(WCHAR); i && Size; i--, Size--)
+      {
+         WideChar = *UnicodeString++;
+
+         if (WideChar < 0x80)
+         {
+            *OemString++ = LOBYTE(WideChar);
+            continue;
+         }
+
+         OemChar = NlsDbcsUnicodeToOemTable[WideChar];
+
+         if (!HIBYTE(OemChar))
+         {
+            *OemString++ = LOBYTE(OemChar);
+            continue;
+         }
+
+         if (i >= 2)
+         {
+            *OemString++ = HIBYTE(OemChar);
+            *OemString++ = LOBYTE(OemChar);
+            i--;
+         }
+         else break;
+      }
+
+      if (ResultSize != NULL)
+         *ResultSize = OemSize - i;
    }
 
    return STATUS_SUCCESS;
@@ -704,7 +833,39 @@
    {
       /* multi-byte code page */
       /* FIXME */
-      ASSERT(FALSE);
+
+      USHORT WideChar;
+      USHORT OemChar;
+
+      for (i = OemSize, Size = UnicodeSize / sizeof(WCHAR); i && Size; i--, Size--)
+      {
+         WideChar = RtlUpcaseUnicodeChar(*UnicodeString++);
+
+         if (WideChar < 0x80)
+         {
+            *OemString++ = LOBYTE(WideChar);
+            continue;
+         }
+
+         OemChar = NlsDbcsUnicodeToOemTable[WideChar];
+
+         if (!HIBYTE(OemChar))
+         {
+            *OemString++ = LOBYTE(OemChar);
+            continue;
+         }
+
+         if (i >= 2)
+         {
+            *OemString++ = HIBYTE(OemChar);
+            *OemString++ = LOBYTE(OemChar);
+            i--;
+         }
+         else break;
+      }
+
+      if (ResultSize != NULL)
+         *ResultSize = OemSize - i;
    }
 
    return STATUS_SUCCESS;




More information about the Ros-diffs mailing list