static void language_name_get_codeset_details (const char *language_name, char **pcodeset, gboolean *is_utf8) { locale_t locale; locale_t old_locale; const char *codeset = NULL; locale = newlocale (LC_CTYPE_MASK, language_name, (locale_t) 0); if (locale == (locale_t) 0) return; old_locale = uselocale (locale); codeset = nl_langinfo (CODESET); if (pcodeset != NULL) { *pcodeset = g_strdup (codeset); } if (is_utf8 != NULL) { g_autofree char *normalized_codeset = normalize_codeset (codeset); *is_utf8 = strcmp (normalized_codeset, "UTF-8") == 0; } uselocale (old_locale); freelocale (locale); }
static void language_name_get_codeset_details (const char *language_name, char **pcodeset, gboolean *is_utf8) { char *old_locale; char *codeset; old_locale = g_strdup (setlocale (LC_CTYPE, NULL)); if (setlocale (LC_CTYPE, language_name) == NULL) { g_free (old_locale); return; } codeset = nl_langinfo (CODESET); if (pcodeset != NULL) { *pcodeset = g_strdup (codeset); } if (is_utf8 != NULL) { codeset = normalize_codeset (codeset); *is_utf8 = strcmp (codeset, "utf8") == 0; g_free (codeset); } setlocale (LC_CTYPE, old_locale); g_free (old_locale); }
/* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value to decide the defaults for 8-bit character input and output. Returns 1 if we set eight-bit mode. */ int _rl_init_eightbit () { /* If we have setlocale(3), just check the current LC_CTYPE category value, and go into eight-bit mode if it's not C or POSIX. */ #if defined (HAVE_SETLOCALE) char *t; /* Set the LC_CTYPE locale category from environment variables. */ t = setlocale (LC_CTYPE, ""); if (t && *t && (t[0] != 'C' || t[1]) && (STREQ (t, "POSIX") == 0)) { _rl_meta_flag = 1; _rl_convert_meta_chars_to_ascii = 0; _rl_output_meta_chars = 1; return (1); } else return (0); #else /* !HAVE_SETLOCALE */ char *lspec, *t; int i; /* We don't have setlocale. Finesse it. Check the environment for the appropriate variables and set eight-bit mode if they have the right values. */ lspec = get_env_value ("LC_ALL"); if (lspec == 0) lspec = get_env_value ("LC_CTYPE"); if (lspec == 0) lspec = get_env_value ("LANG"); if (lspec == 0 || (t = normalize_codeset (lspec)) == 0) return (0); for (i = 0; t && legal_lang_values[i]; i++) if (STREQ (t, legal_lang_values[i])) { _rl_meta_flag = 1; _rl_convert_meta_chars_to_ascii = 0; _rl_output_meta_chars = 1; break; } free (t); return (legal_lang_values[i] ? 1 : 0); #endif /* !HAVE_SETLOCALE */ }
/** * gnome_parse_locale: * @locale: a locale string * @language_codep: (out) (allow-none) (transfer full): location to * store the language code, or %NULL * @country_codep: (out) (allow-none) (transfer full): location to * store the country code, or %NULL * @codesetp: (out) (allow-none) (transfer full): location to * store the codeset, or %NULL * @modifierp: (out) (allow-none) (transfer full): location to * store the modifier, or %NULL * * Extracts the various components of a locale string of the form * [language[_country][.codeset][@modifier]]. See * http://en.wikipedia.org/wiki/Locale. * * Return value: %TRUE if parsing was successful. * * Since: 3.8 */ gboolean gnome_parse_locale (const char *locale, char **language_codep, char **country_codep, char **codesetp, char **modifierp) { static GRegex *re = NULL; GMatchInfo *match_info; gboolean res; gboolean retval; match_info = NULL; retval = FALSE; if (re == NULL) { GError *error = NULL; re = g_regex_new ("^(?P<language>[^_.@[:space:]]+)" "(_(?P<territory>[[:upper:]]+))?" "(\\.(?P<codeset>[-_0-9a-zA-Z]+))?" "(@(?P<modifier>[[:ascii:]]+))?$", 0, 0, &error); if (re == NULL) { g_warning ("%s", error->message); g_error_free (error); goto out; } } if (!g_regex_match (re, locale, 0, &match_info) || g_match_info_is_partial_match (match_info)) { g_warning ("locale '%s' isn't valid\n", locale); goto out; } res = g_match_info_matches (match_info); if (! res) { g_warning ("Unable to parse locale: %s", locale); goto out; } retval = TRUE; if (language_codep != NULL) { *language_codep = g_match_info_fetch_named (match_info, "language"); } if (country_codep != NULL) { *country_codep = g_match_info_fetch_named (match_info, "territory"); if (*country_codep != NULL && *country_codep[0] == '\0') { g_free (*country_codep); *country_codep = NULL; } } if (codesetp != NULL) { *codesetp = g_match_info_fetch_named (match_info, "codeset"); if (*codesetp != NULL && *codesetp[0] == '\0') { g_free (*codesetp); *codesetp = NULL; } } if (modifierp != NULL) { *modifierp = g_match_info_fetch_named (match_info, "modifier"); if (*modifierp != NULL && *modifierp[0] == '\0') { g_free (*modifierp); *modifierp = NULL; } } if (codesetp != NULL && *codesetp != NULL) { g_autofree gchar *normalized_codeset = NULL; g_autofree gchar *normalized_name = NULL; normalized_codeset = normalize_codeset (*codesetp); normalized_name = construct_language_name (language_codep ? *language_codep : NULL, country_codep ? *country_codep : NULL, normalized_codeset, modifierp ? *modifierp : NULL); if (language_name_is_valid (normalized_name)) { g_free (*codesetp); *codesetp = g_steal_pointer (&normalized_codeset); } } out: g_match_info_free (match_info); return retval; }