=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/utf8.c,v retrieving revision 1.16 retrieving revision 1.17 diff -c -r1.16 -r1.17 *** src/usr.bin/tmux/utf8.c 2015/11/12 11:10:50 1.16 --- src/usr.bin/tmux/utf8.c 2015/11/12 12:19:57 1.17 *************** *** 1,4 **** ! /* $OpenBSD: utf8.c,v 1.16 2015/11/12 11:10:50 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: utf8.c,v 1.17 2015/11/12 12:19:57 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 35,41 **** }; /* Sorted, then repeatedly split in the middle to balance the tree. */ ! struct utf8_width_entry utf8_width_table[] = { { 0x00b41, 0x00b44, 0, NULL, NULL }, { 0x008e4, 0x00902, 0, NULL, NULL }, { 0x006d6, 0x006dd, 0, NULL, NULL }, --- 35,41 ---- }; /* Sorted, then repeatedly split in the middle to balance the tree. */ ! static struct utf8_width_entry utf8_width_table[] = { { 0x00b41, 0x00b44, 0, NULL, NULL }, { 0x008e4, 0x00902, 0, NULL, NULL }, { 0x006d6, 0x006dd, 0, NULL, NULL }, *************** *** 344,356 **** { 0xe0100, 0xe01ef, 0, NULL, NULL }, { 0x100000, 0x10fffd, 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 *); - /* Set a single character. */ void utf8_set(struct utf8_data *utf8data, u_char ch) --- 344,353 ---- { 0xe0100, 0xe01ef, 0, NULL, NULL }, { 0x100000, 0x10fffd, 0, NULL, NULL }, }; + static struct utf8_width_entry *utf8_width_root = NULL; ! static void utf8_build(void); /* Set a single character. */ void utf8_set(struct utf8_data *utf8data, u_char ch) *************** *** 405,444 **** if (utf8data->have != utf8data->size) return (1); ! utf8data->width = utf8_width(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; --- 402,421 ---- if (utf8data->have != utf8data->size) return (1); ! utf8data->width = utf8_width(utf8_combine(utf8data)); return (0); } /* Build UTF-8 width tree. */ ! static void utf8_build(void) { struct utf8_width_entry **ptr, *item, *node; ! u_int i; for (i = 0; i < nitems(utf8_width_table); i++) { item = &utf8_width_table[i]; ptr = &utf8_width_root; while (*ptr != NULL) { node = *ptr; *************** *** 451,456 **** --- 428,454 ---- } } + /* Lookup width of UTF-8 data in tree. */ + u_int + utf8_width(u_int uc) + { + struct utf8_width_entry *item; + + if (utf8_width_root == NULL) + utf8_build(); + + item = utf8_width_root; + while (item != NULL) { + if (uc < item->first) + item = item->left; + else if (uc > item->last) + item = item->right; + else + return (item->width); + } + return (1); + } + /* Combine UTF-8 into 32-bit Unicode. */ u_int utf8_combine(const struct utf8_data *utf8data) *************** *** 481,487 **** return (value); } ! /* Split a UTF-8 character. */ int utf8_split(u_int uc, struct utf8_data *utf8data) { --- 479,485 ---- return (value); } ! /* Split 32-bit Unicode into UTF-8. */ int utf8_split(u_int uc, struct utf8_data *utf8data) { *************** *** 505,511 **** utf8data->data[3] = 0x80 | (uc & 0x3f); } else return (-1); ! utf8data->width = utf8_width(utf8data); return (0); } --- 503,509 ---- utf8data->data[3] = 0x80 | (uc & 0x3f); } else return (-1); ! utf8data->width = utf8_width(uc); return (0); } *************** *** 519,545 **** return (2); } ptr[0] = uc; - return (1); - } - - /* Lookup width of UTF-8 data in tree. */ - 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); } --- 517,522 ----