Index: xap_EncodingManager.cpp =================================================================== RCS file: /cvsroot/abi/src/af/xap/xp/xap_EncodingManager.cpp,v retrieving revision 1.32 diff -u -r1.32 xap_EncodingManager.cpp --- xap_EncodingManager.cpp 2001/04/27 06:01:32 1.32 +++ xap_EncodingManager.cpp 2001/05/23 10:14:39 @@ -27,6 +27,41 @@ #include #include +/*! + This macros allow the use of an iconv fallback name if needed. + The fallbackname is an arrary of strings. NULL marks the end. + If no valid fallbackname is found, set the destination to 'name'. + Or else, what can we do? + */ +#define CPNAME_OR_FALLBACK(destination,name,fallbackname) \ +{ \ + static char* fallback_macro_cpname = NULL; \ + if (!fallback_macro_cpname) \ + { \ + iconv_t macro_cd = iconv_open(name,name); \ + if (macro_cd == (iconv_t)-1) \ + { \ + const char** macro_cur = fallbackname; \ + for(;*macro_cur; macro_cur++) \ + { \ + macro_cd = iconv_open(*macro_cur, *macro_cur); \ + if(macro_cd != (iconv_t)-1) \ + { \ + fallback_macro_cpname = *macro_cur; \ + iconv_close(macro_cd); \ + break; \ + } \ + } \ + fallback_macro_cpname = name ; \ + } \ + else \ + { \ + fallback_macro_cpname = name; \ + iconv_close(macro_cd); \ + } \ + } \ + destination = fallback_macro_cpname; \ +} static iconv_t iconv_handle_N2U = NULL, iconv_handle_U2N = NULL, iconv_handle_U2Latin1 = NULL, @@ -375,6 +410,26 @@ return search_map_with_opt_suffix(m,fallback_key,fallback_key_final); }; +struct _map_to_array +{ + const char* key;//it can't be NULL for non-special entries like last or first + const char** values;//NULL-teminated array of strings +}; + +/* + * Search a map from char* to an array of char*. Return the found char** if + * key is found in the mapping, else return NULL. + */ +static const char** search_map_to_array(const _map_to_array* m,const char* key) +{ + const _map_to_array* cur = m+1; + for(;cur->key;++cur) + { + if (!UT_stricmp(cur->key,key)) + return cur->values; + } + return NULL; +}; /* ************************* here begin tables *************************/ /* this array describes mapping form current encoding to Tex's encoding name. @@ -431,7 +486,7 @@ Tested with GB2312 only. */ static const char* wincharsetcode_zh_GB2312[]= /* chinese*/ -{ "zh_CN.GB2312", "zh_TW.GB2312", NULL }; +{ "zh_CN.GBK", "zh_CN.GB2312", "zh_TW.GB2312", NULL }; static const char* wincharsetcode_zh_BIG5[]= /* chinese*/ { "zh_CN.BIG5", "zh_TW.BIG5", NULL }; @@ -496,12 +551,14 @@ This table is useful since iconv implementations don't know some cpNNNN charsets but under some different name. */ -static const _map MSCodepagename_to_charset_name_map[]= +static const char* GB_encode[] = {"GBK", "GB2312", NULL}; +static const char* BIG5_encode[] = {"BIG5", NULL}; +static const _map_to_array MSCodepagename_to_charset_name_map[]= { /*key, value*/ {NULL,NULL}, - {"CP936","GB2312"}, - {"CP950","BIG5"}, + {"CP936",GB_encode}, + {"CP950",BIG5_encode}, {NULL,NULL} }; @@ -514,6 +571,7 @@ { /*key,value*/ {NULL,NULL}, + {"GBK", "CP936"}, {"GB2312","CP936"}, {"BIG5","CP950"}, {NULL,NULL} @@ -526,6 +584,7 @@ {NULL}, {"zh_CN.BIG5", "0x404"}, {"zh_CN.GB2312", "0x804"}, + {"zh_CN.GBK", "0x804"}, {"zh_TW.BIG5", "0x404"}, {"zh_TW.GB2312", "0x804"}, {NULL} @@ -879,9 +938,11 @@ static char buf[100]; sprintf(buf,"CP%d",lid); char* cpname = buf; - bool is_default; - const char* ret = search_map(MSCodepagename_to_charset_name_map,cpname,&is_default); - return is_default ? cpname : ret; + char* destinate_charset = cpname; + const char** ret = search_map_to_array(MSCodepagename_to_charset_name_map,cpname); + if(ret) + CPNAME_OR_FALLBACK(destinate_charset, cpname, ret); + return !ret ? cpname : destinate_charset; }; const char* XAP_EncodingManager::CodepageFromCharset(char *charset) const @@ -895,9 +956,11 @@ const char* XAP_EncodingManager::WindowsCharsetName() const { char* cpname = wvLIDToCodePageConverter(getWinLanguageCode()); - bool is_default; - const char* ret = search_map(MSCodepagename_to_charset_name_map,cpname,&is_default); - return is_default ? cpname : ret; + char* destinate_charset = cpname; + const char** ret = search_map_to_array(MSCodepagename_to_charset_name_map,cpname); + if(ret) + CPNAME_OR_FALLBACK(destinate_charset, cpname, ret); + return !ret ? cpname : destinate_charset; }; UT_uint32 XAP_EncodingManager::getWinLanguageCode() const