diff -r 87e86ac8b667 -r 2c9d399a58c0 usr/src/lib/liborchestrator/locale.c --- a/usr/src/lib/liborchestrator/locale.c Tue Aug 16 20:54:08 2011 +0000 +++ b/usr/src/lib/liborchestrator/locale.c Tue Aug 16 20:54:08 2011 +0000 @@ -22,6 +22,9 @@ * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ +/* + * Copyright 2011 Nexenta Systems, Inc. All rights reserved. + */ #include #include @@ -80,17 +83,12 @@ char *lang_code; } chinese_values[] = { {"zh", SIMPLIFIED_CHINESE, "sc"}, - {"zh.GBK", SIMPLIFIED_CHINESE, "sc"}, - {"zh.UTF-8", SIMPLIFIED_CHINESE, "sc"}, {"zh_CN", SIMPLIFIED_CHINESE, "sc"}, - {"zh_CN.GB18030", SIMPLIFIED_CHINESE, "sc"}, - {"zh_CN.UTF-8", SIMPLIFIED_CHINESE, "sc"}, {"zh_HK", TRADITIONAL_CHINESE, "tc"}, - {"zh_HK.BIG5HK", TRADITIONAL_CHINESE, "tc"}, - {"zh_HK.UTF-8", TRADITIONAL_CHINESE, "tc"}, + {"zh_MO", TRADITIONAL_CHINESE, "tc"}, + {"zh_SG", TRADITIONAL_CHINESE, "tc"}, {"zh_TW", TRADITIONAL_CHINESE, "tc"}, - {"zh_TW.BIG5", TRADITIONAL_CHINESE, "tc"}, - {"zh_TW.UTF-8", TRADITIONAL_CHINESE, "tc"} + { NULL } }; @@ -124,6 +122,7 @@ static void sort_lang_list(char **unsorted_list, int total); static char *substitute_chinese_language(char *locale, char **code); static char *substitute_C_POSIX_language(char **code); +static char *substitute_language(char *locale, char **code); static void update_init(FILE *fp, char *locale); static void update_env(char *locale); @@ -642,8 +641,8 @@ lang_info_t *tmp, *last, *new; locale_info_t *lp = NULL; char **trans_lang = NULL; + char *sub = NULL; char *tmp_lang = NULL; - char *tmp_locale = NULL; char *code = NULL; char *desc = NULL; int total; @@ -653,18 +652,16 @@ * For Chinese we have to handle it specially. There is Traditional * Chinese or Simplified Chinese. Everything else is a locale. */ - if (strncmp(lang, "zh", 2) == 0) { - tmp_lang = strdup(dgettext(TEXT_DOMAIN, - substitute_chinese_language(lang, &code))); - if (locale == NULL) - tmp_locale = strdup(dgettext(TEXT_DOMAIN, lang)); + sub = substitute_language(lang, &code); + + if (sub != NULL) { + tmp_lang = strdup(sub); + if (tmp_lang == NULL) + goto error; } - if (strncmp(lang, "C", 1) == 0) { - tmp_lang = strdup(dgettext(TEXT_DOMAIN, - substitute_C_POSIX_language(&code))); - if (locale == NULL) - tmp_locale = strdup(dgettext(TEXT_DOMAIN, lang)); - } + + if (locale == NULL) + locale = dgettext(TEXT_DOMAIN, lang); new = (lang_info_t *)malloc(sizeof (lang_info_t)); if (new == NULL) @@ -696,7 +693,7 @@ new->def_lang = is_default; - if (locale != NULL || tmp_locale != NULL) { + if (locale != NULL) { lp = (locale_info_t *)malloc(sizeof (locale_info_t)); if (lp == NULL) { om_set_error(OM_NO_SPACE); @@ -704,11 +701,7 @@ } (void) memset(lp, 0, sizeof (locale_info_t)); - if (tmp_locale) { - lp->locale_name = tmp_locale; - } else { - lp->locale_name = strdup(locale); - } + lp->locale_name = strdup(locale); if (lp->locale_name == NULL) { om_set_error(OM_NO_SPACE); goto error; @@ -743,12 +736,10 @@ list = new; } - free(code); *(return_list) = list; return (OM_SUCCESS); error: - free(code); om_free_lang_info(new); om_free_locale_info(lp); return (OM_FAILURE); @@ -776,7 +767,7 @@ get_lang_entry(char *lang_name, lang_info_t *search_list) { lang_info_t *list = NULL; - char *tmp_lang = NULL; + char *sub = NULL; char *code = NULL; boolean_t found = B_FALSE; @@ -786,10 +777,7 @@ * Chinese language names are stored differently. */ - if (strncmp(lang_name, "zh", 2) == 0) { - tmp_lang = strdup(dgettext(TEXT_DOMAIN, - substitute_chinese_language(lang_name, &code))); - } + sub = substitute_language(lang_name, &code); for (list = search_list; list != NULL; list = list->next) { if (code) { @@ -805,9 +793,6 @@ } } - free(tmp_lang); - free(code); - if (!found) return (NULL); return (list); @@ -939,7 +924,8 @@ } } } else if (strcmp(lang, "C") == 0 || - strcmp(lang, "POSIX") == 0) { + strcmp(lang, "POSIX") == 0 || + strcmp(lang, "C/POSIX") == 0) { free(lang); lang = strdup("en"); is_default = B_TRUE; @@ -1146,7 +1132,8 @@ } } } else if (strcmp(lang, "C") == 0 || - strcmp(lang, "POSIX") == 0) { + strcmp(lang, "POSIX") == 0 || + strcmp(lang, "C/POSIX") == 0) { free(lang); lang = strdup("en"); if (lang == NULL) { @@ -1577,16 +1564,15 @@ char **lpp = *list; char **tmp_list; char *tmp = NULL; + char *sub = NULL; char *code; tmp_list = *list; - if (strncmp(locale, "zh", 2) == 0) { - tmp = strdup(dgettext(TEXT_DOMAIN, - substitute_chinese_language(locale, &code))); - } else if (strcmp(locale, "C") == 0 || strcmp(locale, "POSIX") == 0 || - strcmp(locale, "C/POSIX") == 0) { - tmp = strdup(dgettext(TEXT_DOMAIN, "English")); + sub = substitute_language(locale, &code); + + if (sub != NULL) { + tmp = strdup(sub); } else { tmp = strdup(dgettext(TEXT_DOMAIN, orchestrator_lang_list[j].lang_name)); @@ -1642,6 +1628,7 @@ } return (B_FALSE); } + static char * substitute_C_POSIX_language(char **code) { @@ -1651,18 +1638,8 @@ * locale is C and or POSIX. Set to English, set code * to 'en'. */ - lang = strdup(dgettext(TEXT_DOMAIN, "English")); - if (lang == NULL) { - om_set_error(OM_NO_SPACE); - *code = NULL; - return (lang); - } - *code = strdup("en"); - if (*code == NULL) { - free(lang); - lang = NULL; - om_set_error(OM_NO_SPACE); - } + lang = dgettext(TEXT_DOMAIN, "English"); + *code = "en"; return (lang); } @@ -1670,26 +1647,41 @@ substitute_chinese_language(char *locale, char **code) { int i; + int len; char *sub = NULL; - *code = NULL; - - for (i = 0; chinese_values[i].lang; i++) { - if (strcmp(locale, chinese_values[i].lang) == 0) { - sub = strdup(chinese_values[i].lang_name); - *code = strdup(chinese_values[i].lang_code); - if (sub == NULL || *code == NULL) { - free(sub); - om_set_error(OM_NO_SPACE); - return (NULL); - } else { - return (sub); - } + for (i = 0; chinese_values[i].lang != NULL; i++) { + len = strlen(chinese_values[i].lang); + if ((strncmp(locale, chinese_values[i].lang, len) == 0) && + (locale[len] == '\0' || locale[len] == '.')) { + sub = + dgettext(TEXT_DOMAIN, chinese_values[i].lang_name); + *code = chinese_values[i].lang_code; + return (sub); } } + + om_set_error(OM_INVALID_LOCALE); return (sub); } +static char * +substitute_language(char *locale, char **code) +{ + char *lang = NULL; + + if (strncmp(locale, "zh", 2) == 0) { + lang = substitute_chinese_language(locale, code); + if (lang == NULL) + goto error; + } else if (strcmp(locale, "C") == 0 || strcmp(locale, "POSIX") == 0) { + lang = substitute_C_POSIX_language(code); + } + +error: + return (lang); +} + static void sort_lang_list(char **unsorted_list, int total) {