/* $OpenBSD$ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <vis.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;
};
/* 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 },
{ 0x005c4, 0x005c5, 0, NULL, NULL },
{ 0x00591, 0x005bd, 0, NULL, NULL },
{ 0x00300, 0x0036f, 0, NULL, NULL },
{ 0x00483, 0x00489, 0, NULL, NULL },
{ 0x005bf, 0x005bf, 0, NULL, NULL },
{ 0x005c1, 0x005c2, 0, NULL, NULL },
{ 0x00610, 0x0061a, 0, NULL, NULL },
{ 0x00600, 0x00605, 0, NULL, NULL },
{ 0x005c7, 0x005c7, 0, NULL, NULL },
{ 0x0064b, 0x0065f, 0, NULL, NULL },
{ 0x0061c, 0x0061c, 0, NULL, NULL },
{ 0x00670, 0x00670, 0, NULL, NULL },
{ 0x007a6, 0x007b0, 0, NULL, NULL },
{ 0x006ea, 0x006ed, 0, NULL, NULL },
{ 0x006df, 0x006e4, 0, NULL, NULL },
{ 0x006e7, 0x006e8, 0, NULL, NULL },
{ 0x00711, 0x00711, 0, NULL, NULL },
{ 0x0070f, 0x0070f, 0, NULL, NULL },
{ 0x00730, 0x0074a, 0, NULL, NULL },
{ 0x0081b, 0x00823, 0, NULL, NULL },
{ 0x007eb, 0x007f3, 0, NULL, NULL },
{ 0x00816, 0x00819, 0, NULL, NULL },
{ 0x00829, 0x0082d, 0, NULL, NULL },
{ 0x00825, 0x00827, 0, NULL, NULL },
{ 0x00859, 0x0085b, 0, NULL, NULL },
{ 0x00a41, 0x00a42, 0, NULL, NULL },
{ 0x00981, 0x00981, 0, NULL, NULL },
{ 0x00941, 0x00948, 0, NULL, NULL },
{ 0x0093a, 0x0093a, 0, NULL, NULL },
{ 0x0093c, 0x0093c, 0, NULL, NULL },
{ 0x00951, 0x00957, 0, NULL, NULL },
{ 0x0094d, 0x0094d, 0, NULL, NULL },
{ 0x00962, 0x00963, 0, NULL, NULL },
{ 0x009e2, 0x009e3, 0, NULL, NULL },
{ 0x009c1, 0x009c4, 0, NULL, NULL },
{ 0x009bc, 0x009bc, 0, NULL, NULL },
{ 0x009cd, 0x009cd, 0, NULL, NULL },
{ 0x00a01, 0x00a02, 0, NULL, NULL },
{ 0x00a3c, 0x00a3c, 0, NULL, NULL },
{ 0x00ac1, 0x00ac5, 0, NULL, NULL },
{ 0x00a70, 0x00a71, 0, NULL, NULL },
{ 0x00a4b, 0x00a4d, 0, NULL, NULL },
{ 0x00a47, 0x00a48, 0, NULL, NULL },
{ 0x00a51, 0x00a51, 0, NULL, NULL },
{ 0x00a81, 0x00a82, 0, NULL, NULL },
{ 0x00a75, 0x00a75, 0, NULL, NULL },
{ 0x00abc, 0x00abc, 0, NULL, NULL },
{ 0x00ae2, 0x00ae3, 0, NULL, NULL },
{ 0x00ac7, 0x00ac8, 0, NULL, NULL },
{ 0x00acd, 0x00acd, 0, NULL, NULL },
{ 0x00b3c, 0x00b3c, 0, NULL, NULL },
{ 0x00b01, 0x00b01, 0, NULL, NULL },
{ 0x00b3f, 0x00b3f, 0, NULL, NULL },
{ 0x03190, 0x031ba, 2, NULL, NULL },
{ 0x017c9, 0x017d3, 0, NULL, NULL },
{ 0x00ec8, 0x00ecd, 0, NULL, NULL },
{ 0x00cc6, 0x00cc6, 0, NULL, NULL },
{ 0x00c3e, 0x00c40, 0, NULL, NULL },
{ 0x00b82, 0x00b82, 0, NULL, NULL },
{ 0x00b56, 0x00b56, 0, NULL, NULL },
{ 0x00b4d