STATIC #endif const char * _g_locale_charset_unalias (const char *codeset) { const char *aliases; if (codeset == NULL) /* The canonical name cannot be determined. */ codeset = ""; /* Resolve alias. */ for (aliases = _g_locale_get_charset_aliases (); *aliases != '\0'; aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) if (strcmp (codeset, aliases) == 0 || (aliases[0] == '*' && aliases[1] == '\0')) { codeset = aliases + strlen (aliases) + 1; break; } /* Don't return an empty string. GNU libc and GNU libiconv interpret the empty string as denoting "the locale's character encoding", thus GNU libiconv would call this function a second time. */ if (codeset[0] == '\0') codeset = "ASCII"; return codeset; }
static GHashTable * get_alias_hash (void) { #if !(EMULATOR) static GHashTable *alias_hash = NULL; #endif /* EMULATOR */ const char *aliases; G_LOCK (aliases); if (!alias_hash) { alias_hash = g_hash_table_new (g_str_hash, g_str_equal); aliases = _g_locale_get_charset_aliases (); while (*aliases != '\0') { const char *canonical; const char *alias; const char **alias_array; int count = 0; alias = aliases; aliases += strlen (aliases) + 1; canonical = aliases; aliases += strlen (aliases) + 1; alias_array = g_hash_table_lookup (alias_hash, canonical); if (alias_array) { while (alias_array[count]) count++; } alias_array = g_renew (const char *, alias_array, count + 2); alias_array[count] = alias; alias_array[count + 1] = NULL; g_hash_table_insert (alias_hash, (char *)canonical, alias_array); } }
STATIC #endif const char * _g_locale_charset () { const char *codeset; const char *aliases; #ifndef WIN32 # if HAVE_LANGINFO_CODESET /* Most systems support nl_langinfo (CODESET) nowadays. */ codeset = nl_langinfo (CODESET); # else /* On old systems which lack it, use setlocale or getenv. */ const char *locale = NULL; /* But most old systems don't have a complete set of locales. Some (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't use setlocale here; it would return "C" when it doesn't support the locale name the user has set. */ # if HAVE_SETLOCALE && 0 locale = setlocale (LC_CTYPE, NULL); # endif if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } } /* On some old systems, one used to set locale = "iso8859_1". On others, you set it to "language_COUNTRY.charset". In any case, we resolve it through the charset.alias file. */ codeset = locale; # endif #else /* WIN32 */ static char buf[2 + 10 + 1]; /* Win32 has a function returning the locale's codepage as a number. */ sprintf (buf, "CP%u", GetACP ()); codeset = buf; #endif if (codeset == NULL) /* The canonical name cannot be determined. */ codeset = ""; /* Resolve alias. */ for (aliases = _g_locale_get_charset_aliases (); *aliases != '\0'; aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) if (strcmp (codeset, aliases) == 0 || (aliases[0] == '*' && aliases[1] == '\0')) { codeset = aliases + strlen (aliases) + 1; break; } return codeset; }