diff options
author | Torsten Bögershausen <tboegi@web.de> | 2014-05-09 23:51:38 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-05-12 10:20:46 -0700 |
commit | 08460345b5a221c0076a48c6be875d64b78b6015 (patch) | |
tree | 95f5a3a644aa5ad69f4f2c93d12fd319a593c2c7 | |
parent | d813ab970db8b57b70bdd1b7e5feddec1c3fd84e (diff) | |
download | git-08460345b5a221c0076a48c6be875d64b78b6015.tar.gz |
utf8.c: use a table for double_width
Refactor git_wcwidth() and replace the if-else-if chain.
Use the table double_width which is scanned by the bisearch() function,
which is already used to find combining code points.
Signed-off-by: Torsten Bögershausen <tboegi@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | utf8.c | 41 |
1 files changed, 18 insertions, 23 deletions
@@ -126,6 +126,19 @@ static int git_wcwidth(ucs_char_t ch) { 0x1D1AA, 0x1D1AD }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, { 0xE0100, 0xE01EF } }; + static const struct interval double_width[] = { + { 0x1100, 0x115F }, + { 0x2329, 0x232A }, + { 0x2E80, 0x303E }, + { 0x3040, 0xA4CF }, + { 0xAC00, 0xD7A3 }, + { 0xF900, 0xFAFF }, + { 0xFE30, 0xFE6F }, + { 0xFF00, 0xFF60 }, + { 0xFFE0, 0xFFE6 }, + { 0x20000, 0x2FFFD }, + { 0x30000, 0x3FFFD } + }; /* test for 8-bit control characters */ if (ch == 0) @@ -138,30 +151,12 @@ static int git_wcwidth(ucs_char_t ch) / sizeof(struct interval) - 1)) return 0; - /* - * If we arrive here, ch is neither a combining nor a C0/C1 - * control character. - */ + /* binary search in table of double width characters */ + if (bisearch(ch, double_width, sizeof(double_width) + / sizeof(struct interval) - 1)) + return 2; - return 1 + - (ch >= 0x1100 && - /* Hangul Jamo init. consonants */ - (ch <= 0x115f || - ch == 0x2329 || ch == 0x232a || - /* CJK ... Yi */ - (ch >= 0x2e80 && ch <= 0xa4cf && - ch != 0x303f) || - /* Hangul Syllables */ - (ch >= 0xac00 && ch <= 0xd7a3) || - /* CJK Compatibility Ideographs */ - (ch >= 0xf900 && ch <= 0xfaff) || - /* CJK Compatibility Forms */ - (ch >= 0xfe30 && ch <= 0xfe6f) || - /* Fullwidth Forms */ - (ch >= 0xff00 && ch <= 0xff60) || - (ch >= 0xffe0 && ch <= 0xffe6) || - (ch >= 0x20000 && ch <= 0x2fffd) || - (ch >= 0x30000 && ch <= 0x3fffd))); + return 1; } /* |