ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

nls.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:         See COPYING in the top level directory
00003  * PROJECT:           ReactOS system libraries
00004  * FILE:              lib/rtl/nls.c
00005  * PURPOSE:           National Language Support (NLS) functions
00006  * PROGRAMMERS:       Emanuele Aliberti
00007  */
00008 
00009 /* INCLUDES *****************************************************************/
00010 
00011 #include <rtl.h>
00012 
00013 #define NDEBUG
00014 #include <debug.h>
00015 
00016 /* GLOBALS *******************************************************************/
00017 
00018 PUSHORT NlsUnicodeUpcaseTable = NULL;
00019 PUSHORT NlsUnicodeLowercaseTable = NULL;
00020 
00021 USHORT NlsAnsiCodePage = 0; /* exported */
00022 BOOLEAN NlsMbCodePageTag = FALSE; /* exported */
00023 PWCHAR NlsAnsiToUnicodeTable = NULL;
00024 PCHAR NlsUnicodeToAnsiTable = NULL;
00025 PWCHAR NlsDbcsUnicodeToAnsiTable = NULL;
00026 PUSHORT NlsLeadByteInfo = NULL; /* exported */
00027 
00028 
00029 USHORT NlsOemCodePage = 0;
00030 BOOLEAN NlsMbOemCodePageTag = FALSE; /* exported */
00031 PWCHAR NlsOemToUnicodeTable = NULL;
00032 PCHAR NlsUnicodeToOemTable =NULL;
00033 PWCHAR NlsDbcsUnicodeToOemTable = NULL;
00034 PUSHORT _NlsOemLeadByteInfo = NULL; /* exported */
00035 
00036 USHORT NlsOemDefaultChar = '\0';
00037 USHORT NlsUnicodeDefaultChar = 0;
00038 
00039 
00040 #define NlsOemLeadByteInfo              _NlsOemLeadByteInfo
00041 #define INIT_FUNCTION
00042 
00043 /* FUNCTIONS *****************************************************************/
00044 
00045 /*
00046  * @unimplemented
00047  */
00048 NTSTATUS NTAPI
00049 RtlCustomCPToUnicodeN(IN PCPTABLEINFO CustomCP,
00050                       PWCHAR UnicodeString,
00051                       ULONG UnicodeSize,
00052                       PULONG ResultSize,
00053                       PCHAR CustomString,
00054                       ULONG CustomSize)
00055 {
00056    ULONG Size = 0;
00057    ULONG i;
00058 
00059    if (CustomCP->DBCSCodePage == 0)
00060    {
00061       /* single-byte code page */
00062       if (CustomSize > (UnicodeSize / sizeof(WCHAR)))
00063          Size = UnicodeSize / sizeof(WCHAR);
00064       else
00065          Size = CustomSize;
00066 
00067       if (ResultSize != NULL)
00068          *ResultSize = Size * sizeof(WCHAR);
00069 
00070       for (i = 0; i < Size; i++)
00071       {
00072          *UnicodeString = CustomCP->MultiByteTable[(UCHAR)*CustomString];
00073          UnicodeString++;
00074          CustomString++;
00075       }
00076    }
00077    else
00078    {
00079       /* multi-byte code page */
00080       /* FIXME */
00081       ASSERT(FALSE);
00082    }
00083 
00084    return(STATUS_SUCCESS);
00085 }
00086 
00087 
00088 
00089 WCHAR NTAPI
00090 RtlDowncaseUnicodeChar (IN WCHAR Source)
00091 {
00092    USHORT Offset;
00093 
00094    if (Source < L'A')
00095       return Source;
00096 
00097    if (Source <= L'Z')
00098       return Source + (L'a' - L'A');
00099 
00100    if (Source < 0x80)
00101       return Source;
00102 
00103    Offset = ((USHORT)Source >> 8);
00104    DPRINT("Offset: %hx\n", Offset);
00105 
00106    Offset = NlsUnicodeLowercaseTable[Offset];
00107    DPRINT("Offset: %hx\n", Offset);
00108 
00109    Offset += (((USHORT)Source & 0x00F0) >> 4);
00110    DPRINT("Offset: %hx\n", Offset);
00111 
00112    Offset = NlsUnicodeLowercaseTable[Offset];
00113    DPRINT("Offset: %hx\n", Offset);
00114 
00115    Offset += ((USHORT)Source & 0x000F);
00116    DPRINT("Offset: %hx\n", Offset);
00117 
00118    Offset = NlsUnicodeLowercaseTable[Offset];
00119    DPRINT("Offset: %hx\n", Offset);
00120 
00121    DPRINT("Result: %hx\n", Source + (SHORT)Offset);
00122 
00123    return Source + (SHORT)Offset;
00124 }
00125 
00126 
00127 
00128 
00129 /*
00130  * @implemented
00131  */
00132 VOID NTAPI
00133 RtlGetDefaultCodePage(OUT PUSHORT AnsiCodePage,
00134                       OUT PUSHORT OemCodePage)
00135 {
00136    *AnsiCodePage = NlsAnsiCodePage;
00137    *OemCodePage = NlsOemCodePage;
00138 }
00139 
00140 
00141 
00142 
00143 /*
00144  * @implemented
00145  */
00146 VOID NTAPI
00147 RtlInitCodePageTable(IN PUSHORT TableBase,
00148                      OUT PCPTABLEINFO CodePageTable)
00149 {
00150    PNLS_FILE_HEADER NlsFileHeader;
00151 
00152    DPRINT("RtlInitCodePageTable() called\n");
00153 
00154    NlsFileHeader = (PNLS_FILE_HEADER)TableBase;
00155 
00156    /* Copy header fields first */
00157    CodePageTable->CodePage = NlsFileHeader->CodePage;
00158    CodePageTable->MaximumCharacterSize = NlsFileHeader->MaximumCharacterSize;
00159    CodePageTable->DefaultChar = NlsFileHeader->DefaultChar;
00160    CodePageTable->UniDefaultChar = NlsFileHeader->UniDefaultChar;
00161    CodePageTable->TransDefaultChar = NlsFileHeader->TransDefaultChar;
00162    CodePageTable->TransUniDefaultChar = NlsFileHeader->TransUniDefaultChar;
00163 
00164    RtlCopyMemory(&CodePageTable->LeadByte,
00165                  &NlsFileHeader->LeadByte,
00166                  MAXIMUM_LEADBYTES);
00167 
00168    /* Offset to wide char table is after the header */
00169    CodePageTable->WideCharTable = TableBase + NlsFileHeader->HeaderSize + 1 +
00170                                   TableBase[NlsFileHeader->HeaderSize];
00171 
00172    /* Then multibyte table (256 wchars) follows */
00173    CodePageTable->MultiByteTable = TableBase + NlsFileHeader->HeaderSize + 1;
00174 
00175    /* Check the presence of glyph table (256 wchars) */
00176    if (!CodePageTable->MultiByteTable[256])
00177       CodePageTable->DBCSRanges = CodePageTable->MultiByteTable + 256 + 1;
00178    else
00179       CodePageTable->DBCSRanges = CodePageTable->MultiByteTable + 256 + 1 + 256;
00180 
00181    /* Is this double-byte code page? */
00182    if (*CodePageTable->DBCSRanges)
00183    {
00184       CodePageTable->DBCSCodePage = 1;
00185       CodePageTable->DBCSOffsets = CodePageTable->DBCSRanges + 1;
00186    }
00187    else
00188    {
00189       CodePageTable->DBCSCodePage = 0;
00190       CodePageTable->DBCSOffsets = NULL;
00191    }
00192 }
00193 
00194 
00195 
00196 
00197 /*
00198  * @implemented
00199  */
00200 VOID NTAPI
00201 RtlInitNlsTables(IN PUSHORT AnsiTableBase,
00202                  IN PUSHORT OemTableBase,
00203                  IN PUSHORT CaseTableBase,
00204                  OUT PNLSTABLEINFO NlsTable)
00205 {
00206    DPRINT("RtlInitNlsTables()called\n");
00207 
00208    if (AnsiTableBase == NULL ||
00209          OemTableBase == NULL ||
00210          CaseTableBase == NULL)
00211       return;
00212 
00213    RtlInitCodePageTable (AnsiTableBase,
00214                          &NlsTable->AnsiTableInfo);
00215 
00216    RtlInitCodePageTable (OemTableBase,
00217                          &NlsTable->OemTableInfo);
00218 
00219    NlsTable->UpperCaseTable = (PUSHORT)CaseTableBase + 2;
00220    NlsTable->LowerCaseTable = (PUSHORT)CaseTableBase + *((PUSHORT)CaseTableBase + 1) + 2;
00221 }
00222 
00223 
00224 /*
00225  * @unimplemented
00226  */
00227 NTSTATUS NTAPI
00228 RtlMultiByteToUnicodeN(
00229    OUT PWCHAR UnicodeString,
00230    IN ULONG UnicodeSize,
00231    OUT PULONG ResultSize,
00232    IN PCSTR MbString,
00233    IN ULONG MbSize)
00234 {
00235    ULONG Size = 0;
00236    ULONG i;
00237 
00238    PAGED_CODE_RTL();
00239 
00240    if (NlsMbCodePageTag == FALSE)
00241    {
00242       /* single-byte code page */
00243       if (MbSize > (UnicodeSize / sizeof(WCHAR)))
00244          Size = UnicodeSize / sizeof(WCHAR);
00245       else
00246          Size = MbSize;
00247 
00248       if (ResultSize != NULL)
00249          *ResultSize = Size * sizeof(WCHAR);
00250 
00251       for (i = 0; i < Size; i++)
00252          UnicodeString[i] = NlsAnsiToUnicodeTable[(UCHAR)MbString[i]];
00253    }
00254    else
00255    {
00256       /* multi-byte code page */
00257       /* FIXME */
00258 
00259       UCHAR Char;
00260       USHORT LeadByteInfo;
00261       PCSTR MbEnd = MbString + MbSize;
00262 
00263       for (i = 0; i < UnicodeSize / sizeof(WCHAR) && MbString < MbEnd; i++)
00264       {
00265          Char = *(PUCHAR)MbString++;
00266 
00267          if (Char < 0x80)
00268          {
00269             *UnicodeString++ = Char;
00270             continue;
00271          }
00272 
00273          LeadByteInfo = NlsLeadByteInfo[Char];
00274 
00275          if (!LeadByteInfo)
00276          {
00277             *UnicodeString++ = NlsAnsiToUnicodeTable[Char];
00278             continue;
00279          }
00280 
00281          if (MbString < MbEnd)
00282             *UnicodeString++ = NlsLeadByteInfo[LeadByteInfo + *(PUCHAR)MbString++];
00283       }
00284 
00285       if (ResultSize != NULL)
00286          *ResultSize = i * sizeof(WCHAR);
00287    }
00288 
00289    return STATUS_SUCCESS;
00290 }
00291 
00292 
00293 
00294 /*
00295  * @implemented
00296  */
00297 NTSTATUS
00298 NTAPI
00299 RtlMultiByteToUnicodeSize(PULONG UnicodeSize,
00300                           PCSTR MbString,
00301                           ULONG MbSize)
00302 {
00303     ULONG Length = 0;
00304 
00305     PAGED_CODE_RTL();
00306 
00307     if (!NlsMbCodePageTag)
00308     {
00309         /* single-byte code page */
00310         *UnicodeSize = MbSize * sizeof (WCHAR);
00311     }
00312     else
00313     {
00314         /* multi-byte code page */
00315         /* FIXME */
00316 
00317         while (MbSize--)
00318         {
00319             UCHAR Char = *(PUCHAR)MbString++;
00320 
00321             if (Char >= 0x80 && NlsLeadByteInfo[Char])
00322             {
00323                 if (MbSize)
00324                 {
00325                     /* Move on */
00326                     MbSize--;
00327                     MbString++;
00328                 }
00329             }
00330 
00331             /* Increase returned size */
00332             Length++;
00333         }
00334 
00335         /* Return final size */
00336         *UnicodeSize = Length * sizeof(WCHAR);
00337     }
00338 
00339     /* Success */
00340     return STATUS_SUCCESS;
00341 }
00342 
00343 
00344 
00345 /*
00346  * @unimplemented
00347  */
00348 NTSTATUS NTAPI
00349 RtlOemToUnicodeN (PWCHAR UnicodeString,
00350                   ULONG UnicodeSize,
00351                   PULONG ResultSize,
00352                   PCCH OemString,
00353                   ULONG OemSize)
00354 {
00355    ULONG Size = 0;
00356    ULONG i;
00357 
00358    if (NlsMbOemCodePageTag == FALSE)
00359    {
00360       /* single-byte code page */
00361       if (OemSize > (UnicodeSize / sizeof(WCHAR)))
00362          Size = UnicodeSize / sizeof(WCHAR);
00363       else
00364          Size = OemSize;
00365 
00366       if (ResultSize != NULL)
00367          *ResultSize = Size * sizeof(WCHAR);
00368 
00369       for (i = 0; i < Size; i++)
00370       {
00371          *UnicodeString = NlsOemToUnicodeTable[(UCHAR)*OemString];
00372          UnicodeString++;
00373          OemString++;
00374       }
00375    }
00376    else
00377    {
00378       /* multi-byte code page */
00379       /* FIXME */
00380 
00381       UCHAR Char;
00382       USHORT OemLeadByteInfo;
00383       PCCH OemEnd = OemString + OemSize;
00384 
00385       for (i = 0; i < UnicodeSize / sizeof(WCHAR) && OemString < OemEnd; i++)
00386       {
00387          Char = *(PUCHAR)OemString++;
00388 
00389          if (Char < 0x80)
00390          {
00391             *UnicodeString++ = Char;
00392             continue;
00393          }
00394 
00395          OemLeadByteInfo = NlsOemLeadByteInfo[Char];
00396 
00397          if (!OemLeadByteInfo)
00398          {
00399             *UnicodeString++ = NlsOemToUnicodeTable[Char];
00400             continue;
00401          }
00402 
00403          if (OemString < OemEnd)
00404             *UnicodeString++ =
00405                NlsOemLeadByteInfo[OemLeadByteInfo + *(PUCHAR)OemString++];
00406       }
00407 
00408       if (ResultSize != NULL)
00409          *ResultSize = i * sizeof(WCHAR);
00410    }
00411 
00412    return STATUS_SUCCESS;
00413 }
00414 
00415 
00416 
00417 /*
00418  * @implemented
00419  */
00420 VOID NTAPI
00421 RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable)
00422 {
00423    DPRINT("RtlResetRtlTranslations() called\n");
00424 
00425    /* Set ANSI data */
00426    NlsAnsiToUnicodeTable = (PWCHAR)NlsTable->AnsiTableInfo.MultiByteTable; /* Real type is PUSHORT */
00427    NlsUnicodeToAnsiTable = NlsTable->AnsiTableInfo.WideCharTable;
00428    NlsDbcsUnicodeToAnsiTable = (PWCHAR)NlsTable->AnsiTableInfo.WideCharTable;
00429    NlsMbCodePageTag = (NlsTable->AnsiTableInfo.DBCSCodePage != 0);
00430    NlsLeadByteInfo = NlsTable->AnsiTableInfo.DBCSOffsets;
00431    NlsAnsiCodePage = NlsTable->AnsiTableInfo.CodePage;
00432    DPRINT("Ansi codepage %hu\n", NlsAnsiCodePage);
00433 
00434    /* Set OEM data */
00435    NlsOemToUnicodeTable = (PWCHAR)NlsTable->OemTableInfo.MultiByteTable; /* Real type is PUSHORT */
00436    NlsUnicodeToOemTable = NlsTable->OemTableInfo.WideCharTable;
00437    NlsDbcsUnicodeToOemTable = (PWCHAR)NlsTable->OemTableInfo.WideCharTable;
00438    NlsMbOemCodePageTag = (NlsTable->OemTableInfo.DBCSCodePage != 0);
00439    NlsOemLeadByteInfo = NlsTable->OemTableInfo.DBCSOffsets;
00440    NlsOemCodePage = NlsTable->OemTableInfo.CodePage;
00441    DPRINT("Oem codepage %hu\n", NlsOemCodePage);
00442 
00443    /* Set Unicode case map data */
00444    NlsUnicodeUpcaseTable = NlsTable->UpperCaseTable;
00445    NlsUnicodeLowercaseTable = NlsTable->LowerCaseTable;
00446 
00447    /* set the default characters for RtlpDidUnicodeToOemWork */
00448    NlsOemDefaultChar = NlsTable->OemTableInfo.DefaultChar;
00449    NlsUnicodeDefaultChar = NlsTable->OemTableInfo.TransDefaultChar;
00450 }
00451 
00452 
00453 
00454 /*
00455  * @unimplemented
00456  */
00457 NTSTATUS NTAPI
00458 RtlUnicodeToCustomCPN(IN PCPTABLEINFO CustomCP,
00459                       PCHAR CustomString,
00460                       ULONG CustomSize,
00461                       PULONG ResultSize,
00462                       PWCHAR UnicodeString,
00463                       ULONG UnicodeSize)
00464 {
00465    ULONG Size = 0;
00466    ULONG i;
00467 
00468    if (CustomCP->DBCSCodePage == 0)
00469    {
00470       /* single-byte code page */
00471       if (UnicodeSize > (CustomSize * sizeof(WCHAR)))
00472          Size = CustomSize;
00473       else
00474          Size = UnicodeSize / sizeof(WCHAR);
00475 
00476       if (ResultSize != NULL)
00477          *ResultSize = Size;
00478 
00479       for (i = 0; i < Size; i++)
00480       {
00481          *CustomString = ((PCHAR)CustomCP->WideCharTable)[*UnicodeString];
00482          CustomString++;
00483          UnicodeString++;
00484       }
00485    }
00486    else
00487    {
00488       /* multi-byte code page */
00489       /* FIXME */
00490       ASSERT(FALSE);
00491    }
00492 
00493    return STATUS_SUCCESS;
00494 }
00495 
00496 
00497 
00498 /*
00499  * @unimplemented
00500  */
00501 NTSTATUS NTAPI
00502 RtlUnicodeToMultiByteN (PCHAR MbString,
00503                         ULONG MbSize,
00504                         PULONG ResultSize,
00505                         PCWCH UnicodeString,
00506                         ULONG UnicodeSize)
00507 {
00508    ULONG Size = 0;
00509    ULONG i;
00510 
00511    PAGED_CODE_RTL();
00512 
00513    if (NlsMbCodePageTag == FALSE)
00514    {
00515       /* single-byte code page */
00516       Size =  (UnicodeSize > (MbSize * sizeof (WCHAR)))
00517                  ? MbSize
00518              : (UnicodeSize / sizeof (WCHAR));
00519 
00520       if (ResultSize != NULL)
00521       {
00522          *ResultSize = Size;
00523       }
00524 
00525       for (i = 0; i < Size; i++)
00526       {
00527          *MbString++ = NlsUnicodeToAnsiTable[*UnicodeString++];
00528       }
00529    }
00530    else
00531    {
00532       /* multi-byte code page */
00533       /* FIXME */
00534 
00535       USHORT WideChar;
00536       USHORT MbChar;
00537 
00538       for (i = MbSize, Size = UnicodeSize / sizeof(WCHAR); i && Size; i--, Size--)
00539       {
00540          WideChar = *UnicodeString++;
00541 
00542          if (WideChar < 0x80)
00543          {
00544             *MbString++ = LOBYTE(WideChar);
00545             continue;
00546          }
00547 
00548          MbChar = NlsDbcsUnicodeToAnsiTable[WideChar];
00549 
00550          if (!HIBYTE(MbChar))
00551          {
00552             *MbString++ = LOBYTE(MbChar);
00553             continue;
00554          }
00555 
00556          if (i >= 2)
00557          {
00558             *MbString++ = HIBYTE(MbChar);
00559             *MbString++ = LOBYTE(MbChar);
00560             i--;
00561          }
00562          else break;
00563       }
00564 
00565       if (ResultSize != NULL)
00566          *ResultSize = MbSize - i;
00567    }
00568 
00569    return STATUS_SUCCESS;
00570 }
00571 
00572 /*
00573  * @implemented
00574  */
00575 NTSTATUS
00576 NTAPI
00577 RtlUnicodeToMultiByteSize(PULONG MbSize,
00578                           PCWCH UnicodeString,
00579                           ULONG UnicodeSize)
00580 {
00581     ULONG UnicodeLength = UnicodeSize / sizeof(WCHAR);
00582     ULONG MbLength = 0;
00583 
00584     if (!NlsMbCodePageTag)
00585     {
00586         /* single-byte code page */
00587         *MbSize = UnicodeLength;
00588     }
00589     else
00590     {
00591         /* multi-byte code page */
00592         /* FIXME */
00593 
00594         while (UnicodeLength--)
00595         {
00596             USHORT WideChar = *UnicodeString++;
00597 
00598             if (WideChar >= 0x80 && HIBYTE(NlsDbcsUnicodeToAnsiTable[WideChar]))
00599             {
00600                 MbLength += sizeof(WCHAR);
00601             }
00602             else
00603             {
00604                 MbLength++;
00605             }
00606         }
00607 
00608         *MbSize = MbLength;
00609     }
00610 
00611     /* Success */
00612     return STATUS_SUCCESS;
00613 }
00614 
00615 /*
00616  * @unimplemented
00617  */
00618 NTSTATUS NTAPI
00619 RtlUnicodeToOemN (PCHAR OemString,
00620                   ULONG OemSize,
00621                   PULONG ResultSize,
00622                   PCWCH UnicodeString,
00623                   ULONG UnicodeSize)
00624 {
00625    ULONG Size = 0;
00626    ULONG i;
00627 
00628    if (NlsMbOemCodePageTag == FALSE)
00629    {
00630       /* single-byte code page */
00631       if (UnicodeSize > (OemSize * sizeof(WCHAR)))
00632          Size = OemSize;
00633       else
00634          Size = UnicodeSize / sizeof(WCHAR);
00635 
00636       if (ResultSize != NULL)
00637          *ResultSize = Size;
00638 
00639       for (i = 0; i < Size; i++)
00640       {
00641          *OemString = NlsUnicodeToOemTable[*UnicodeString];
00642          OemString++;
00643          UnicodeString++;
00644       }
00645    }
00646    else
00647    {
00648       /* multi-byte code page */
00649       /* FIXME */
00650 
00651       USHORT WideChar;
00652       USHORT OemChar;
00653 
00654       for (i = OemSize, Size = UnicodeSize / sizeof(WCHAR); i && Size; i--, Size--)
00655       {
00656          WideChar = *UnicodeString++;
00657 
00658          if (WideChar < 0x80)
00659          {
00660             *OemString++ = LOBYTE(WideChar);
00661             continue;
00662          }
00663 
00664          OemChar = NlsDbcsUnicodeToOemTable[WideChar];
00665 
00666          if (!HIBYTE(OemChar))
00667          {
00668             *OemString++ = LOBYTE(OemChar);
00669             continue;
00670          }
00671 
00672          if (i >= 2)
00673          {
00674             *OemString++ = HIBYTE(OemChar);
00675             *OemString++ = LOBYTE(OemChar);
00676             i--;
00677          }
00678          else break;
00679       }
00680 
00681       if (ResultSize != NULL)
00682          *ResultSize = OemSize - i;
00683    }
00684 
00685    return STATUS_SUCCESS;
00686 }
00687 
00688 
00689 
00690 
00691 /*
00692  * @implemented
00693  */
00694 WCHAR NTAPI
00695 RtlUpcaseUnicodeChar(IN WCHAR Source)
00696 {
00697    USHORT Offset;
00698 
00699    if (Source < 'a')
00700       return Source;
00701 
00702    if (Source <= 'z')
00703       return (Source - ('a' - 'A'));
00704 
00705    Offset = ((USHORT)Source >> 8) & 0xFF;
00706    Offset = NlsUnicodeUpcaseTable[Offset];
00707 
00708    Offset += ((USHORT)Source >> 4) & 0xF;
00709    Offset = NlsUnicodeUpcaseTable[Offset];
00710 
00711    Offset += ((USHORT)Source & 0xF);
00712    Offset = NlsUnicodeUpcaseTable[Offset];
00713 
00714    return Source + (SHORT)Offset;
00715 }
00716 
00717 
00718 
00719 /*
00720  * @unimplemented
00721  */
00722 NTSTATUS NTAPI
00723 RtlUpcaseUnicodeToCustomCPN (IN PCPTABLEINFO CustomCP,
00724                              PCHAR CustomString,
00725                              ULONG CustomSize,
00726                              PULONG ResultSize,
00727                              PWCHAR UnicodeString,
00728                              ULONG UnicodeSize)
00729 {
00730    WCHAR UpcaseChar;
00731    ULONG Size = 0;
00732    ULONG i;
00733 
00734    if (CustomCP->DBCSCodePage == 0)
00735    {
00736       /* single-byte code page */
00737       if (UnicodeSize > (CustomSize * sizeof(WCHAR)))
00738          Size = CustomSize;
00739       else
00740          Size = UnicodeSize / sizeof(WCHAR);
00741 
00742       if (ResultSize != NULL)
00743          *ResultSize = Size;
00744 
00745       for (i = 0; i < Size; i++)
00746       {
00747          UpcaseChar = RtlUpcaseUnicodeChar(*UnicodeString);
00748          *CustomString = ((PCHAR)CustomCP->WideCharTable)[UpcaseChar];
00749          CustomString++;
00750          UnicodeString++;
00751       }
00752    }
00753    else
00754    {
00755       /* multi-byte code page */
00756       /* FIXME */
00757       ASSERT(FALSE);
00758    }
00759 
00760    return STATUS_SUCCESS;
00761 }
00762 
00763 
00764 /*
00765  * @unimplemented
00766  */
00767 NTSTATUS NTAPI
00768 RtlUpcaseUnicodeToMultiByteN (PCHAR MbString,
00769                               ULONG MbSize,
00770                               PULONG ResultSize,
00771                               PCWCH UnicodeString,
00772                               ULONG UnicodeSize)
00773 {
00774    WCHAR UpcaseChar;
00775    ULONG Size = 0;
00776    ULONG i;
00777 
00778    if (NlsMbCodePageTag == FALSE)
00779    {
00780       /* single-byte code page */
00781       if (UnicodeSize > (MbSize * sizeof(WCHAR)))
00782          Size = MbSize;
00783       else
00784          Size = UnicodeSize / sizeof(WCHAR);
00785 
00786       if (ResultSize != NULL)
00787          *ResultSize = Size;
00788 
00789       for (i = 0; i < Size; i++)
00790       {
00791          UpcaseChar = RtlUpcaseUnicodeChar(*UnicodeString);
00792          *MbString = NlsUnicodeToAnsiTable[UpcaseChar];
00793          MbString++;
00794          UnicodeString++;
00795       }
00796    }
00797    else
00798    {
00799       /* multi-byte code page */
00800       /* FIXME */
00801       ASSERT(FALSE);
00802    }
00803 
00804    return STATUS_SUCCESS;
00805 }
00806 
00807 
00808 /*
00809  * @unimplemented
00810  */
00811 NTSTATUS NTAPI
00812 RtlUpcaseUnicodeToOemN (PCHAR OemString,
00813                         ULONG OemSize,
00814                         PULONG ResultSize,
00815                         PCWCH UnicodeString,
00816                         ULONG UnicodeSize)
00817 {
00818    WCHAR UpcaseChar;
00819    ULONG Size = 0;
00820    ULONG i;
00821 
00822    ASSERT(NlsUnicodeToOemTable != NULL);
00823 
00824    if (NlsMbOemCodePageTag == FALSE)
00825    {
00826       /* single-byte code page */
00827       if (UnicodeSize > (OemSize * sizeof(WCHAR)))
00828          Size = OemSize;
00829       else
00830          Size = UnicodeSize / sizeof(WCHAR);
00831 
00832       if (ResultSize != NULL)
00833          *ResultSize = Size;
00834 
00835       for (i = 0; i < Size; i++)
00836       {
00837          UpcaseChar = RtlUpcaseUnicodeChar(*UnicodeString);
00838          *OemString = NlsUnicodeToOemTable[UpcaseChar];
00839          OemString++;
00840          UnicodeString++;
00841       }
00842    }
00843    else
00844    {
00845       /* multi-byte code page */
00846       /* FIXME */
00847 
00848       USHORT WideChar;
00849       USHORT OemChar;
00850 
00851       for (i = OemSize, Size = UnicodeSize / sizeof(WCHAR); i && Size; i--, Size--)
00852       {
00853          WideChar = RtlUpcaseUnicodeChar(*UnicodeString++);
00854 
00855          if (WideChar < 0x80)
00856          {
00857             *OemString++ = LOBYTE(WideChar);
00858             continue;
00859          }
00860 
00861          OemChar = NlsDbcsUnicodeToOemTable[WideChar];
00862 
00863          if (!HIBYTE(OemChar))
00864          {
00865             *OemString++ = LOBYTE(OemChar);
00866             continue;
00867          }
00868 
00869          if (i >= 2)
00870          {
00871             *OemString++ = HIBYTE(OemChar);
00872             *OemString++ = LOBYTE(OemChar);
00873             i--;
00874          }
00875          else break;
00876       }
00877 
00878       if (ResultSize != NULL)
00879          *ResultSize = OemSize - i;
00880    }
00881 
00882    return STATUS_SUCCESS;
00883 }
00884 
00885 
00886 
00887 /*
00888  * @unimplemented
00889  */
00890 CHAR NTAPI
00891 RtlUpperChar (IN CHAR Source)
00892 {
00893    WCHAR Unicode;
00894    CHAR Destination;
00895 
00896    /* Check for simple ANSI case */
00897    if (Source <= 'z')
00898    {
00899        /* Check for simple downcase a-z case */
00900        if (Source >= 'a')
00901        {
00902            /* Just XOR with the difference */
00903            return Source ^ ('a' - 'A');
00904        }
00905        else
00906        {
00907            /* Otherwise return the same char, it's already upcase */
00908            return Source;
00909        }
00910    }
00911    else
00912    {
00913         if (NlsMbCodePageTag == FALSE)
00914         {
00915             /* single-byte code page */
00916 
00917             /* ansi->unicode */
00918             Unicode = NlsAnsiToUnicodeTable[(UCHAR)Source];
00919 
00920             /* upcase conversion */
00921             Unicode = RtlUpcaseUnicodeChar (Unicode);
00922 
00923             /* unicode -> ansi */
00924             Destination = NlsUnicodeToAnsiTable[(USHORT)Unicode];
00925         }
00926         else
00927         {
00928             /* multi-byte code page */
00929             /* FIXME */
00930             Destination = Source;
00931         }
00932    }
00933 
00934    return Destination;
00935 }
00936 
00937 /* EOF */

Generated on Sat May 26 2012 04:23:09 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.