--- /dev/null
+#include "unicode_config.h"
+#include "unicode.h"
+
+#include "eastasianwidth.h"
+#include "linebreaktab_internal.h"
+
+#include <stdlib.h>
+
+int unicode_wcwidth(unicode_char c)
+{
+ size_t b=0;
+ size_t e=sizeof(unicode_wcwidth_tab)/sizeof(unicode_wcwidth_tab[0]);
+
+ while (b < e)
+ {
+ size_t n=b + (e-b)/2;
+
+ if (c >= unicode_wcwidth_tab[n][0])
+ {
+ if (c <= unicode_wcwidth_tab[n][1])
+ return 2;
+ b=n+1;
+ }
+ else
+ {
+ e=n;
+ }
+ }
+
+ switch (unicode_lb_lookup(c)) {
+ case UNICODE_LB_BK:
+ case UNICODE_LB_CR:
+ case UNICODE_LB_LF:
+ case UNICODE_LB_CM:
+ case UNICODE_LB_NL:
+ case UNICODE_LB_WJ:
+ case UNICODE_LB_ZW:
+ return 0;
+ default:
+ break;
+ }
+ return 1;
+}
+
+int unicode_isspace(unicode_char ch)
+{
+ if (ch == 9)
+ return 1;
+
+ switch (unicode_lb_lookup(ch)) {
+ case UNICODE_LB_BK:
+ case UNICODE_LB_CR:
+ case UNICODE_LB_LF:
+ case UNICODE_LB_NL:
+ case UNICODE_LB_SP:
+ return 1;
+ }
+
+ return 0;
+}
+
+size_t unicode_wcwidth_str(const unicode_char *c)
+{
+ size_t w=0;
+
+ while (*c)
+ w += unicode_wcwidth(*c++);
+
+
+ return w;
+}