- 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
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;
}
}

View file

@ -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;

View file

@ -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);
}