summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Bögershausen <tboegi@web.de>2014-05-09 21:51:38 (GMT)
committerJunio C Hamano <gitster@pobox.com>2014-05-12 17:20:46 (GMT)
commit08460345b5a221c0076a48c6be875d64b78b6015 (patch)
tree95f5a3a644aa5ad69f4f2c93d12fd319a593c2c7
parentd813ab970db8b57b70bdd1b7e5feddec1c3fd84e (diff)
downloadgit-08460345b5a221c0076a48c6be875d64b78b6015.zip
git-08460345b5a221c0076a48c6be875d64b78b6015.tar.gz
git-08460345b5a221c0076a48c6be875d64b78b6015.tar.bz2
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.c41
1 files changed, 18 insertions, 23 deletions
diff --git a/utf8.c b/utf8.c
index 536a9c8..5134552 100644
--- a/utf8.c
+++ b/utf8.c
@@ -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;
}
/*