/* * * Copyright (c) 2016 Konstantin Pugin * Konstantin Pugin (ria.freelander@gmail.com) * * Licensed under the LGPL v3. * * A 'locale' command implementation for musl. * */ #include "categories.h" #include #include struct cat_item lc_time_cats [] = { {ABDAY_1,"abday",CAT_TYPE_STRINGARRAY,ABDAY_1,ABDAY_7}, {DAY_1,"day",CAT_TYPE_STRINGARRAY,DAY_1,DAY_7}, {ABMON_1,"abmon",CAT_TYPE_STRINGARRAY,ABMON_1,ABMON_12}, {MON_1,"mon",CAT_TYPE_STRINGARRAY,MON_1,MON_12}, {AM_STR,"am_pm", CAT_TYPE_STRINGARRAY,AM_STR,PM_STR}, {D_T_FMT,"d_t_fmt", CAT_TYPE_STRING,0,0}, {D_FMT,"d_fmt", CAT_TYPE_STRING,0,0}, {T_FMT,"t_fmt", CAT_TYPE_STRING,0,0}, {ERA,"era", CAT_TYPE_STRING,0,0}, {ERA_D_FMT,"era_d_fmt", CAT_TYPE_STRING,0,0}, {ALT_DIGITS,"alt_digits", CAT_TYPE_STRING,0,0}, {ERA_D_T_FMT,"era_d_t_fmt", CAT_TYPE_STRING,0,0}, {ERA_T_FMT,"era_t_fmt", CAT_TYPE_STRING,0,0}, {0,"", CAT_TYPE_END,0,0} }; struct cat_item lc_ctype_cats [] = { {CODESET, "charmap", CAT_TYPE_STRING,0,0}, {0,"", CAT_TYPE_END,0,0} }; struct cat_item lc_messages_cats [] = { {YESEXPR, "yesexpr",CAT_TYPE_STRING,0,0}, {NOEXPR, "noexpr",CAT_TYPE_STRING,0,0}, #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) {YESSTR, "yesstr",CAT_TYPE_STRING,0,0}, {NOSTR, "nostr",CAT_TYPE_STRING,0,0}, #endif {0,"", CAT_TYPE_END,0,0} }; struct cat_item lc_numeric_cats [] = { {RADIXCHAR, "decimal_point",CAT_TYPE_STRING,0,0}, {THOUSEP, "thousands_sep",CAT_TYPE_STRING,0,0}, {0,"", CAT_TYPE_END,0,0} }; struct cat_item lc_monetary_cats [] = { {CRNCYSTR, "crncystr",CAT_TYPE_STRING,0,0}, {0,"", CAT_TYPE_END,0,0} }; struct cat_item lc_collate_cats [] = { {0,"", CAT_TYPE_END,0,0} }; struct cat_item* cats[] = { lc_ctype_cats, lc_numeric_cats, lc_time_cats, lc_collate_cats, lc_monetary_cats, lc_messages_cats }; const struct cat_item get_cat_item_for_name(const char *name) { struct cat_item invalid = {0,"", CAT_TYPE_END,0,0}; for(int i = 0; i < LC_ALL; i++) { for(int j = 0; cats[i][j].type != CAT_TYPE_END; j++) { if(!strcmp(name,cats[i][j].name)) return cats[i][j]; } } return invalid; } const char* get_cat_name_for_item_name(const char *name) { for(int i = 0; i < LC_ALL; i++) { for(int j = 0; cats[i][j].type != CAT_TYPE_END; j++) { if(!strcmp(name,cats[i][j].name)) return get_name_for_cat(i); } } return ""; } const struct cat_item* get_cat_for_locale_cat(int locale_cat) { return cats[locale_cat]; } int get_cat_num_for_name(const char* cat_name) { if (!strcmp(cat_name,"LC_CTYPE")) return LC_CTYPE; if (!strcmp(cat_name,"LC_NUMERIC")) return LC_NUMERIC; if (!strcmp(cat_name,"LC_TIME")) return LC_TIME; if (!strcmp(cat_name,"LC_COLLATE")) return LC_COLLATE; if (!strcmp(cat_name,"LC_MONETARY")) return LC_MONETARY; if (!strcmp(cat_name,"LC_MESSAGES")) return LC_MESSAGES; return LC_INVAL; } const char *get_name_for_cat(int cat_no) { if (cat_no == LC_CTYPE) return "LC_CTYPE"; if (cat_no == LC_NUMERIC) return "LC_NUMERIC"; if (cat_no == LC_TIME) return "LC_TIME"; if (cat_no == LC_COLLATE) return "LC_COLLATE"; if (cat_no == LC_MONETARY) return "LC_MONETARY"; if (cat_no == LC_MESSAGES) return "LC_MESSAGES"; return ""; }