- Remove DBCSCodePage field from NLS_FILE_HEADER structure.

- Make RtlInitCodePageTable function slightly clearer.
- Fix IntIsLeadByte function (thanks to Gregor Schneider, bug #3944).

svn path=/trunk/; revision=38042
This commit is contained in:
Dmitry Gorbachev 2008-12-13 15:42:56 +00:00
parent 8fb679dc7c
commit 030afbd185
3 changed files with 18 additions and 25 deletions

View file

@ -1067,13 +1067,13 @@ static BOOL
WINAPI WINAPI
IntIsLeadByte(PCPTABLEINFO TableInfo, BYTE Byte) IntIsLeadByte(PCPTABLEINFO TableInfo, BYTE Byte)
{ {
UINT LeadByteNo; UINT i;
if (TableInfo->MaximumCharacterSize == 2) 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; return TRUE;
} }
} }

View file

@ -1242,7 +1242,6 @@ typedef struct _NLS_FILE_HEADER
USHORT UniDefaultChar; USHORT UniDefaultChar;
USHORT TransDefaultChar; USHORT TransDefaultChar;
USHORT TransUniDefaultChar; USHORT TransUniDefaultChar;
USHORT DBCSCodePage;
UCHAR LeadByte[MAXIMUM_LEADBYTES]; UCHAR LeadByte[MAXIMUM_LEADBYTES];
} NLS_FILE_HEADER, *PNLS_FILE_HEADER; } NLS_FILE_HEADER, *PNLS_FILE_HEADER;

View file

@ -144,13 +144,12 @@ RtlInitCodePageTable(IN PUSHORT TableBase,
OUT PCPTABLEINFO CodePageTable) OUT PCPTABLEINFO CodePageTable)
{ {
PNLS_FILE_HEADER NlsFileHeader; PNLS_FILE_HEADER NlsFileHeader;
PUSHORT Ptr;
USHORT Offset;
DPRINT("RtlInitCodePageTable() called\n"); DPRINT("RtlInitCodePageTable() called\n");
NlsFileHeader = (PNLS_FILE_HEADER)TableBase; NlsFileHeader = (PNLS_FILE_HEADER)TableBase;
/* Copy header fields first */
CodePageTable->CodePage = NlsFileHeader->CodePage; CodePageTable->CodePage = NlsFileHeader->CodePage;
CodePageTable->MaximumCharacterSize = NlsFileHeader->MaximumCharacterSize; CodePageTable->MaximumCharacterSize = NlsFileHeader->MaximumCharacterSize;
CodePageTable->DefaultChar = NlsFileHeader->DefaultChar; CodePageTable->DefaultChar = NlsFileHeader->DefaultChar;
@ -162,35 +161,30 @@ RtlInitCodePageTable(IN PUSHORT TableBase,
&NlsFileHeader->LeadByte, &NlsFileHeader->LeadByte,
MAXIMUM_LEADBYTES); MAXIMUM_LEADBYTES);
/* Set Pointer to start of multi byte table */ /* Offset to wide char table is after the header */
Ptr = (PUSHORT)((ULONG_PTR)TableBase + 2 * NlsFileHeader->HeaderSize); CodePageTable->WideCharTable = TableBase + NlsFileHeader->HeaderSize + 1 +
TableBase[NlsFileHeader->HeaderSize];
/* Get offset to the wide char table */ /* Then multibyte table (256 wchars) follows */
Offset = (USHORT)(*Ptr++) + NlsFileHeader->HeaderSize + 1; CodePageTable->MultiByteTable = TableBase + NlsFileHeader->HeaderSize + 1;
/* Set pointer to the multi byte table */ /* Check the presence of glyph table (256 wchars) */
CodePageTable->MultiByteTable = Ptr; if (!CodePageTable->MultiByteTable[256])
CodePageTable->DBCSRanges = CodePageTable->MultiByteTable + 256 + 1;
else
CodePageTable->DBCSRanges = CodePageTable->MultiByteTable + 256 + 1 + 256;
/* Skip ANSI and OEM table */ /* Is this double-byte code page? */
Ptr += 256; if (*CodePageTable->DBCSRanges)
if (*Ptr++)
Ptr += 256;
/* Set pointer to DBCS ranges */
CodePageTable->DBCSRanges = (PUSHORT)Ptr;
if (*Ptr > 0)
{ {
CodePageTable->DBCSCodePage = 1; CodePageTable->DBCSCodePage = 1;
CodePageTable->DBCSOffsets = (PUSHORT)++Ptr; CodePageTable->DBCSOffsets = CodePageTable->DBCSRanges + 1;
} }
else else
{ {
CodePageTable->DBCSCodePage = 0; CodePageTable->DBCSCodePage = 0;
CodePageTable->DBCSOffsets = 0; CodePageTable->DBCSOffsets = NULL;
} }
CodePageTable->WideCharTable = (PVOID)((ULONG_PTR)TableBase + 2 * Offset);
} }