Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygennls.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
1.7.6.1
|