// used in character.c, ../gnuwin32/console.c , ../library/grDevices/src/devP*.c : int Ri18n_wcwidth(wchar_t c) { char lc_str[128]; unsigned int i, j; static char *lc_cache = ""; static int lc = 0; if (0 != strcmp(setlocale(LC_CTYPE, NULL), lc_cache)) { strncpy(lc_str, setlocale(LC_CTYPE, NULL), sizeof(lc_str)); lc_str[sizeof(lc_str) - 1] = '\0'; for (i = 0, j = (int) strlen(lc_str); i < j && i < sizeof(lc_str); i++) lc_str[i] = (char) toupper(lc_str[i]); for (i = 0; i < (sizeof(cjk_locale_name)/sizeof(cjk_locale_name_t)); i++) { if (0 == strncmp(cjk_locale_name[i].name, lc_str, strlen(cjk_locale_name[i].name))) { lc = cjk_locale_name[i].locale; break; } } } int wd = wcwidthsearch(c, table_wcwidth, (sizeof(table_wcwidth)/sizeof(struct interval_wcwidth)), lc); if (wd >= 0) return wd; // currently all are 1 or 2. int zw = wcsearch(c, zero_width, zero_width_count); return zw ? 0 : 1; // assume unknown chars are width one. }
/* used in grDevices */ int Ri18n_wcwidth(wchar_t c) { char lc_str[128]; unsigned int i, j; static char *lc_cache = ""; static int lc = 0; if (0 != strcmp(setlocale(LC_CTYPE, NULL), lc_cache)) { strncpy(lc_str, setlocale(LC_CTYPE, NULL), sizeof(lc_str)); for (i = 0, j = (int) strlen(lc_str); i < j && i < sizeof(lc_str); i++) lc_str[i] = (char) toupper(lc_str[i]); for (i = 0; i < (sizeof(cjk_locale_name)/sizeof(cjk_locale_name_t)); i++) { if (0 == strncmp(cjk_locale_name[i].name, lc_str, strlen(cjk_locale_name[i].name))) { lc = cjk_locale_name[i].locale; break; } } } return(wcwidthsearch(c, table_wcwidth, (sizeof(table_wcwidth)/sizeof(struct interval_wcwidth)), lc)); }