diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog index a0b2e3a3c..fbae524f4 100644 --- a/winsup/utils/ChangeLog +++ b/winsup/utils/ChangeLog @@ -1,3 +1,17 @@ +2010-04-28 Corinna Vinschen + + * locale.cc (print_lc_xxx_charset): Remove. + (enum type_t): Change according to the fact that nl_langinfo now returns + all locale category values. + (lc_ctype_names): Add new category members. Redefine for exclusive + nl_langinfo usage. + (lc_numeric_names): Ditto. + (lc_time_names): Ditto. + (lc_collate_names): Ditto. + (lc_monetary_names): Ditto. + (lc_messages_names): Ditto. + (print_lc): Change switch according to new type_t values. + 2010-03-27 Corinna Vinschen * locale.cc (print_charmaps): Add EUC-CN and GB2312. diff --git a/winsup/utils/locale.cc b/winsup/utils/locale.cc index 05ff2e23e..8dbfd9b30 100644 --- a/winsup/utils/locale.cc +++ b/winsup/utils/locale.cc @@ -510,19 +510,6 @@ print_lc_strings (int key, const char *name, int from, int to) fputc ('\n', stdout); } -void -print_lc_xxx_charset (int key, int lc_cat, const char *name) -{ - char lc_ctype_locale[32]; - char lc_xxx_locale[32]; - - strcpy (lc_ctype_locale, setlocale (LC_CTYPE, NULL)); - strcpy (lc_xxx_locale, setlocale (lc_cat, NULL)); - setlocale (LC_CTYPE, lc_xxx_locale); - print_lc_svalue (key, name, nl_langinfo (CODESET)); - setlocale (LC_CTYPE, lc_ctype_locale); -} - void print_lc_grouping (int key, const char *name, const char *grouping) { @@ -536,14 +523,12 @@ print_lc_grouping (int key, const char *name, const char *grouping) enum type_t { is_string_fake, - is_string_lconv, - is_int_lconv, - is_grouping_lconv, - is_string_linf, - is_mstrings_linf, - is_sepstrings_linf, - is_mb_cur_max, - is_codeset, + is_grouping, + is_string, + is_mstrings, + is_sepstrings, + is_int, + is_wchar, is_end }; @@ -555,10 +540,6 @@ struct lc_names_t size_t toval; }; -#define _O(M) __builtin_offsetof (struct lconv, M) -#define _MS(l,lc) (*(const char **)(((const char *)(l))+(lc)->fromval)) -#define _MI(l,lc) ((int)*(((const char *)(l))+(lc)->fromval)) - const char *fake_string[] = { "upper;lower;alpha;digit;xdigit;space;print;graph;blank;cntrl;punct;alnum", "upper\";\"lower\";\"alpha\";\"digit\";\"xdigit\";\"space\";\"print\";\"graph\";\"blank\";\"cntrl\";\"punct\";\"alnum", @@ -568,92 +549,114 @@ const char *fake_string[] = { lc_names_t lc_ctype_names[] = { - { "ctype-class-names",is_string_fake, 0, 0 }, - { "ctype-map-names", is_string_fake, 2, 0 }, - { "charmap", is_string_linf, CODESET, 0 }, - { "ctype-mb-cur-max", is_mb_cur_max, 0, 0 }, - { NULL, is_end, 0, 0 } + { "ctype-class-names", is_string_fake, 0, 0 }, + { "ctype-map-names", is_string_fake, 2, 0 }, + { "ctype-outdigit0_mb", is_string, _NL_CTYPE_OUTDIGITS0_MB, 0 }, + { "ctype-outdigit1_mb", is_string, _NL_CTYPE_OUTDIGITS1_MB, 0 }, + { "ctype-outdigit2_mb", is_string, _NL_CTYPE_OUTDIGITS2_MB, 0 }, + { "ctype-outdigit3_mb", is_string, _NL_CTYPE_OUTDIGITS3_MB, 0 }, + { "ctype-outdigit4_mb", is_string, _NL_CTYPE_OUTDIGITS4_MB, 0 }, + { "ctype-outdigit5_mb", is_string, _NL_CTYPE_OUTDIGITS5_MB, 0 }, + { "ctype-outdigit6_mb", is_string, _NL_CTYPE_OUTDIGITS6_MB, 0 }, + { "ctype-outdigit7_mb", is_string, _NL_CTYPE_OUTDIGITS7_MB, 0 }, + { "ctype-outdigit8_mb", is_string, _NL_CTYPE_OUTDIGITS8_MB, 0 }, + { "ctype-outdigit9_mb", is_string, _NL_CTYPE_OUTDIGITS9_MB, 0 }, + { "ctype-outdigit0_wc", is_wchar, _NL_CTYPE_OUTDIGITS0_WC, 0 }, + { "ctype-outdigit1_wc", is_wchar, _NL_CTYPE_OUTDIGITS1_WC, 0 }, + { "ctype-outdigit2_wc", is_wchar, _NL_CTYPE_OUTDIGITS2_WC, 0 }, + { "ctype-outdigit3_wc", is_wchar, _NL_CTYPE_OUTDIGITS3_WC, 0 }, + { "ctype-outdigit4_wc", is_wchar, _NL_CTYPE_OUTDIGITS4_WC, 0 }, + { "ctype-outdigit5_wc", is_wchar, _NL_CTYPE_OUTDIGITS5_WC, 0 }, + { "ctype-outdigit6_wc", is_wchar, _NL_CTYPE_OUTDIGITS6_WC, 0 }, + { "ctype-outdigit7_wc", is_wchar, _NL_CTYPE_OUTDIGITS7_WC, 0 }, + { "ctype-outdigit8_wc", is_wchar, _NL_CTYPE_OUTDIGITS8_WC, 0 }, + { "ctype-outdigit9_wc", is_wchar, _NL_CTYPE_OUTDIGITS9_WC, 0 }, + { "charmap", is_string, CODESET, 0 }, + { "ctype-mb-cur-max", is_int, _NL_CTYPE_MB_CUR_MAX, 0 }, + { NULL, is_end, 0, 0 } }; lc_names_t lc_numeric_names[] = { - { "decimal_point", is_string_lconv, _O(decimal_point), 0 }, - { "thousands_sep", is_string_lconv, _O(thousands_sep), 0 }, - { "grouping", is_grouping_lconv, _O(grouping), 0 }, - { "numeric-codeset", is_codeset, LC_NUMERIC, 0 }, - { NULL, is_end, 0, 0 } + { "decimal_point", is_string, RADIXCHAR, 0 }, + { "thousands_sep", is_string, THOUSEP, 0 }, + { "grouping", is_grouping, _NL_NUMERIC_GROUPING, 0 }, + { "numeric-decimal-point-wc", is_wchar, _NL_NUMERIC_DECIMAL_POINT_WC, 0 }, + { "numeric-thousands-sep-wc", is_wchar, _NL_NUMERIC_THOUSANDS_SEP_WC, 0 }, + { "numeric-codeset", is_string, _NL_NUMERIC_CODESET, 0 }, + { NULL, is_end, 0, 0 } }; lc_names_t lc_time_names[] = { - { "abday", is_mstrings_linf, ABDAY_1, ABDAY_7 }, - { "day", is_mstrings_linf, DAY_1, DAY_7 }, - { "abmon", is_mstrings_linf, ABMON_1, ABMON_12 }, - { "mon", is_mstrings_linf, MON_1, MON_12 }, - { "am_pm", is_mstrings_linf, AM_STR, PM_STR }, - { "d_t_fmt", is_string_linf, D_T_FMT, 0 }, - { "d_fmt", is_string_linf, D_FMT, 0 }, - { "t_fmt", is_string_linf, T_FMT, 0 }, - { "t_fmt_ampm", is_string_linf, T_FMT_AMPM, 0 }, - { "era", is_sepstrings_linf,ERA, 0 }, - { "era_d_fmt", is_string_linf, ERA_D_FMT, 0 }, - { "alt_digits", is_sepstrings_linf,ALT_DIGITS, 0 }, - { "era_d_t_fmt", is_string_linf, ERA_D_T_FMT, 0 }, - { "era_t_fmt", is_string_linf, ERA_T_FMT, 0 }, - { "date_fmt", is_string_linf, _DATE_FMT, 0 }, - { "time-codeset", is_codeset, LC_TIME, 0 }, - { NULL, is_end, 0, 0 } + { "abday", is_mstrings, ABDAY_1, ABDAY_7 }, + { "day", is_mstrings, DAY_1, DAY_7 }, + { "abmon", is_mstrings, ABMON_1, ABMON_12 }, + { "mon", is_mstrings, MON_1, MON_12 }, + { "am_pm", is_mstrings, AM_STR, PM_STR }, + { "d_t_fmt", is_string, D_T_FMT, 0 }, + { "d_fmt", is_string, D_FMT, 0 }, + { "t_fmt", is_string, T_FMT, 0 }, + { "t_fmt_ampm", is_string, T_FMT_AMPM, 0 }, + { "era", is_sepstrings, ERA, 0 }, + { "era_d_fmt", is_string, ERA_D_FMT, 0 }, + { "alt_digits", is_sepstrings,ALT_DIGITS, 0 }, + { "era_d_t_fmt", is_string, ERA_D_T_FMT, 0 }, + { "era_t_fmt", is_string, ERA_T_FMT, 0 }, + { "date_fmt", is_string, _DATE_FMT, 0 }, + { "time-codeset", is_string, _NL_TIME_CODESET, 0 }, + { NULL, is_end, 0, 0 } }; lc_names_t lc_collate_names[] = { - { "collate-codeset", is_codeset, LC_COLLATE, 0 }, - { NULL, is_end, 0, 0 } + { "collate-codeset", is_string, _NL_COLLATE_CODESET, 0 }, + { NULL, is_end, 0, 0 } }; lc_names_t lc_monetary_names[] = { - { "int_curr_symbol", is_string_lconv, _O(int_curr_symbol), 0 }, - { "currency_symbol", is_string_lconv, _O(currency_symbol), 0 }, - { "mon_decimal_point",is_string_lconv, _O(mon_decimal_point), 0 }, - { "mon_thousands_sep",is_string_lconv, _O(mon_thousands_sep), 0 }, - { "mon_grouping", is_grouping_lconv, _O(mon_grouping), 0 }, - { "positive_sign", is_string_lconv, _O(positive_sign), 0 }, - { "negative_sign", is_string_lconv, _O(negative_sign), 0 }, - { "int_frac_digits", is_int_lconv, _O(int_frac_digits), 0 }, - { "frac_digits", is_int_lconv, _O(frac_digits), 0 }, - { "p_cs_precedes", is_int_lconv, _O(p_cs_precedes), 0 }, - { "p_sep_by_space", is_int_lconv, _O(p_sep_by_space), 0 }, - { "n_cs_precedes", is_int_lconv, _O(n_cs_precedes), 0 }, - { "n_sep_by_space", is_int_lconv, _O(n_sep_by_space), 0 }, - { "p_sign_posn", is_int_lconv, _O(p_sign_posn), 0 }, - { "n_sign_posn", is_int_lconv, _O(n_sign_posn), 0 }, - { "int_p_cs_precedes",is_int_lconv, _O(int_p_cs_precedes), 0 }, - { "int_p_sep_by_space",is_int_lconv, _O(int_p_sep_by_space), 0 }, - { "int_n_cs_precedes",is_int_lconv, _O(int_n_cs_precedes), 0 }, - { "int_n_sep_by_space",is_int_lconv, _O(int_n_sep_by_space), 0 }, - { "int_p_sign_posn", is_int_lconv, _O(int_p_sign_posn), 0 }, - { "int_n_sign_posn", is_int_lconv, _O(int_n_sign_posn), 0 }, - { "monetary-codeset", is_codeset, LC_MONETARY, 0 }, - { NULL, is_end, 0, 0 } + { "int_curr_symbol", is_string, _NL_MONETARY_INT_CURR_SYMBOL, 0 }, + { "currency_symbol", is_string, _NL_MONETARY_CURRENCY_SYMBOL, 0 }, + { "mon_decimal_point", is_string, _NL_MONETARY_MON_DECIMAL_POINT, 0 }, + { "mon_thousands_sep", is_string, _NL_MONETARY_MON_THOUSANDS_SEP, 0 }, + { "mon_grouping", is_grouping, _NL_MONETARY_MON_GROUPING, 0 }, + { "positive_sign", is_string, _NL_MONETARY_POSITIVE_SIGN, 0 }, + { "negative_sign", is_string, _NL_MONETARY_NEGATIVE_SIGN, 0 }, + { "int_frac_digits", is_int, _NL_MONETARY_INT_FRAC_DIGITS, 0 }, + { "frac_digits", is_int, _NL_MONETARY_FRAC_DIGITS, 0 }, + { "p_cs_precedes", is_int, _NL_MONETARY_P_CS_PRECEDES, 0 }, + { "p_sep_by_space", is_int, _NL_MONETARY_P_SEP_BY_SPACE, 0 }, + { "n_cs_precedes", is_int, _NL_MONETARY_N_CS_PRECEDES, 0 }, + { "n_sep_by_space", is_int, _NL_MONETARY_N_SEP_BY_SPACE, 0 }, + { "p_sign_posn", is_int, _NL_MONETARY_P_SIGN_POSN, 0 }, + { "n_sign_posn", is_int, _NL_MONETARY_N_SIGN_POSN, 0 }, + { "int_p_cs_precedes", is_int, _NL_MONETARY_INT_P_CS_PRECEDES, 0 }, + { "int_p_sep_by_space", is_int, _NL_MONETARY_INT_P_SEP_BY_SPACE,0 }, + { "int_n_cs_precedes", is_int, _NL_MONETARY_INT_N_CS_PRECEDES, 0 }, + { "int_n_sep_by_space", is_int, _NL_MONETARY_INT_N_SEP_BY_SPACE,0 }, + { "int_p_sign_posn", is_int, _NL_MONETARY_INT_P_SIGN_POSN, 0 }, + { "int_n_sign_posn", is_int, _NL_MONETARY_INT_N_SIGN_POSN, 0 }, + { "monetary-decimal-point-wc", is_wchar, _NL_MONETARY_WMON_DECIMAL_POINT, 0 }, + { "monetary-thousands-sep-wc", is_wchar, _NL_MONETARY_WMON_THOUSANDS_SEP, 0 }, + { "monetary-codeset", is_string, _NL_MONETARY_CODESET, 0 }, + { NULL, is_end, 0, 0 } }; lc_names_t lc_messages_names[] = { - { "yesexpr", is_string_linf, YESEXPR, 0 }, - { "noexpr", is_string_linf, NOEXPR, 0 }, - { "yesstr", is_string_linf, YESSTR, 0 }, - { "nostr", is_string_linf, NOSTR, 0 }, - { "messages-codeset", is_codeset, LC_MESSAGES, 0 }, - { NULL, is_end, 0, 0 } + { "yesexpr", is_string, YESEXPR, 0 }, + { "noexpr", is_string, NOEXPR, 0 }, + { "yesstr", is_string, YESSTR, 0 }, + { "nostr", is_string, NOSTR, 0 }, + { "messages-codeset", is_string, _NL_MESSAGES_CODESET, 0 }, + { NULL, is_end, 0, 0 } }; void print_lc (int cat, int key, const char *category, const char *name, lc_names_t *lc_name) { - struct lconv *l = localeconv (); - if (cat) printf ("%s\n", category); for (lc_names_t *lc = lc_name; lc->type != is_end; ++lc) @@ -663,29 +666,24 @@ print_lc (int cat, int key, const char *category, const char *name, case is_string_fake: print_lc_svalue (key, lc->name, fake_string[lc->fromval + key]); break; - case is_string_lconv: - print_lc_svalue (key, lc->name, _MS (l, lc)); + case is_grouping: + print_lc_grouping (key, lc->name, nl_langinfo (lc->fromval)); break; - case is_int_lconv: - print_lc_ivalue (key, lc->name, _MI (l, lc)); - break; - case is_grouping_lconv: - print_lc_grouping (key, lc->name, _MS (l, lc)); - break; - case is_string_linf: + case is_string: print_lc_svalue (key, lc->name, nl_langinfo (lc->fromval)); break; - case is_sepstrings_linf: + case is_sepstrings: print_lc_sepstrings (key, lc->name, nl_langinfo (lc->fromval)); break; - case is_mstrings_linf: + case is_mstrings: print_lc_strings (key, lc->name, lc->fromval, lc->toval); break; - case is_mb_cur_max: - print_lc_ivalue (key, lc->name, MB_CUR_MAX); + case is_int: + print_lc_ivalue (key, lc->name, (int) *nl_langinfo (lc->fromval)); break; - case is_codeset: - print_lc_xxx_charset (key, lc->fromval, lc->name); + case is_wchar: + print_lc_ivalue (key, lc->name, + *(wchar_t *) nl_langinfo (lc->fromval)); break; default: break;