#include #include static rune* rangesearch(rune c, rune *t, int n, int ne) { rune *p; int m; while(n > 1) { m = n >> 1; p = t + m*ne; if(c >= p[0]){ t = p; n = n-m; }else n = m; } if(n && c >= t[0]) return t; return 0; } static rune width0_range[] = { 0x2028, 0x2029, }; static int iswidth0(rune c) { rune *p; p = rangesearch(c, width0_range, arrlen(width0_range)/2, 2); if(p && c >= p[0] && c <= p[1]) return 1; return 0; } static rune width1_single[] = { 0x00ad, }; static int iswidth1(rune c) { rune *p; p = rangesearch(c, width1_single, arrlen(width1_single), 1); if(p && c == p[0]) return 1; return 0; } static int iswidth2(rune c) { rune *p; return 0; } int utf8·runewidth(rune c) { if(iswidth1(c)) return 1; if(iswidth2(c)) return 2; return 0; }