202 lines
5.6 KiB
C++
202 lines
5.6 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) 1992 - 1997 Microsoft Corporation.
|
|
//
|
|
// File: cphash.cxx
|
|
//
|
|
// Contents: Table that maps strings to codepages
|
|
//
|
|
// Classes: CCodePageTable
|
|
//
|
|
// Note: Derived from SitaramR's hash table
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include <cphash.hxx>
|
|
|
|
const ULONG CODE_JPN_JIS = 1;
|
|
const ULONG CODE_JPN_EUC = 2;
|
|
|
|
//
|
|
// Note: These must be all lowercase and kept in alphabetical order
|
|
//
|
|
|
|
const CCodePageEntry CCodePageTable::_aEntries[] =
|
|
{
|
|
{ L"ansi_x3.4-1968", 1252 },
|
|
{ L"ansi_x3.4-1986", 1252 },
|
|
{ L"ascii", 1252 },
|
|
{ L"big5", 950 },
|
|
{ L"chinese", 936 },
|
|
{ L"cp367", 1252 },
|
|
{ L"cp819", 1252 },
|
|
{ L"csascii", 1252 },
|
|
{ L"csbig5", 950 },
|
|
{ L"cseuckr", 949 },
|
|
{ L"cseucpkdfmtjapanese", CODE_JPN_EUC },
|
|
{ L"csgb2312", 936 },
|
|
{ L"csiso2022jp", CODE_JPN_JIS },
|
|
{ L"csiso2022kr", 50225 },
|
|
{ L"csiso58gb231280", 936 },
|
|
{ L"csisolatin2", 28592 },
|
|
{ L"csisolatinhebrew", 1255 },
|
|
{ L"cskoi8r", 20866 },
|
|
{ L"csksc56011987", 949 },
|
|
{ L"csshiftjis", 932 },
|
|
{ L"euc-kr", 949 },
|
|
{ L"extended_unix_code_packed_format_for_japanese", CODE_JPN_EUC },
|
|
{ L"gb2312", 936 },
|
|
{ L"gb_2312-80", 936 },
|
|
{ L"hebrew", 1255 },
|
|
{ L"hz-gb-2312", 936 },
|
|
{ L"ibm367", 1252 },
|
|
{ L"ibm819", 1252 },
|
|
{ L"ibm852", 852 },
|
|
{ L"ibm866", 866 },
|
|
{ L"iso-2022-jp", CODE_JPN_JIS },
|
|
{ L"iso-2022-kr", 50225 },
|
|
{ L"iso-8859-1", 1252 },
|
|
{ L"iso-8859-2", 28592 },
|
|
{ L"iso-8859-8", 1255 },
|
|
{ L"iso-ir-100", 1252 },
|
|
{ L"iso-ir-101", 28592 },
|
|
{ L"iso-ir-138", 1255 },
|
|
{ L"iso-ir-149", 949 },
|
|
{ L"iso-ir-58", 936 },
|
|
{ L"iso-ir-6", 1252 },
|
|
{ L"iso646-us", 1252 },
|
|
{ L"iso8859-1", 1252 },
|
|
{ L"iso8859-2", 28592 },
|
|
{ L"iso_646.irv:1991", 1252 },
|
|
{ L"iso_8859-1", 1252 },
|
|
{ L"iso_8859-1:1987", 1252 },
|
|
{ L"iso_8859-2", 28592 },
|
|
{ L"iso_8859-2:1987", 28592 },
|
|
{ L"iso_8859-8", 1255 },
|
|
{ L"iso_8859-8:1988", 1255 },
|
|
{ L"koi8-r", 20866 },
|
|
{ L"korean", 949 },
|
|
{ L"ks-c-5601", 949 },
|
|
{ L"ks-c-5601-1987", 949 },
|
|
{ L"ks_c_5601", 949 },
|
|
{ L"ks_c_5601-1987", 949 },
|
|
{ L"ks_c_5601-1989", 949 },
|
|
{ L"ksc-5601", 949 },
|
|
{ L"ksc5601", 949 },
|
|
{ L"ksc_5601", 949 },
|
|
{ L"l2", 28592 },
|
|
{ L"latin1", 1252 },
|
|
{ L"latin2", 28592 },
|
|
{ L"ms_kanji", 932 },
|
|
{ L"shift-jis", 932 },
|
|
{ L"shift_jis", 932 },
|
|
{ L"us", 1252 },
|
|
{ L"us-ascii", 1252 },
|
|
{ L"windows-1250", 1250 },
|
|
{ L"windows-1251", 1251 },
|
|
{ L"windows-1252", 1252 },
|
|
{ L"windows-1253", 1253 },
|
|
{ L"windows-1254", 1254 },
|
|
{ L"windows-1255", 1255 },
|
|
{ L"windows-1256", 1256 },
|
|
{ L"windows-1257", 1257 },
|
|
{ L"windows-1258", 1258 },
|
|
{ L"windows-874", 874 },
|
|
{ L"x-cp1250", 1250 },
|
|
{ L"x-cp1251", 1251 },
|
|
{ L"x-euc", CODE_JPN_EUC },
|
|
{ L"x-euc-jp", CODE_JPN_EUC },
|
|
{ L"x-sjis", 932 },
|
|
{ L"x-x-big5", 950 },
|
|
};
|
|
|
|
const unsigned CCodePageTable::_cEntries = sizeof CCodePageTable::_aEntries /
|
|
sizeof CCodePageTable::_aEntries[0];
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: EntryCompare, private, static
|
|
//
|
|
// Synposis: Compares a string with a string in a CCodePageEntry.
|
|
// Called by bsearch.
|
|
//
|
|
// Arguments: [pwcKey] -- key for comparison
|
|
// [pEntry] -- entry for comparison
|
|
//
|
|
// Returns: < 0 if pwcKey < pEntry
|
|
// 0 if identical
|
|
// > 0 if pwcKey > pEntry
|
|
//
|
|
// History: 27-Aug-97 dlee Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
int __cdecl CCodePageTable::EntryCompare(
|
|
WCHAR const * pwcKey,
|
|
CCodePageEntry const * pEntry )
|
|
{
|
|
return wcscmp( pwcKey, pEntry->pwcName );
|
|
} //EntryCompare
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: Lookup, public, static
|
|
//
|
|
// Synposis: Finds a codepage based on string and returns the codepage
|
|
// The lookup is case-insensitive.
|
|
//
|
|
// Arguments: [pwcName] -- not-necessarily null terminated string
|
|
// [cwcName] -- # of wide characters in pwcName
|
|
// [ulCodePage] -- returns the corresponding codepage
|
|
//
|
|
// Returns: TRUE if the codepage name was found, FALSE otherwise
|
|
//
|
|
// History: 27-Aug-97 dlee Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL CCodePageTable::Lookup(
|
|
WCHAR const * pwcName,
|
|
unsigned cwcName,
|
|
ULONG & ulCodePage )
|
|
{
|
|
//
|
|
// Limit the length of codepage strings
|
|
//
|
|
|
|
WCHAR awcLowcase[ 100 ];
|
|
|
|
if ( cwcName >= ( sizeof awcLowcase / sizeof WCHAR ) )
|
|
return FALSE;
|
|
|
|
//
|
|
// Convert the string to lowercase.
|
|
//
|
|
|
|
RtlCopyMemory( awcLowcase, pwcName, cwcName * sizeof WCHAR );
|
|
awcLowcase[ cwcName ] = 0;
|
|
_wcslwr( awcLowcase );
|
|
|
|
//
|
|
// Try to find the codepage using the C runtime binary search function
|
|
//
|
|
|
|
CCodePageEntry * pEntry = (CCodePageEntry *)
|
|
bsearch( awcLowcase,
|
|
_aEntries,
|
|
_cEntries,
|
|
sizeof CCodePageEntry,
|
|
(int (__cdecl *)(const void *, const void *) )
|
|
EntryCompare );
|
|
|
|
if ( 0 == pEntry )
|
|
return FALSE;
|
|
|
|
ulCodePage = pEntry->ulCodePage;
|
|
return TRUE;
|
|
} //Lookup
|
|
|