int mk_wcswidth_cjk(const UTF16 *utf16_str, size_t n, int max_width, int &element_consumed) { const UTF16 *org = utf16_str; int w, width = 0; // FIXME: only BMP is supported here. for (;*utf16_str && n-- > 0 && width < max_width; utf16_str++) { const UTF16 *bak_str = utf16_str; int bak_width = width; if ((w = mk_wcwidth_cjk(*utf16_str)) < 0) { return -1; } else { width += w; } if (width > max_width) { utf16_str = bak_str; width = bak_width; if (utf16_str == org) { return -1; } else { break; } } } element_consumed = utf16_str - org; return width; }
int mk_wcswidth_cjk(const int* pwcs, size_t n) { int w, width = 0; for (; *pwcs && n-- > 0; pwcs++) if ((w = mk_wcwidth_cjk(*pwcs)) < 0) return -1; else width += w; return width; }
int mk_wcswidth_cjk(const UTF16 *utf16_str, size_t n) { int w, width = 0; // FIXME: only BMP is supported here. for (;*utf16_str && n-- > 0; utf16_str++) { if ((w = mk_wcwidth_cjk(*utf16_str)) < 0) return -1; else width += w; } return width; }
int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n) { int width = 0; for (;*pwcs && n-- > 0; pwcs++) { int w; if ((w = mk_wcwidth_cjk(*pwcs)) < 0) return -1; else width += w; } return width; }
int get_str_width(uint32_t ucs) { return mk_wcwidth_cjk(ucs); }