diff --git a/reactos/dll/win32/kernel32/misc/nls.c b/reactos/dll/win32/kernel32/misc/nls.c index 4d77e723fbc..b185dda23d8 100644 --- a/reactos/dll/win32/kernel32/misc/nls.c +++ b/reactos/dll/win32/kernel32/misc/nls.c @@ -1067,13 +1067,13 @@ static BOOL WINAPI IntIsLeadByte(PCPTABLEINFO TableInfo, BYTE Byte) { - UINT LeadByteNo; + UINT i; if (TableInfo->MaximumCharacterSize == 2) { - for (LeadByteNo = 0; LeadByteNo < MAXIMUM_LEADBYTES; LeadByteNo++) + for (i = 0; i < MAXIMUM_LEADBYTES && TableInfo->LeadByte[i]; i += 2) { - if (TableInfo->LeadByte[LeadByteNo] == Byte) + if (Byte >= TableInfo->LeadByte[i] && Byte <= TableInfo->LeadByte[i+1]) return TRUE; } } diff --git a/reactos/include/ndk/rtltypes.h b/reactos/include/ndk/rtltypes.h index 966c3cde824..42df9d337d4 100644 --- a/reactos/include/ndk/rtltypes.h +++ b/reactos/include/ndk/rtltypes.h @@ -1242,7 +1242,6 @@ typedef struct _NLS_FILE_HEADER USHORT UniDefaultChar; USHORT TransDefaultChar; USHORT TransUniDefaultChar; - USHORT DBCSCodePage; UCHAR LeadByte[MAXIMUM_LEADBYTES]; } NLS_FILE_HEADER, *PNLS_FILE_HEADER; diff --git a/reactos/lib/rtl/nls.c b/reactos/lib/rtl/nls.c index 6bed84863ee..389297cec78 100644 --- a/reactos/lib/rtl/nls.c +++ b/reactos/lib/rtl/nls.c @@ -144,13 +144,12 @@ RtlInitCodePageTable(IN PUSHORT TableBase, OUT PCPTABLEINFO CodePageTable) { PNLS_FILE_HEADER NlsFileHeader; - PUSHORT Ptr; - USHORT Offset; DPRINT("RtlInitCodePageTable() called\n"); NlsFileHeader = (PNLS_FILE_HEADER)TableBase; + /* Copy header fields first */ CodePageTable->CodePage = NlsFileHeader->CodePage; CodePageTable->MaximumCharacterSize = NlsFileHeader->MaximumCharacterSize; CodePageTable->DefaultChar = NlsFileHeader->DefaultChar; @@ -162,35 +161,30 @@ RtlInitCodePageTable(IN PUSHORT TableBase, &NlsFileHeader->LeadByte, MAXIMUM_LEADBYTES); - /* Set Pointer to start of multi byte table */ - Ptr = (PUSHORT)((ULONG_PTR)TableBase + 2 * NlsFileHeader->HeaderSize); + /* Offset to wide char table is after the header */ + CodePageTable->WideCharTable = TableBase + NlsFileHeader->HeaderSize + 1 + + TableBase[NlsFileHeader->HeaderSize]; - /* Get offset to the wide char table */ - Offset = (USHORT)(*Ptr++) + NlsFileHeader->HeaderSize + 1; + /* Then multibyte table (256 wchars) follows */ + CodePageTable->MultiByteTable = TableBase + NlsFileHeader->HeaderSize + 1; - /* Set pointer to the multi byte table */ - CodePageTable->MultiByteTable = Ptr; + /* Check the presence of glyph table (256 wchars) */ + if (!CodePageTable->MultiByteTable[256]) + CodePageTable->DBCSRanges = CodePageTable->MultiByteTable + 256 + 1; + else + CodePageTable->DBCSRanges = CodePageTable->MultiByteTable + 256 + 1 + 256; - /* Skip ANSI and OEM table */ - Ptr += 256; - if (*Ptr++) - Ptr += 256; - - /* Set pointer to DBCS ranges */ - CodePageTable->DBCSRanges = (PUSHORT)Ptr; - - if (*Ptr > 0) + /* Is this double-byte code page? */ + if (*CodePageTable->DBCSRanges) { CodePageTable->DBCSCodePage = 1; - CodePageTable->DBCSOffsets = (PUSHORT)++Ptr; + CodePageTable->DBCSOffsets = CodePageTable->DBCSRanges + 1; } else { CodePageTable->DBCSCodePage = 0; - CodePageTable->DBCSOffsets = 0; + CodePageTable->DBCSOffsets = NULL; } - - CodePageTable->WideCharTable = (PVOID)((ULONG_PTR)TableBase + 2 * Offset); }