iconv_t iconv_open(const char *to, const char *from) { unsigned f, t; int m; if ((t = find_charset(to)) > 8) return -1; if ((f = find_charset(from)) < 255) return 0 | (t<<1) | (f<<8); if ((m = find_charmap(from)) > -1) return 1 | (t<<1) | (m<<8); return -1; }
/*********************************************************************** * parse_locale_name * * Parse a locale name into a struct locale_name, handling both Windows and Unix formats. * Unix format is: lang[_country][.charset][@modifier] * Windows format is: lang[-script][-country][_modifier] */ static void parse_locale_name( const WCHAR *str, struct locale_name *name ) { static const WCHAR sepW[] = {'-','_','.','@',0}; static const WCHAR winsepW[] = {'-','_',0}; static const WCHAR posixW[] = {'P','O','S','I','X',0}; static const WCHAR cW[] = {'C',0}; static const WCHAR latinW[] = {'l','a','t','i','n',0}; static const WCHAR latnW[] = {'-','L','a','t','n',0}; WCHAR *p; int ind; // TRACE("%s\n", debugstr_w(str)); name->country = name->charset = name->script = name->modifier = NULL; name->lcid = MAKELCID( MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT), SORT_DEFAULT ); name->matches = 0; name->codepage = 0; name->win_name[0] = 0; lstrcpynW( name->lang, str, sizeof(name->lang)/sizeof(WCHAR) ); if (!(p = strpbrkW( name->lang, sepW ))) { if (!strcmpW( name->lang, posixW ) || !strcmpW( name->lang, cW )) { name->matches = 4; /* perfect match for default English lcid */ return; } strcpyW( name->win_name, name->lang ); } else if (*p == '-') /* Windows format */ { strcpyW( name->win_name, name->lang ); *p++ = 0; name->country = p; if (!(p = strpbrkW( p, winsepW ))) goto done; if (*p == '-') { *p++ = 0; name->script = name->country; name->country = p; if (!(p = strpbrkW( p, winsepW ))) goto done; } *p++ = 0; name->modifier = p; } else /* Unix format */ { if (*p == '_') { *p++ = 0; name->country = p; p = strpbrkW( p, sepW + 2 ); } if (p && *p == '.') { *p++ = 0; name->charset = p; p = strchrW( p, '@' ); } if (p) { *p++ = 0; name->modifier = p; } if (name->charset) name->codepage = find_charset( name->charset ); /* rebuild a Windows name if possible */ if (name->charset) goto done; /* can't specify charset in Windows format */ if (name->modifier && strcmpW( name->modifier, latinW )) goto done; /* only Latn script supported for now */ strcpyW( name->win_name, name->lang ); if (name->modifier) strcatW( name->win_name, latnW ); if (name->country) { p = name->win_name + strlenW(name->win_name); *p++ = '-'; strcpyW( p, name->country ); } } done: ; /* DEBUG printf("EnumResourceLanguagesW(...):\n"); printf(" name->win_name=%ls\n", name->win_name); printf(" name->lang=%ls\n", name->lang); printf(" name->country=%ls\n", name->country); printf(" name->codepage=%d\n", name->codepage); */ // EnumResourceLanguagesW( kernel32_handle, (LPCWSTR)RT_STRING, (LPCWSTR)LOCALE_ILANGUAGE, // find_locale_id_callback, (LPARAM)name ); ind = 0; while (g_langInfo[ind].LOCALE_SNAME) { BOOL ret = find_locale_id_callback(&g_langInfo[ind],name); if (ret == FALSE) break; ind++; } }