//+--------------------------------------------------------------------------- // // 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 #pragma hdrstop #include 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