Created
October 15, 2012 21:01
-
-
Save silenvx/3895445 to your computer and use it in GitHub Desktop.
tmuxで文字幅を取得するのにwcwidth()を使うpatch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -Narup tmux-1.7.orig/server.c tmux-1.7/server.c | |
--- tmux-1.7.orig/server.c 2012-10-22 08:33:58.919711591 +0900 | |
+++ tmux-1.7/server.c 2012-10-22 08:34:23.434132192 +0900 | |
@@ -151,7 +151,6 @@ server_start(int lockfd, char *lockfile) | |
ARRAY_INIT(&global_buffers); | |
mode_key_init_trees(); | |
key_bindings_init(); | |
- utf8_build(); | |
start_time = time(NULL); | |
log_debug("socket path %s", socket_path); | |
diff -Narup tmux-1.7.orig/tmux.h tmux-1.7/tmux.h | |
--- tmux-1.7.orig/tmux.h 2012-10-22 08:33:58.859700755 +0900 | |
+++ tmux-1.7/tmux.h 2012-10-22 08:34:23.437466127 +0900 | |
@@ -2280,7 +2280,6 @@ void session_group_synchronize1(struct | |
void session_renumber_windows(struct session *); | |
/* utf8.c */ | |
-void utf8_build(void); | |
int utf8_open(struct utf8_data *, u_char); | |
int utf8_append(struct utf8_data *, u_char); | |
u_int utf8_combine(const struct utf8_data *); | |
diff -Narup tmux-1.7.orig/utf8.c tmux-1.7/utf8.c | |
--- tmux-1.7.orig/utf8.c 2012-10-22 08:33:58.826361398 +0900 | |
+++ tmux-1.7/utf8.c 2012-10-22 08:42:07.684522024 +0900 | |
@@ -19,185 +19,11 @@ | |
#include <sys/types.h> | |
#include <string.h> | |
+#include <locale.h> | |
+#include <wchar.h> | |
#include "tmux.h" | |
-struct utf8_width_entry { | |
- u_int first; | |
- u_int last; | |
- | |
- int width; | |
- | |
- struct utf8_width_entry *left; | |
- struct utf8_width_entry *right; | |
-}; | |
- | |
-/* Random order. Not optimal but it'll do for now... */ | |
-struct utf8_width_entry utf8_width_table[] = { | |
- { 0x00951, 0x00954, 0, NULL, NULL }, | |
- { 0x00ccc, 0x00ccd, 0, NULL, NULL }, | |
- { 0x0fff9, 0x0fffb, 0, NULL, NULL }, | |
- { 0x20000, 0x2fffd, 2, NULL, NULL }, | |
- { 0x00ebb, 0x00ebc, 0, NULL, NULL }, | |
- { 0x01932, 0x01932, 0, NULL, NULL }, | |
- { 0x0070f, 0x0070f, 0, NULL, NULL }, | |
- { 0x00a70, 0x00a71, 0, NULL, NULL }, | |
- { 0x02329, 0x02329, 2, NULL, NULL }, | |
- { 0x00acd, 0x00acd, 0, NULL, NULL }, | |
- { 0x00ac7, 0x00ac8, 0, NULL, NULL }, | |
- { 0x00a3c, 0x00a3c, 0, NULL, NULL }, | |
- { 0x009cd, 0x009cd, 0, NULL, NULL }, | |
- { 0x00591, 0x005bd, 0, NULL, NULL }, | |
- { 0x01058, 0x01059, 0, NULL, NULL }, | |
- { 0x0ffe0, 0x0ffe6, 2, NULL, NULL }, | |
- { 0x01100, 0x0115f, 2, NULL, NULL }, | |
- { 0x0fe20, 0x0fe23, 0, NULL, NULL }, | |
- { 0x0302a, 0x0302f, 0, NULL, NULL }, | |
- { 0x01772, 0x01773, 0, NULL, NULL }, | |
- { 0x005bf, 0x005bf, 0, NULL, NULL }, | |
- { 0x006ea, 0x006ed, 0, NULL, NULL }, | |
- { 0x00bc0, 0x00bc0, 0, NULL, NULL }, | |
- { 0x00962, 0x00963, 0, NULL, NULL }, | |
- { 0x01732, 0x01734, 0, NULL, NULL }, | |
- { 0x00d41, 0x00d43, 0, NULL, NULL }, | |
- { 0x01b42, 0x01b42, 0, NULL, NULL }, | |
- { 0x00a41, 0x00a42, 0, NULL, NULL }, | |
- { 0x00eb4, 0x00eb9, 0, NULL, NULL }, | |
- { 0x00b01, 0x00b01, 0, NULL, NULL }, | |
- { 0x00e34, 0x00e3a, 0, NULL, NULL }, | |
- { 0x03040, 0x03098, 2, NULL, NULL }, | |
- { 0x0093c, 0x0093c, 0, NULL, NULL }, | |
- { 0x00c4a, 0x00c4d, 0, NULL, NULL }, | |
- { 0x01032, 0x01032, 0, NULL, NULL }, | |
- { 0x00f37, 0x00f37, 0, NULL, NULL }, | |
- { 0x00901, 0x00902, 0, NULL, NULL }, | |
- { 0x00cbf, 0x00cbf, 0, NULL, NULL }, | |
- { 0x0a806, 0x0a806, 0, NULL, NULL }, | |
- { 0x00dd2, 0x00dd4, 0, NULL, NULL }, | |
- { 0x00f71, 0x00f7e, 0, NULL, NULL }, | |
- { 0x01752, 0x01753, 0, NULL, NULL }, | |
- { 0x1d242, 0x1d244, 0, NULL, NULL }, | |
- { 0x005c1, 0x005c2, 0, NULL, NULL }, | |
- { 0x0309b, 0x0a4cf, 2, NULL, NULL }, | |
- { 0xe0100, 0xe01ef, 0, NULL, NULL }, | |
- { 0x017dd, 0x017dd, 0, NULL, NULL }, | |
- { 0x00600, 0x00603, 0, NULL, NULL }, | |
- { 0x009e2, 0x009e3, 0, NULL, NULL }, | |
- { 0x00cc6, 0x00cc6, 0, NULL, NULL }, | |
- { 0x0a80b, 0x0a80b, 0, NULL, NULL }, | |
- { 0x01712, 0x01714, 0, NULL, NULL }, | |
- { 0x00b3c, 0x00b3c, 0, NULL, NULL }, | |
- { 0x01b00, 0x01b03, 0, NULL, NULL }, | |
- { 0x007eb, 0x007f3, 0, NULL, NULL }, | |
- { 0xe0001, 0xe0001, 0, NULL, NULL }, | |
- { 0x1d185, 0x1d18b, 0, NULL, NULL }, | |
- { 0x0feff, 0x0feff, 0, NULL, NULL }, | |
- { 0x01b36, 0x01b3a, 0, NULL, NULL }, | |
- { 0x01920, 0x01922, 0, NULL, NULL }, | |
- { 0x00670, 0x00670, 0, NULL, NULL }, | |
- { 0x00f90, 0x00f97, 0, NULL, NULL }, | |
- { 0x01927, 0x01928, 0, NULL, NULL }, | |
- { 0x0200b, 0x0200f, 0, NULL, NULL }, | |
- { 0x0ff00, 0x0ff60, 2, NULL, NULL }, | |
- { 0x0f900, 0x0faff, 2, NULL, NULL }, | |
- { 0x0fb1e, 0x0fb1e, 0, NULL, NULL }, | |
- { 0x00cbc, 0x00cbc, 0, NULL, NULL }, | |
- { 0x00eb1, 0x00eb1, 0, NULL, NULL }, | |
- { 0x10a38, 0x10a3a, 0, NULL, NULL }, | |
- { 0x007a6, 0x007b0, 0, NULL, NULL }, | |
- { 0x00f80, 0x00f84, 0, NULL, NULL }, | |
- { 0x005c4, 0x005c5, 0, NULL, NULL }, | |
- { 0x0ac00, 0x0d7a3, 2, NULL, NULL }, | |
- { 0x017c9, 0x017d3, 0, NULL, NULL }, | |
- { 0x00d4d, 0x00d4d, 0, NULL, NULL }, | |
- { 0x1d167, 0x1d169, 0, NULL, NULL }, | |
- { 0x01036, 0x01037, 0, NULL, NULL }, | |
- { 0xe0020, 0xe007f, 0, NULL, NULL }, | |
- { 0x00f35, 0x00f35, 0, NULL, NULL }, | |
- { 0x017b4, 0x017b5, 0, NULL, NULL }, | |
- { 0x0206a, 0x0206f, 0, NULL, NULL }, | |
- { 0x00c46, 0x00c48, 0, NULL, NULL }, | |
- { 0x01939, 0x0193b, 0, NULL, NULL }, | |
- { 0x01dc0, 0x01dca, 0, NULL, NULL }, | |
- { 0x10a0c, 0x10a0f, 0, NULL, NULL }, | |
- { 0x0102d, 0x01030, 0, NULL, NULL }, | |
- { 0x017c6, 0x017c6, 0, NULL, NULL }, | |
- { 0x00ec8, 0x00ecd, 0, NULL, NULL }, | |
- { 0x00b41, 0x00b43, 0, NULL, NULL }, | |
- { 0x017b7, 0x017bd, 0, NULL, NULL }, | |
- { 0x1d173, 0x1d182, 0, NULL, NULL }, | |
- { 0x00a47, 0x00a48, 0, NULL, NULL }, | |
- { 0x0232a, 0x0232a, 2, NULL, NULL }, | |
- { 0x01b3c, 0x01b3c, 0, NULL, NULL }, | |
- { 0x10a01, 0x10a03, 0, NULL, NULL }, | |
- { 0x00ae2, 0x00ae3, 0, NULL, NULL }, | |
- { 0x00483, 0x00486, 0, NULL, NULL }, | |
- { 0x0135f, 0x0135f, 0, NULL, NULL }, | |
- { 0x01a17, 0x01a18, 0, NULL, NULL }, | |
- { 0x006e7, 0x006e8, 0, NULL, NULL }, | |
-#ifndef __APPLE__ | |
- { 0x03099, 0x0309a, 0, NULL, NULL }, | |
-#endif | |
- { 0x00b4d, 0x00b4d, 0, NULL, NULL }, | |
- { 0x00ce2, 0x00ce3, 0, NULL, NULL }, | |
- { 0x00bcd, 0x00bcd, 0, NULL, NULL }, | |
- { 0x00610, 0x00615, 0, NULL, NULL }, | |
- { 0x00f99, 0x00fbc, 0, NULL, NULL }, | |
- { 0x009c1, 0x009c4, 0, NULL, NULL }, | |
- { 0x00730, 0x0074a, 0, NULL, NULL }, | |
- { 0x00300, 0x0036f, 0, NULL, NULL }, | |
- { 0x03030, 0x0303e, 2, NULL, NULL }, | |
- { 0x01b34, 0x01b34, 0, NULL, NULL }, | |
- { 0x1d1aa, 0x1d1ad, 0, NULL, NULL }, | |
- { 0x00dca, 0x00dca, 0, NULL, NULL }, | |
- { 0x006d6, 0x006e4, 0, NULL, NULL }, | |
- { 0x00f86, 0x00f87, 0, NULL, NULL }, | |
- { 0x00b3f, 0x00b3f, 0, NULL, NULL }, | |
- { 0x0fe30, 0x0fe6f, 2, NULL, NULL }, | |
- { 0x01039, 0x01039, 0, NULL, NULL }, | |
- { 0x0094d, 0x0094d, 0, NULL, NULL }, | |
- { 0x00c55, 0x00c56, 0, NULL, NULL }, | |
- { 0x00488, 0x00489, 0, NULL, NULL }, | |
- { 0x00e47, 0x00e4e, 0, NULL, NULL }, | |
- { 0x00a81, 0x00a82, 0, NULL, NULL }, | |
- { 0x00ac1, 0x00ac5, 0, NULL, NULL }, | |
- { 0x0202a, 0x0202e, 0, NULL, NULL }, | |
- { 0x00dd6, 0x00dd6, 0, NULL, NULL }, | |
- { 0x018a9, 0x018a9, 0, NULL, NULL }, | |
- { 0x0064b, 0x0065e, 0, NULL, NULL }, | |
- { 0x00abc, 0x00abc, 0, NULL, NULL }, | |
- { 0x00b82, 0x00b82, 0, NULL, NULL }, | |
- { 0x00f39, 0x00f39, 0, NULL, NULL }, | |
- { 0x020d0, 0x020ef, 0, NULL, NULL }, | |
- { 0x01dfe, 0x01dff, 0, NULL, NULL }, | |
- { 0x30000, 0x3fffd, 2, NULL, NULL }, | |
- { 0x00711, 0x00711, 0, NULL, NULL }, | |
- { 0x0fe00, 0x0fe0f, 0, NULL, NULL }, | |
- { 0x01160, 0x011ff, 0, NULL, NULL }, | |
- { 0x0180b, 0x0180d, 0, NULL, NULL }, | |
- { 0x10a3f, 0x10a3f, 0, NULL, NULL }, | |
- { 0x00981, 0x00981, 0, NULL, NULL }, | |
- { 0x0a825, 0x0a826, 0, NULL, NULL }, | |
- { 0x00941, 0x00948, 0, NULL, NULL }, | |
- { 0x01b6b, 0x01b73, 0, NULL, NULL }, | |
- { 0x00e31, 0x00e31, 0, NULL, NULL }, | |
- { 0x0fe10, 0x0fe19, 2, NULL, NULL }, | |
- { 0x00a01, 0x00a02, 0, NULL, NULL }, | |
- { 0x00a4b, 0x00a4d, 0, NULL, NULL }, | |
- { 0x00f18, 0x00f19, 0, NULL, NULL }, | |
- { 0x00fc6, 0x00fc6, 0, NULL, NULL }, | |
- { 0x02e80, 0x03029, 2, NULL, NULL }, | |
- { 0x00b56, 0x00b56, 0, NULL, NULL }, | |
- { 0x009bc, 0x009bc, 0, NULL, NULL }, | |
- { 0x005c7, 0x005c7, 0, NULL, NULL }, | |
- { 0x02060, 0x02063, 0, NULL, NULL }, | |
- { 0x00c3e, 0x00c40, 0, NULL, NULL }, | |
- { 0x10a05, 0x10a06, 0, NULL, NULL }, | |
-}; | |
- | |
-struct utf8_width_entry *utf8_width_root = NULL; | |
- | |
-int utf8_overlap(struct utf8_width_entry *, struct utf8_width_entry *); | |
u_int utf8_combine(const struct utf8_data *); | |
u_int utf8_width(const struct utf8_data *); | |
@@ -247,49 +73,6 @@ utf8_append(struct utf8_data *utf8data, | |
return (0); | |
} | |
-/* Check if two width tree entries overlap. */ | |
-int | |
-utf8_overlap( | |
- struct utf8_width_entry *item1, struct utf8_width_entry *item2) | |
-{ | |
- if (item1->first >= item2->first && item1->first <= item2->last) | |
- return (1); | |
- if (item1->last >= item2->first && item1->last <= item2->last) | |
- return (1); | |
- if (item2->first >= item1->first && item2->first <= item1->last) | |
- return (1); | |
- if (item2->last >= item1->first && item2->last <= item1->last) | |
- return (1); | |
- return (0); | |
-} | |
- | |
-/* Build UTF-8 width tree. */ | |
-void | |
-utf8_build(void) | |
-{ | |
- struct utf8_width_entry **ptr, *item, *node; | |
- u_int i, j; | |
- | |
- for (i = 0; i < nitems(utf8_width_table); i++) { | |
- item = &utf8_width_table[i]; | |
- | |
- for (j = 0; j < nitems(utf8_width_table); j++) { | |
- if (i != j && utf8_overlap(item, &utf8_width_table[j])) | |
- log_fatalx("utf8 overlap: %u %u", i, j); | |
- } | |
- | |
- ptr = &utf8_width_root; | |
- while (*ptr != NULL) { | |
- node = *ptr; | |
- if (item->last < node->first) | |
- ptr = &(node->left); | |
- else if (item->first > node->last) | |
- ptr = &(node->right); | |
- } | |
- *ptr = item; | |
- } | |
-} | |
- | |
/* Combine UTF-8 into 32-bit Unicode. */ | |
u_int | |
utf8_combine(const struct utf8_data *utf8data) | |
@@ -337,19 +120,8 @@ utf8_split2(u_int uc, u_char *ptr) | |
u_int | |
utf8_width(const struct utf8_data *utf8data) | |
{ | |
- struct utf8_width_entry *item; | |
- u_int value; | |
- | |
- value = utf8_combine(utf8data); | |
- | |
- item = utf8_width_root; | |
- while (item != NULL) { | |
- if (value < item->first) | |
- item = item->left; | |
- else if (value > item->last) | |
- item = item->right; | |
- else | |
- return (item->width); | |
- } | |
- return (1); | |
+ signed int width; | |
+ setlocale(LC_CTYPE,""); | |
+ width = wcwidth(utf8_combine(utf8data)); | |
+ return (width <= -1 ? 1 : width); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment