windows-nt/Source/XPSP1/NT/inetsrv/query/qutil/querylib/cphash.cxx
2020-09-26 16:20:57 +08:00

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