Changeset: 7bc945921cc9 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/7bc945921cc9 Added Files: common/utils/mwidth.c Modified Files: common/utils/CMakeLists.txt common/utils/mutf8.c Branch: default Log Message:
Put charwidth function and table in separate object file in archive. This way, it doesn't have to be included in objects that use the decode function but not the charwidth function. diffs (truncated from 458 to 300 lines): diff --git a/common/utils/CMakeLists.txt b/common/utils/CMakeLists.txt --- a/common/utils/CMakeLists.txt +++ b/common/utils/CMakeLists.txt @@ -157,7 +157,8 @@ target_sources(mutf8 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/mutf8.h PRIVATE - mutf8.c) + mutf8.c + mwidth.c) target_include_directories(mutf8 PUBLIC diff --git a/common/utils/mutf8.c b/common/utils/mutf8.c --- a/common/utils/mutf8.c +++ b/common/utils/mutf8.c @@ -13,214 +13,6 @@ #include "monetdb_config.h" #include "mutf8.h" -struct interval { - uint32_t first; - uint32_t last; - int width; -}; - -/* this table was created using the script uniwidthtab.sh */ -static const struct interval intervals[] = { - /* sorted list of non-overlapping ranges: - * ranges with width==0 represent all codepoints with - * general_category Me, Mn or Cf except U+00AD (SOFT HYPHEN), all - * codepoints \U+1160 through U+11FF (Hangul Jamo medial vowels and - * final consonants) -- see - * https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c from which this is - * derived; - * ranges with width==2 represent all codepoints in the East Asian - * Wide (W) or East Asian Full-width (F) category as defined in the - * EastAsianWidth.txt file */ - { 0x0300, 0x036F, 0 }, { 0x0483, 0x0489, 0 }, { 0x0591, 0x05BD, 0 }, - { 0x05BF, 0x05BF, 0 }, { 0x05C1, 0x05C2, 0 }, { 0x05C4, 0x05C5, 0 }, - { 0x05C7, 0x05C7, 0 }, { 0x0600, 0x0605, 0 }, { 0x0610, 0x061A, 0 }, - { 0x061C, 0x061C, 0 }, { 0x064B, 0x065F, 0 }, { 0x0670, 0x0670, 0 }, - { 0x06D6, 0x06DD, 0 }, { 0x06DF, 0x06E4, 0 }, { 0x06E7, 0x06E8, 0 }, - { 0x06EA, 0x06ED, 0 }, { 0x070F, 0x070F, 0 }, { 0x0711, 0x0711, 0 }, - { 0x0730, 0x074A, 0 }, { 0x07A6, 0x07B0, 0 }, { 0x07EB, 0x07F3, 0 }, - { 0x07FD, 0x07FD, 0 }, { 0x0816, 0x0819, 0 }, { 0x081B, 0x0823, 0 }, - { 0x0825, 0x0827, 0 }, { 0x0829, 0x082D, 0 }, { 0x0859, 0x085B, 0 }, - { 0x0890, 0x0891, 0 }, { 0x0898, 0x089F, 0 }, { 0x08CA, 0x0902, 0 }, - { 0x093A, 0x093A, 0 }, { 0x093C, 0x093C, 0 }, { 0x0941, 0x0948, 0 }, - { 0x094D, 0x094D, 0 }, { 0x0951, 0x0957, 0 }, { 0x0962, 0x0963, 0 }, - { 0x0981, 0x0981, 0 }, { 0x09BC, 0x09BC, 0 }, { 0x09C1, 0x09C4, 0 }, - { 0x09CD, 0x09CD, 0 }, { 0x09E2, 0x09E3, 0 }, { 0x09FE, 0x09FE, 0 }, - { 0x0A01, 0x0A02, 0 }, { 0x0A3C, 0x0A3C, 0 }, { 0x0A41, 0x0A42, 0 }, - { 0x0A47, 0x0A48, 0 }, { 0x0A4B, 0x0A4D, 0 }, { 0x0A51, 0x0A51, 0 }, - { 0x0A70, 0x0A71, 0 }, { 0x0A75, 0x0A75, 0 }, { 0x0A81, 0x0A82, 0 }, - { 0x0ABC, 0x0ABC, 0 }, { 0x0AC1, 0x0AC5, 0 }, { 0x0AC7, 0x0AC8, 0 }, - { 0x0ACD, 0x0ACD, 0 }, { 0x0AE2, 0x0AE3, 0 }, { 0x0AFA, 0x0AFF, 0 }, - { 0x0B01, 0x0B01, 0 }, { 0x0B3C, 0x0B3C, 0 }, { 0x0B3F, 0x0B3F, 0 }, - { 0x0B41, 0x0B44, 0 }, { 0x0B4D, 0x0B4D, 0 }, { 0x0B55, 0x0B56, 0 }, - { 0x0B62, 0x0B63, 0 }, { 0x0B82, 0x0B82, 0 }, { 0x0BC0, 0x0BC0, 0 }, - { 0x0BCD, 0x0BCD, 0 }, { 0x0C00, 0x0C00, 0 }, { 0x0C04, 0x0C04, 0 }, - { 0x0C3C, 0x0C3C, 0 }, { 0x0C3E, 0x0C40, 0 }, { 0x0C46, 0x0C48, 0 }, - { 0x0C4A, 0x0C4D, 0 }, { 0x0C55, 0x0C56, 0 }, { 0x0C62, 0x0C63, 0 }, - { 0x0C81, 0x0C81, 0 }, { 0x0CBC, 0x0CBC, 0 }, { 0x0CBF, 0x0CBF, 0 }, - { 0x0CC6, 0x0CC6, 0 }, { 0x0CCC, 0x0CCD, 0 }, { 0x0CE2, 0x0CE3, 0 }, - { 0x0D00, 0x0D01, 0 }, { 0x0D3B, 0x0D3C, 0 }, { 0x0D41, 0x0D44, 0 }, - { 0x0D4D, 0x0D4D, 0 }, { 0x0D62, 0x0D63, 0 }, { 0x0D81, 0x0D81, 0 }, - { 0x0DCA, 0x0DCA, 0 }, { 0x0DD2, 0x0DD4, 0 }, { 0x0DD6, 0x0DD6, 0 }, - { 0x0E31, 0x0E31, 0 }, { 0x0E34, 0x0E3A, 0 }, { 0x0E47, 0x0E4E, 0 }, - { 0x0EB1, 0x0EB1, 0 }, { 0x0EB4, 0x0EBC, 0 }, { 0x0EC8, 0x0ECE, 0 }, - { 0x0F18, 0x0F19, 0 }, { 0x0F35, 0x0F35, 0 }, { 0x0F37, 0x0F37, 0 }, - { 0x0F39, 0x0F39, 0 }, { 0x0F71, 0x0F7E, 0 }, { 0x0F80, 0x0F84, 0 }, - { 0x0F86, 0x0F87, 0 }, { 0x0F8D, 0x0F97, 0 }, { 0x0F99, 0x0FBC, 0 }, - { 0x0FC6, 0x0FC6, 0 }, { 0x102D, 0x1030, 0 }, { 0x1032, 0x1037, 0 }, - { 0x1039, 0x103A, 0 }, { 0x103D, 0x103E, 0 }, { 0x1058, 0x1059, 0 }, - { 0x105E, 0x1060, 0 }, { 0x1071, 0x1074, 0 }, { 0x1082, 0x1082, 0 }, - { 0x1085, 0x1086, 0 }, { 0x108D, 0x108D, 0 }, { 0x109D, 0x109D, 0 }, - { 0x1100, 0x115F, 2 }, { 0x1160, 0x11FF, 0 }, { 0x135D, 0x135F, 0 }, - { 0x1712, 0x1714, 0 }, { 0x1732, 0x1733, 0 }, { 0x1752, 0x1753, 0 }, - { 0x1772, 0x1773, 0 }, { 0x17B4, 0x17B5, 0 }, { 0x17B7, 0x17BD, 0 }, - { 0x17C6, 0x17C6, 0 }, { 0x17C9, 0x17D3, 0 }, { 0x17DD, 0x17DD, 0 }, - { 0x180B, 0x180F, 0 }, { 0x1885, 0x1886, 0 }, { 0x18A9, 0x18A9, 0 }, - { 0x1920, 0x1922, 0 }, { 0x1927, 0x1928, 0 }, { 0x1932, 0x1932, 0 }, - { 0x1939, 0x193B, 0 }, { 0x1A17, 0x1A18, 0 }, { 0x1A1B, 0x1A1B, 0 }, - { 0x1A56, 0x1A56, 0 }, { 0x1A58, 0x1A5E, 0 }, { 0x1A60, 0x1A60, 0 }, - { 0x1A62, 0x1A62, 0 }, { 0x1A65, 0x1A6C, 0 }, { 0x1A73, 0x1A7C, 0 }, - { 0x1A7F, 0x1A7F, 0 }, { 0x1AB0, 0x1ACE, 0 }, { 0x1B00, 0x1B03, 0 }, - { 0x1B34, 0x1B34, 0 }, { 0x1B36, 0x1B3A, 0 }, { 0x1B3C, 0x1B3C, 0 }, - { 0x1B42, 0x1B42, 0 }, { 0x1B6B, 0x1B73, 0 }, { 0x1B80, 0x1B81, 0 }, - { 0x1BA2, 0x1BA5, 0 }, { 0x1BA8, 0x1BA9, 0 }, { 0x1BAB, 0x1BAD, 0 }, - { 0x1BE6, 0x1BE6, 0 }, { 0x1BE8, 0x1BE9, 0 }, { 0x1BED, 0x1BED, 0 }, - { 0x1BEF, 0x1BF1, 0 }, { 0x1C2C, 0x1C33, 0 }, { 0x1C36, 0x1C37, 0 }, - { 0x1CD0, 0x1CD2, 0 }, { 0x1CD4, 0x1CE0, 0 }, { 0x1CE2, 0x1CE8, 0 }, - { 0x1CED, 0x1CED, 0 }, { 0x1CF4, 0x1CF4, 0 }, { 0x1CF8, 0x1CF9, 0 }, - { 0x1DC0, 0x1DFF, 0 }, { 0x200B, 0x200F, 0 }, { 0x202A, 0x202E, 0 }, - { 0x2060, 0x2064, 0 }, { 0x2066, 0x206F, 0 }, { 0x20D0, 0x20F0, 0 }, - { 0x231A, 0x231B, 2 }, { 0x2329, 0x232A, 2 }, { 0x23E9, 0x23EC, 2 }, - { 0x23F0, 0x23F0, 2 }, { 0x23F3, 0x23F3, 2 }, { 0x25FD, 0x25FE, 2 }, - { 0x2614, 0x2615, 2 }, { 0x2648, 0x2653, 2 }, { 0x267F, 0x267F, 2 }, - { 0x2693, 0x2693, 2 }, { 0x26A1, 0x26A1, 2 }, { 0x26AA, 0x26AB, 2 }, - { 0x26BD, 0x26BE, 2 }, { 0x26C4, 0x26C5, 2 }, { 0x26CE, 0x26CE, 2 }, - { 0x26D4, 0x26D4, 2 }, { 0x26EA, 0x26EA, 2 }, { 0x26F2, 0x26F3, 2 }, - { 0x26F5, 0x26F5, 2 }, { 0x26FA, 0x26FA, 2 }, { 0x26FD, 0x26FD, 2 }, - { 0x2705, 0x2705, 2 }, { 0x270A, 0x270B, 2 }, { 0x2728, 0x2728, 2 }, - { 0x274C, 0x274C, 2 }, { 0x274E, 0x274E, 2 }, { 0x2753, 0x2755, 2 }, - { 0x2757, 0x2757, 2 }, { 0x2795, 0x2797, 2 }, { 0x27B0, 0x27B0, 2 }, - { 0x27BF, 0x27BF, 2 }, { 0x2B1B, 0x2B1C, 2 }, { 0x2B50, 0x2B50, 2 }, - { 0x2B55, 0x2B55, 2 }, { 0x2CEF, 0x2CF1, 0 }, { 0x2D7F, 0x2D7F, 0 }, - { 0x2DE0, 0x2DFF, 0 }, { 0x2E80, 0x2E99, 2 }, { 0x2E9B, 0x2EF3, 2 }, - { 0x2F00, 0x2FD5, 2 }, { 0x2FF0, 0x3029, 2 }, { 0x302A, 0x302D, 0 }, - { 0x302E, 0x303E, 2 }, { 0x3041, 0x3096, 2 }, { 0x3099, 0x309A, 0 }, - { 0x309B, 0x30FF, 2 }, { 0x3105, 0x312F, 2 }, { 0x3131, 0x318E, 2 }, - { 0x3190, 0x31E3, 2 }, { 0x31EF, 0x321E, 2 }, { 0x3220, 0x3247, 2 }, - { 0x3250, 0x4DBF, 2 }, { 0x4E00, 0xA48C, 2 }, { 0xA490, 0xA4C6, 2 }, - { 0xA66F, 0xA672, 0 }, { 0xA674, 0xA67D, 0 }, { 0xA69E, 0xA69F, 0 }, - { 0xA6F0, 0xA6F1, 0 }, { 0xA802, 0xA802, 0 }, { 0xA806, 0xA806, 0 }, - { 0xA80B, 0xA80B, 0 }, { 0xA825, 0xA826, 0 }, { 0xA82C, 0xA82C, 0 }, - { 0xA8C4, 0xA8C5, 0 }, { 0xA8E0, 0xA8F1, 0 }, { 0xA8FF, 0xA8FF, 0 }, - { 0xA926, 0xA92D, 0 }, { 0xA947, 0xA951, 0 }, { 0xA960, 0xA97C, 2 }, - { 0xA980, 0xA982, 0 }, { 0xA9B3, 0xA9B3, 0 }, { 0xA9B6, 0xA9B9, 0 }, - { 0xA9BC, 0xA9BD, 0 }, { 0xA9E5, 0xA9E5, 0 }, { 0xAA29, 0xAA2E, 0 }, - { 0xAA31, 0xAA32, 0 }, { 0xAA35, 0xAA36, 0 }, { 0xAA43, 0xAA43, 0 }, - { 0xAA4C, 0xAA4C, 0 }, { 0xAA7C, 0xAA7C, 0 }, { 0xAAB0, 0xAAB0, 0 }, - { 0xAAB2, 0xAAB4, 0 }, { 0xAAB7, 0xAAB8, 0 }, { 0xAABE, 0xAABF, 0 }, - { 0xAAC1, 0xAAC1, 0 }, { 0xAAEC, 0xAAED, 0 }, { 0xAAF6, 0xAAF6, 0 }, - { 0xABE5, 0xABE5, 0 }, { 0xABE8, 0xABE8, 0 }, { 0xABED, 0xABED, 0 }, - { 0xAC00, 0xD7A3, 2 }, { 0xF900, 0xFAFF, 2 }, { 0xFB1E, 0xFB1E, 0 }, - { 0xFE00, 0xFE0F, 0 }, { 0xFE10, 0xFE19, 2 }, { 0xFE20, 0xFE2F, 0 }, - { 0xFE30, 0xFE52, 2 }, { 0xFE54, 0xFE66, 2 }, { 0xFE68, 0xFE6B, 2 }, - { 0xFEFF, 0xFEFF, 0 }, { 0xFF01, 0xFF60, 2 }, { 0xFFE0, 0xFFE6, 2 }, - { 0xFFF9, 0xFFFB, 0 }, { 0x101FD, 0x101FD, 0 }, { 0x102E0, 0x102E0, 0 }, - { 0x10376, 0x1037A, 0 }, { 0x10A01, 0x10A03, 0 }, { 0x10A05, 0x10A06, 0 }, - { 0x10A0C, 0x10A0F, 0 }, { 0x10A38, 0x10A3A, 0 }, { 0x10A3F, 0x10A3F, 0 }, - { 0x10AE5, 0x10AE6, 0 }, { 0x10D24, 0x10D27, 0 }, { 0x10EAB, 0x10EAC, 0 }, - { 0x10EFD, 0x10EFF, 0 }, { 0x10F46, 0x10F50, 0 }, { 0x10F82, 0x10F85, 0 }, - { 0x11001, 0x11001, 0 }, { 0x11038, 0x11046, 0 }, { 0x11070, 0x11070, 0 }, - { 0x11073, 0x11074, 0 }, { 0x1107F, 0x11081, 0 }, { 0x110B3, 0x110B6, 0 }, - { 0x110B9, 0x110BA, 0 }, { 0x110BD, 0x110BD, 0 }, { 0x110C2, 0x110C2, 0 }, - { 0x110CD, 0x110CD, 0 }, { 0x11100, 0x11102, 0 }, { 0x11127, 0x1112B, 0 }, - { 0x1112D, 0x11134, 0 }, { 0x11173, 0x11173, 0 }, { 0x11180, 0x11181, 0 }, - { 0x111B6, 0x111BE, 0 }, { 0x111C9, 0x111CC, 0 }, { 0x111CF, 0x111CF, 0 }, - { 0x1122F, 0x11231, 0 }, { 0x11234, 0x11234, 0 }, { 0x11236, 0x11237, 0 }, - { 0x1123E, 0x1123E, 0 }, { 0x11241, 0x11241, 0 }, { 0x112DF, 0x112DF, 0 }, - { 0x112E3, 0x112EA, 0 }, { 0x11300, 0x11301, 0 }, { 0x1133B, 0x1133C, 0 }, - { 0x11340, 0x11340, 0 }, { 0x11366, 0x1136C, 0 }, { 0x11370, 0x11374, 0 }, - { 0x11438, 0x1143F, 0 }, { 0x11442, 0x11444, 0 }, { 0x11446, 0x11446, 0 }, - { 0x1145E, 0x1145E, 0 }, { 0x114B3, 0x114B8, 0 }, { 0x114BA, 0x114BA, 0 }, - { 0x114BF, 0x114C0, 0 }, { 0x114C2, 0x114C3, 0 }, { 0x115B2, 0x115B5, 0 }, - { 0x115BC, 0x115BD, 0 }, { 0x115BF, 0x115C0, 0 }, { 0x115DC, 0x115DD, 0 }, - { 0x11633, 0x1163A, 0 }, { 0x1163D, 0x1163D, 0 }, { 0x1163F, 0x11640, 0 }, - { 0x116AB, 0x116AB, 0 }, { 0x116AD, 0x116AD, 0 }, { 0x116B0, 0x116B5, 0 }, - { 0x116B7, 0x116B7, 0 }, { 0x1171D, 0x1171F, 0 }, { 0x11722, 0x11725, 0 }, - { 0x11727, 0x1172B, 0 }, { 0x1182F, 0x11837, 0 }, { 0x11839, 0x1183A, 0 }, - { 0x1193B, 0x1193C, 0 }, { 0x1193E, 0x1193E, 0 }, { 0x11943, 0x11943, 0 }, - { 0x119D4, 0x119D7, 0 }, { 0x119DA, 0x119DB, 0 }, { 0x119E0, 0x119E0, 0 }, - { 0x11A01, 0x11A0A, 0 }, { 0x11A33, 0x11A38, 0 }, { 0x11A3B, 0x11A3E, 0 }, - { 0x11A47, 0x11A47, 0 }, { 0x11A51, 0x11A56, 0 }, { 0x11A59, 0x11A5B, 0 }, - { 0x11A8A, 0x11A96, 0 }, { 0x11A98, 0x11A99, 0 }, { 0x11C30, 0x11C36, 0 }, - { 0x11C38, 0x11C3D, 0 }, { 0x11C3F, 0x11C3F, 0 }, { 0x11C92, 0x11CA7, 0 }, - { 0x11CAA, 0x11CB0, 0 }, { 0x11CB2, 0x11CB3, 0 }, { 0x11CB5, 0x11CB6, 0 }, - { 0x11D31, 0x11D36, 0 }, { 0x11D3A, 0x11D3A, 0 }, { 0x11D3C, 0x11D3D, 0 }, - { 0x11D3F, 0x11D45, 0 }, { 0x11D47, 0x11D47, 0 }, { 0x11D90, 0x11D91, 0 }, - { 0x11D95, 0x11D95, 0 }, { 0x11D97, 0x11D97, 0 }, { 0x11EF3, 0x11EF4, 0 }, - { 0x11F00, 0x11F01, 0 }, { 0x11F36, 0x11F3A, 0 }, { 0x11F40, 0x11F40, 0 }, - { 0x11F42, 0x11F42, 0 }, { 0x13430, 0x13440, 0 }, { 0x13447, 0x13455, 0 }, - { 0x16AF0, 0x16AF4, 0 }, { 0x16B30, 0x16B36, 0 }, { 0x16F4F, 0x16F4F, 0 }, - { 0x16F8F, 0x16F92, 0 }, { 0x16FE0, 0x16FE3, 2 }, { 0x16FE4, 0x16FE4, 0 }, - { 0x16FF0, 0x16FF1, 2 }, { 0x17000, 0x187F7, 2 }, { 0x18800, 0x18CD5, 2 }, - { 0x18D00, 0x18D08, 2 }, { 0x1AFF0, 0x1AFF3, 2 }, { 0x1AFF5, 0x1AFFB, 2 }, - { 0x1AFFD, 0x1AFFE, 2 }, { 0x1B000, 0x1B122, 2 }, { 0x1B132, 0x1B132, 2 }, - { 0x1B150, 0x1B152, 2 }, { 0x1B155, 0x1B155, 2 }, { 0x1B164, 0x1B167, 2 }, - { 0x1B170, 0x1B2FB, 2 }, { 0x1BC9D, 0x1BC9E, 0 }, { 0x1BCA0, 0x1BCA3, 0 }, - { 0x1CF00, 0x1CF2D, 0 }, { 0x1CF30, 0x1CF46, 0 }, { 0x1D167, 0x1D169, 0 }, - { 0x1D173, 0x1D182, 0 }, { 0x1D185, 0x1D18B, 0 }, { 0x1D1AA, 0x1D1AD, 0 }, - { 0x1D242, 0x1D244, 0 }, { 0x1DA00, 0x1DA36, 0 }, { 0x1DA3B, 0x1DA6C, 0 }, - { 0x1DA75, 0x1DA75, 0 }, { 0x1DA84, 0x1DA84, 0 }, { 0x1DA9B, 0x1DA9F, 0 }, - { 0x1DAA1, 0x1DAAF, 0 }, { 0x1E000, 0x1E006, 0 }, { 0x1E008, 0x1E018, 0 }, - { 0x1E01B, 0x1E021, 0 }, { 0x1E023, 0x1E024, 0 }, { 0x1E026, 0x1E02A, 0 }, - { 0x1E08F, 0x1E08F, 0 }, { 0x1E130, 0x1E136, 0 }, { 0x1E2AE, 0x1E2AE, 0 }, - { 0x1E2EC, 0x1E2EF, 0 }, { 0x1E4EC, 0x1E4EF, 0 }, { 0x1E8D0, 0x1E8D6, 0 }, - { 0x1E944, 0x1E94A, 0 }, { 0x1F004, 0x1F004, 2 }, { 0x1F0CF, 0x1F0CF, 2 }, - { 0x1F18E, 0x1F18E, 2 }, { 0x1F191, 0x1F19A, 2 }, { 0x1F200, 0x1F202, 2 }, - { 0x1F210, 0x1F23B, 2 }, { 0x1F240, 0x1F248, 2 }, { 0x1F250, 0x1F251, 2 }, - { 0x1F260, 0x1F265, 2 }, { 0x1F300, 0x1F320, 2 }, { 0x1F32D, 0x1F335, 2 }, - { 0x1F337, 0x1F37C, 2 }, { 0x1F37E, 0x1F393, 2 }, { 0x1F3A0, 0x1F3CA, 2 }, - { 0x1F3CF, 0x1F3D3, 2 }, { 0x1F3E0, 0x1F3F0, 2 }, { 0x1F3F4, 0x1F3F4, 2 }, - { 0x1F3F8, 0x1F43E, 2 }, { 0x1F440, 0x1F440, 2 }, { 0x1F442, 0x1F4FC, 2 }, - { 0x1F4FF, 0x1F53D, 2 }, { 0x1F54B, 0x1F54E, 2 }, { 0x1F550, 0x1F567, 2 }, - { 0x1F57A, 0x1F57A, 2 }, { 0x1F595, 0x1F596, 2 }, { 0x1F5A4, 0x1F5A4, 2 }, - { 0x1F5FB, 0x1F64F, 2 }, { 0x1F680, 0x1F6C5, 2 }, { 0x1F6CC, 0x1F6CC, 2 }, - { 0x1F6D0, 0x1F6D2, 2 }, { 0x1F6D5, 0x1F6D7, 2 }, { 0x1F6DC, 0x1F6DF, 2 }, - { 0x1F6EB, 0x1F6EC, 2 }, { 0x1F6F4, 0x1F6FC, 2 }, { 0x1F7E0, 0x1F7EB, 2 }, - { 0x1F7F0, 0x1F7F0, 2 }, { 0x1F90C, 0x1F93A, 2 }, { 0x1F93C, 0x1F945, 2 }, - { 0x1F947, 0x1F9FF, 2 }, { 0x1FA70, 0x1FA7C, 2 }, { 0x1FA80, 0x1FA88, 2 }, - { 0x1FA90, 0x1FABD, 2 }, { 0x1FABF, 0x1FAC5, 2 }, { 0x1FACE, 0x1FADB, 2 }, - { 0x1FAE0, 0x1FAE8, 2 }, { 0x1FAF0, 0x1FAF8, 2 }, { 0x20000, 0x2FFFD, 2 }, - { 0x30000, 0x3FFFD, 2 }, { 0xE0001, 0xE0001, 0 }, { 0xE0020, 0xE007F, 0 }, - { 0xE0100, 0xE01EF, 0 }, -}; - -/* Return the display width of Unicode codepoint c (-1 if c is a control - * character, else 0, 1, or 2). This function is similar to the - * standard C function wcwidth, but only for Unicode codepoints */ -int -charwidth(uint32_t c) -{ - if (c == 0) - return 0; - if ((c & ~0x80) <= 0x1F || c == 0x007F) - return -1; /* control character or DELETE */ - - size_t min = 0; - size_t max = (sizeof(intervals) / sizeof(intervals[0])) - 1; - - if (c >= intervals[min].first && c <= intervals[max].last) { - while (max >= min) { - size_t mid = (min + max) / 2; - if (c > intervals[mid].last) - min = mid + 1; - else if (c < intervals[mid].first) - max = mid - 1; - else - return intervals[mid].width; - } - } - return 1; -} - /* The code starting here, and the function decode in the accompanying * include file mutf8.h are copyright Bjoern Hoehrmann per the below * notice. diff --git a/common/utils/mwidth.c b/common/utils/mwidth.c new file mode 100644 --- /dev/null +++ b/common/utils/mwidth.c @@ -0,0 +1,222 @@ +/* + * SPDX-License-Identifier: MPL-2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2024 MonetDB Foundation; + * Copyright August 2008 - 2023 MonetDB B.V.; + * Copyright 1997 - July 2008 CWI. + */ + +#include "monetdb_config.h" +#include "mutf8.h" + +struct interval { + uint32_t first; + uint32_t last; + int width; +}; + +/* this table was created using the script uniwidthtab.sh */ +static const struct interval intervals[] = { + /* sorted list of non-overlapping ranges: + * ranges with width==0 represent all codepoints with + * general_category Me, Mn or Cf except U+00AD (SOFT HYPHEN), all + * codepoints \U+1160 through U+11FF (Hangul Jamo medial vowels and + * final consonants) -- see + * https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c from which this is + * derived; + * ranges with width==2 represent all codepoints in the East Asian + * Wide (W) or East Asian Full-width (F) category as defined in the + * EastAsianWidth.txt file */ + { 0x0300, 0x036F, 0 }, { 0x0483, 0x0489, 0 }, { 0x0591, 0x05BD, 0 }, + { 0x05BF, 0x05BF, 0 }, { 0x05C1, 0x05C2, 0 }, { 0x05C4, 0x05C5, 0 }, + { 0x05C7, 0x05C7, 0 }, { 0x0600, 0x0605, 0 }, { 0x0610, 0x061A, 0 }, + { 0x061C, 0x061C, 0 }, { 0x064B, 0x065F, 0 }, { 0x0670, 0x0670, 0 }, + { 0x06D6, 0x06DD, 0 }, { 0x06DF, 0x06E4, 0 }, { 0x06E7, 0x06E8, 0 }, + { 0x06EA, 0x06ED, 0 }, { 0x070F, 0x070F, 0 }, { 0x0711, 0x0711, 0 }, + { 0x0730, 0x074A, 0 }, { 0x07A6, 0x07B0, 0 }, { 0x07EB, 0x07F3, 0 }, + { 0x07FD, 0x07FD, 0 }, { 0x0816, 0x0819, 0 }, { 0x081B, 0x0823, 0 }, + { 0x0825, 0x0827, 0 }, { 0x0829, 0x082D, 0 }, { 0x0859, 0x085B, 0 }, + { 0x0890, 0x0891, 0 }, { 0x0898, 0x089F, 0 }, { 0x08CA, 0x0902, 0 }, + { 0x093A, 0x093A, 0 }, { 0x093C, 0x093C, 0 }, { 0x0941, 0x0948, 0 }, + { 0x094D, 0x094D, 0 }, { 0x0951, 0x0957, 0 }, { 0x0962, 0x0963, 0 }, + { 0x0981, 0x0981, 0 }, { 0x09BC, 0x09BC, 0 }, { 0x09C1, 0x09C4, 0 }, + { 0x09CD, 0x09CD, 0 }, { 0x09E2, 0x09E3, 0 }, { 0x09FE, 0x09FE, 0 }, + { 0x0A01, 0x0A02, 0 }, { 0x0A3C, 0x0A3C, 0 }, { 0x0A41, 0x0A42, 0 }, + { 0x0A47, 0x0A48, 0 }, { 0x0A4B, 0x0A4D, 0 }, { 0x0A51, 0x0A51, 0 }, + { 0x0A70, 0x0A71, 0 }, { 0x0A75, 0x0A75, 0 }, { 0x0A81, 0x0A82, 0 }, + { 0x0ABC, 0x0ABC, 0 }, { 0x0AC1, 0x0AC5, 0 }, { 0x0AC7, 0x0AC8, 0 }, + { 0x0ACD, 0x0ACD, 0 }, { 0x0AE2, 0x0AE3, 0 }, { 0x0AFA, 0x0AFF, 0 }, + { 0x0B01, 0x0B01, 0 }, { 0x0B3C, 0x0B3C, 0 }, { 0x0B3F, 0x0B3F, 0 }, + { 0x0B41, 0x0B44, 0 }, { 0x0B4D, 0x0B4D, 0 }, { 0x0B55, 0x0B56, 0 }, + { 0x0B62, 0x0B63, 0 }, { 0x0B82, 0x0B82, 0 }, { 0x0BC0, 0x0BC0, 0 }, + { 0x0BCD, 0x0BCD, 0 }, { 0x0C00, 0x0C00, 0 }, { 0x0C04, 0x0C04, 0 }, + { 0x0C3C, 0x0C3C, 0 }, { 0x0C3E, 0x0C40, 0 }, { 0x0C46, 0x0C48, 0 }, + { 0x0C4A, 0x0C4D, 0 }, { 0x0C55, 0x0C56, 0 }, { 0x0C62, 0x0C63, 0 }, + { 0x0C81, 0x0C81, 0 }, { 0x0CBC, 0x0CBC, 0 }, { 0x0CBF, 0x0CBF, 0 }, + { 0x0CC6, 0x0CC6, 0 }, { 0x0CCC, 0x0CCD, 0 }, { 0x0CE2, 0x0CE3, 0 }, + { 0x0D00, 0x0D01, 0 }, { 0x0D3B, 0x0D3C, 0 }, { 0x0D41, 0x0D44, 0 }, + { 0x0D4D, 0x0D4D, 0 }, { 0x0D62, 0x0D63, 0 }, { 0x0D81, 0x0D81, 0 }, + { 0x0DCA, 0x0DCA, 0 }, { 0x0DD2, 0x0DD4, 0 }, { 0x0DD6, 0x0DD6, 0 }, + { 0x0E31, 0x0E31, 0 }, { 0x0E34, 0x0E3A, 0 }, { 0x0E47, 0x0E4E, 0 }, _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org