Update to Unicode 13.0

Fixes #2513
This commit is contained in:
Kovid Goyal 2020-04-06 18:59:35 +05:30
parent 590a4d70ee
commit bf4e8c490c
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
7 changed files with 30133 additions and 28162 deletions

View File

@ -14,6 +14,8 @@ To update |kitty|, :doc:`follow the instructions <binary>`.
- Fix :option:`launch --stdin-add-formatting` not working (:iss:`2512`) - Fix :option:`launch --stdin-add-formatting` not working (:iss:`2512`)
- Update to Unicode 13.0 (:iss:`2513`)
0.17.2 [2020-03-29] 0.17.2 [2020-03-29]
-------------------- --------------------

View File

@ -103,36 +103,86 @@ def parse_ucd() -> None:
word_search_map['lamda'] |= word_search_map['lambda'] word_search_map['lamda'] |= word_search_map['lambda']
def split_two(line: str) -> Tuple[Set[int], str]: def parse_range_spec(spec: str) -> Set[int]:
spec, rest = line.split(';', 1) spec = spec.strip()
spec, rest = spec.strip(), rest.strip().split(' ', 1)[0].strip()
if '..' in spec: if '..' in spec:
chars_ = tuple(map(lambda x: int(x, 16), filter(None, spec.split('.')))) chars_ = tuple(map(lambda x: int(x, 16), filter(None, spec.split('.'))))
chars = set(range(chars_[0], chars_[1] + 1)) chars = set(range(chars_[0], chars_[1] + 1))
else: else:
chars = {int(spec, 16)} chars = {int(spec, 16)}
return chars, rest return chars
def split_two(line: str) -> Tuple[Set[int], str]:
spec, rest = line.split(';', 1)
spec, rest = spec.strip(), rest.strip().split(' ', 1)[0].strip()
return parse_range_spec(spec), rest
all_emoji: Set[int] = set() all_emoji: Set[int] = set()
emoji_categories: Dict[str, Set[int]] = {}
emoji_presentation_bases: Set[int] = set() emoji_presentation_bases: Set[int] = set()
narrow_emoji: Set[int] = set()
wide_emoji: Set[int] = set()
def parse_basic_emoji(spec: str) -> None:
parts = list(filter(None, spec.split()))
has_emoji_presentation = len(parts) < 2
chars = parse_range_spec(parts[0])
all_emoji.update(chars)
emoji_presentation_bases.update(chars)
(wide_emoji if has_emoji_presentation else narrow_emoji).update(chars)
def parse_keycap_sequence(spec: str) -> None:
base, fe0f, cc = list(filter(None, spec.split()))
chars = parse_range_spec(base)
all_emoji.update(chars)
emoji_presentation_bases.update(chars)
narrow_emoji.update(chars)
def parse_flag_emoji_sequence(spec: str) -> None:
a, b = list(filter(None, spec.split()))
left, right = int(a, 16), int(b, 16)
chars = {left, right}
all_emoji.update(chars)
wide_emoji.update(chars)
emoji_presentation_bases.update(chars)
def parse_emoji_tag_sequence(spec: str) -> None:
a = int(spec.split()[0], 16)
all_emoji.add(a)
wide_emoji.add(a)
emoji_presentation_bases.add(a)
def parse_emoji_modifier_sequence(spec: str) -> None:
a, b = list(filter(None, spec.split()))
char, mod = int(a, 16), int(b, 16)
mod
all_emoji.add(char)
wide_emoji.add(char)
emoji_presentation_bases.add(char)
def parse_emoji() -> None: def parse_emoji() -> None:
for line in get_data('emoji-data.txt', 'emoji'): for line in get_data('emoji-sequences.txt', 'emoji'):
chars, rest = split_two(line) parts = [x.strip() for x in line.split(';')]
s = emoji_categories.setdefault(rest, set()) if len(parts) < 2:
s.update(chars)
all_emoji.update(chars)
for line in get_data('emoji-variation-sequences.txt', 'emoji'):
parts = line.split()
base, var = parts[0], parts[1]
if base.startswith('#'):
continue continue
if var.upper() == 'FE0F': data, etype = parts[:2]
ibase = int(base, 16) if etype == 'Basic_Emoji':
emoji_presentation_bases.add(ibase) parse_basic_emoji(data)
elif etype == 'Emoji_Keycap_Sequence':
parse_keycap_sequence(data)
elif etype == 'RGI_Emoji_Flag_Sequence':
parse_flag_emoji_sequence(data)
elif etype == 'RGI_Emoji_Tag_Sequence':
parse_emoji_tag_sequence(data)
elif etype == 'RGI_Emoji_Modifier_Sequence':
parse_emoji_modifier_sequence(data)
doublewidth: Set[int] = set() doublewidth: Set[int] = set()
@ -204,15 +254,6 @@ def gen_emoji() -> None:
p('\t}') p('\t}')
p('\treturn false;\n}') p('\treturn false;\n}')
p('static inline bool\nis_emoji_modifier(char_type code) {')
p('\tswitch(code) {')
for spec in get_ranges(list(emoji_categories['Emoji_Modifier'])):
write_case(spec, p)
p('\t\t\treturn true;')
p('\t\tdefault: return false;')
p('\t}')
p('\treturn false;\n}')
p('static inline bool\nis_symbol(char_type code) {') p('static inline bool\nis_symbol(char_type code) {')
p('\tswitch(code) {') p('\tswitch(code) {')
for spec in get_ranges(list(all_symbols)): for spec in get_ranges(list(all_symbols)):
@ -444,10 +485,10 @@ def gen_wcwidth() -> None:
add(p, 'Marks', marks | {0}, 0) add(p, 'Marks', marks | {0}, 0)
add(p, 'Non-printing characters', non_printing, -1) add(p, 'Non-printing characters', non_printing, -1)
add(p, 'Private use', class_maps['Co'], -3) add(p, 'Private use', class_maps['Co'], -3)
add(p, 'Text Presentation', emoji_categories['Emoji'] - emoji_categories['Emoji_Presentation'], 1) add(p, 'Text Presentation', narrow_emoji, 1)
add(p, 'East Asian ambiguous width', ambiguous, -2) add(p, 'East Asian ambiguous width', ambiguous, -2)
add(p, 'East Asian double width', doublewidth, 2) add(p, 'East Asian double width', doublewidth, 2)
add(p, 'Emoji Presentation', emoji_categories['Emoji_Presentation'], 2) add(p, 'Emoji Presentation', wide_emoji, 2)
add(p, 'Not assigned in the unicode character database', not_assigned, -4) add(p, 'Not assigned in the unicode character database', not_assigned, -4)

File diff suppressed because one or more lines are too long

259
kitty/emoji.h generated
View File

@ -1,4 +1,4 @@
// unicode data, built from the unicode standard on: 2019-10-01 // unicode data, built from the unicode standard on: 2020-04-06
// see gen-wcwidth.py // see gen-wcwidth.py
#pragma once #pragma once
#include "data-types.h" #include "data-types.h"
@ -18,14 +18,10 @@ is_emoji(char_type code) {
return true; return true;
case 0xae: case 0xae:
return true; return true;
case 0x200d:
return true;
case 0x203c: case 0x203c:
return true; return true;
case 0x2049: case 0x2049:
return true; return true;
case 0x20e3:
return true;
case 0x2122: case 0x2122:
return true; return true;
case 0x2139: case 0x2139:
@ -38,8 +34,6 @@ is_emoji(char_type code) {
return true; return true;
case 0x2328: case 0x2328:
return true; return true;
case 0x2388:
return true;
case 0x23cf: case 0x23cf:
return true; return true;
case 0x23e9 ... 0x23f3: case 0x23e9 ... 0x23f3:
@ -56,15 +50,91 @@ is_emoji(char_type code) {
return true; return true;
case 0x25fb ... 0x25fe: case 0x25fb ... 0x25fe:
return true; return true;
case 0x2600 ... 0x2605: case 0x2600 ... 0x2604:
return true; return true;
case 0x2607 ... 0x2612: case 0x260e:
return true; return true;
case 0x2614 ... 0x2685: case 0x2611:
return true; return true;
case 0x2690 ... 0x2705: case 0x2614 ... 0x2615:
return true; return true;
case 0x2708 ... 0x2712: case 0x2618:
return true;
case 0x261d:
return true;
case 0x2620:
return true;
case 0x2622 ... 0x2623:
return true;
case 0x2626:
return true;
case 0x262a:
return true;
case 0x262e ... 0x262f:
return true;
case 0x2638 ... 0x263a:
return true;
case 0x2640:
return true;
case 0x2642:
return true;
case 0x2648 ... 0x2653:
return true;
case 0x265f ... 0x2660:
return true;
case 0x2663:
return true;
case 0x2665 ... 0x2666:
return true;
case 0x2668:
return true;
case 0x267b:
return true;
case 0x267e ... 0x267f:
return true;
case 0x2692 ... 0x2697:
return true;
case 0x2699:
return true;
case 0x269b ... 0x269c:
return true;
case 0x26a0 ... 0x26a1:
return true;
case 0x26a7:
return true;
case 0x26aa ... 0x26ab:
return true;
case 0x26b0 ... 0x26b1:
return true;
case 0x26bd ... 0x26be:
return true;
case 0x26c4 ... 0x26c5:
return true;
case 0x26c8:
return true;
case 0x26ce ... 0x26cf:
return true;
case 0x26d1:
return true;
case 0x26d3 ... 0x26d4:
return true;
case 0x26e9 ... 0x26ea:
return true;
case 0x26f0 ... 0x26f5:
return true;
case 0x26f7 ... 0x26fa:
return true;
case 0x26fd:
return true;
case 0x2702:
return true;
case 0x2705:
return true;
case 0x2708 ... 0x270d:
return true;
case 0x270f:
return true;
case 0x2712:
return true; return true;
case 0x2714: case 0x2714:
return true; return true;
@ -90,7 +160,7 @@ is_emoji(char_type code) {
return true; return true;
case 0x2757: case 0x2757:
return true; return true;
case 0x2763 ... 0x2767: case 0x2763 ... 0x2764:
return true; return true;
case 0x2795 ... 0x2797: case 0x2795 ... 0x2797:
return true; return true;
@ -118,15 +188,11 @@ is_emoji(char_type code) {
return true; return true;
case 0x3299: case 0x3299:
return true; return true;
case 0xfe0f: case 0x1f004:
return true; return true;
case 0x1f000 ... 0x1f0ff: case 0x1f0cf:
return true; return true;
case 0x1f10d ... 0x1f10f: case 0x1f170 ... 0x1f171:
return true;
case 0x1f12f:
return true;
case 0x1f16c ... 0x1f171:
return true; return true;
case 0x1f17e ... 0x1f17f: case 0x1f17e ... 0x1f17f:
return true; return true;
@ -134,9 +200,9 @@ is_emoji(char_type code) {
return true; return true;
case 0x1f191 ... 0x1f19a: case 0x1f191 ... 0x1f19a:
return true; return true;
case 0x1f1ad ... 0x1f1ff: case 0x1f1e6 ... 0x1f1ff:
return true; return true;
case 0x1f201 ... 0x1f20f: case 0x1f201 ... 0x1f202:
return true; return true;
case 0x1f21a: case 0x1f21a:
return true; return true;
@ -144,44 +210,107 @@ is_emoji(char_type code) {
return true; return true;
case 0x1f232 ... 0x1f23a: case 0x1f232 ... 0x1f23a:
return true; return true;
case 0x1f23c ... 0x1f23f: case 0x1f250 ... 0x1f251:
return true; return true;
case 0x1f249 ... 0x1f53d: case 0x1f300 ... 0x1f321:
return true; return true;
case 0x1f546 ... 0x1f64f: case 0x1f324 ... 0x1f393:
return true; return true;
case 0x1f680 ... 0x1f6ff: case 0x1f396 ... 0x1f397:
return true; return true;
case 0x1f774 ... 0x1f77f: case 0x1f399 ... 0x1f39b:
return true; return true;
case 0x1f7d5 ... 0x1f7ff: case 0x1f39e ... 0x1f3f0:
return true; return true;
case 0x1f80c ... 0x1f80f: case 0x1f3f3 ... 0x1f3f5:
return true; return true;
case 0x1f848 ... 0x1f84f: case 0x1f3f7 ... 0x1f4fd:
return true; return true;
case 0x1f85a ... 0x1f85f: case 0x1f4ff ... 0x1f53d:
return true; return true;
case 0x1f888 ... 0x1f88f: case 0x1f549 ... 0x1f54e:
return true; return true;
case 0x1f8ae ... 0x1f8ff: case 0x1f550 ... 0x1f567:
return true;
case 0x1f56f ... 0x1f570:
return true;
case 0x1f573 ... 0x1f57a:
return true;
case 0x1f587:
return true;
case 0x1f58a ... 0x1f58d:
return true;
case 0x1f590:
return true;
case 0x1f595 ... 0x1f596:
return true;
case 0x1f5a4 ... 0x1f5a5:
return true;
case 0x1f5a8:
return true;
case 0x1f5b1 ... 0x1f5b2:
return true;
case 0x1f5bc:
return true;
case 0x1f5c2 ... 0x1f5c4:
return true;
case 0x1f5d1 ... 0x1f5d3:
return true;
case 0x1f5dc ... 0x1f5de:
return true;
case 0x1f5e1:
return true;
case 0x1f5e3:
return true;
case 0x1f5e8:
return true;
case 0x1f5ef:
return true;
case 0x1f5f3:
return true;
case 0x1f5fa ... 0x1f64f:
return true;
case 0x1f680 ... 0x1f6c5:
return true;
case 0x1f6cb ... 0x1f6d2:
return true;
case 0x1f6d5 ... 0x1f6d7:
return true;
case 0x1f6e0 ... 0x1f6e5:
return true;
case 0x1f6e9:
return true;
case 0x1f6eb ... 0x1f6ec:
return true;
case 0x1f6f0:
return true;
case 0x1f6f3 ... 0x1f6fc:
return true;
case 0x1f7e0 ... 0x1f7eb:
return true; return true;
case 0x1f90c ... 0x1f93a: case 0x1f90c ... 0x1f93a:
return true; return true;
case 0x1f93c ... 0x1f945: case 0x1f93c ... 0x1f945:
return true; return true;
case 0x1f947 ... 0x1fffd: case 0x1f947 ... 0x1f978:
return true; return true;
case 0xe0020 ... 0xe007f: case 0x1f97a ... 0x1f9cb:
return true; return true;
default: return false; case 0x1f9cd ... 0x1f9ff:
} return true;
return false; case 0x1fa70 ... 0x1fa74:
} return true;
static inline bool case 0x1fa78 ... 0x1fa7a:
is_emoji_modifier(char_type code) { return true;
switch(code) { case 0x1fa80 ... 0x1fa86:
case 0x1f3fb ... 0x1f3ff: return true;
case 0x1fa90 ... 0x1faa8:
return true;
case 0x1fab0 ... 0x1fab6:
return true;
case 0x1fac0 ... 0x1fac2:
return true;
case 0x1fad0 ... 0x1fad6:
return true; return true;
default: return false; default: return false;
} }
@ -390,10 +519,12 @@ is_symbol(char_type code) {
return true; return true;
case 0x2b76 ... 0x2b95: case 0x2b76 ... 0x2b95:
return true; return true;
case 0x2b98 ... 0x2bff: case 0x2b97 ... 0x2bff:
return true; return true;
case 0x2ce5 ... 0x2cea: case 0x2ce5 ... 0x2cea:
return true; return true;
case 0x2e50 ... 0x2e51:
return true;
case 0x2e80 ... 0x2e99: case 0x2e80 ... 0x2e99:
return true; return true;
case 0x2e9b ... 0x2ef3: case 0x2e9b ... 0x2ef3:
@ -450,6 +581,8 @@ is_symbol(char_type code) {
return true; return true;
case 0xab5b: case 0xab5b:
return true; return true;
case 0xab6a ... 0xab6b:
return true;
case 0xfb29: case 0xfb29:
return true; return true;
case 0xfbb2 ... 0xfbc1: case 0xfbb2 ... 0xfbc1:
@ -488,7 +621,7 @@ is_symbol(char_type code) {
return true; return true;
case 0x1018c ... 0x1018e: case 0x1018c ... 0x1018e:
return true; return true;
case 0x10190 ... 0x1019b: case 0x10190 ... 0x1019c:
return true; return true;
case 0x101a0: case 0x101a0:
return true; return true;
@ -582,9 +715,7 @@ is_symbol(char_type code) {
return true; return true;
case 0x1f0d1 ... 0x1f0f5: case 0x1f0d1 ... 0x1f0f5:
return true; return true;
case 0x1f110 ... 0x1f16c: case 0x1f10d ... 0x1f1ad:
return true;
case 0x1f170 ... 0x1f1ac:
return true; return true;
case 0x1f1e6 ... 0x1f202: case 0x1f1e6 ... 0x1f202:
return true; return true;
@ -596,11 +727,11 @@ is_symbol(char_type code) {
return true; return true;
case 0x1f260 ... 0x1f265: case 0x1f260 ... 0x1f265:
return true; return true;
case 0x1f300 ... 0x1f6d5: case 0x1f300 ... 0x1f6d7:
return true; return true;
case 0x1f6e0 ... 0x1f6ec: case 0x1f6e0 ... 0x1f6ec:
return true; return true;
case 0x1f6f0 ... 0x1f6fa: case 0x1f6f0 ... 0x1f6fc:
return true; return true;
case 0x1f700 ... 0x1f773: case 0x1f700 ... 0x1f773:
return true; return true;
@ -618,29 +749,33 @@ is_symbol(char_type code) {
return true; return true;
case 0x1f890 ... 0x1f8ad: case 0x1f890 ... 0x1f8ad:
return true; return true;
case 0x1f900 ... 0x1f90b: case 0x1f8b0 ... 0x1f8b1:
return true; return true;
case 0x1f90d ... 0x1f971: case 0x1f900 ... 0x1f978:
return true; return true;
case 0x1f973 ... 0x1f976: case 0x1f97a ... 0x1f9cb:
return true;
case 0x1f97a ... 0x1f9a2:
return true;
case 0x1f9a5 ... 0x1f9aa:
return true;
case 0x1f9ae ... 0x1f9ca:
return true; return true;
case 0x1f9cd ... 0x1fa53: case 0x1f9cd ... 0x1fa53:
return true; return true;
case 0x1fa60 ... 0x1fa6d: case 0x1fa60 ... 0x1fa6d:
return true; return true;
case 0x1fa70 ... 0x1fa73: case 0x1fa70 ... 0x1fa74:
return true; return true;
case 0x1fa78 ... 0x1fa7a: case 0x1fa78 ... 0x1fa7a:
return true; return true;
case 0x1fa80 ... 0x1fa82: case 0x1fa80 ... 0x1fa86:
return true; return true;
case 0x1fa90 ... 0x1fa95: case 0x1fa90 ... 0x1faa8:
return true;
case 0x1fab0 ... 0x1fab6:
return true;
case 0x1fac0 ... 0x1fac2:
return true;
case 0x1fad0 ... 0x1fad6:
return true;
case 0x1fb00 ... 0x1fb92:
return true;
case 0x1fb94 ... 0x1fbca:
return true; return true;
default: return false; default: return false;
} }

556
kitty/unicode-data.c generated

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
#include "data-types.h" #include "data-types.h"
#define VS15 1280 #define VS15 1285
#define VS16 1281 #define VS16 1286
bool is_combining_char(char_type ch); bool is_combining_char(char_type ch);
bool is_ignored_char(char_type ch); bool is_ignored_char(char_type ch);

386
kitty/wcwidth-std.h generated
View File

@ -1,4 +1,4 @@
// unicode data, built from the unicode standard on: 2019-10-01 // unicode data, built from the unicode standard on: 2020-04-06
// see gen-wcwidth.py // see gen-wcwidth.py
#pragma once #pragma once
#include "data-types.h" #include "data-types.h"
@ -8,7 +8,7 @@ START_ALLOW_CASE_RANGE
static int static int
wcwidth_std(int32_t code) { wcwidth_std(int32_t code) {
switch(code) { switch(code) {
// Marks (2275 codepoints) {{{ // Marks (2302 codepoints) {{{
case 0x0: case 0x0:
return 0; return 0;
case 0x300 ... 0x36f: case 0x300 ... 0x36f:
@ -127,7 +127,7 @@ wcwidth_std(int32_t code) {
return 0; return 0;
case 0xb4b ... 0xb4d: case 0xb4b ... 0xb4d:
return 0; return 0;
case 0xb56 ... 0xb57: case 0xb55 ... 0xb57:
return 0; return 0;
case 0xb62 ... 0xb63: case 0xb62 ... 0xb63:
return 0; return 0;
@ -181,7 +181,7 @@ wcwidth_std(int32_t code) {
return 0; return 0;
case 0xd62 ... 0xd63: case 0xd62 ... 0xd63:
return 0; return 0;
case 0xd82 ... 0xd83: case 0xd81 ... 0xd83:
return 0; return 0;
case 0xdca: case 0xdca:
return 0; return 0;
@ -275,7 +275,7 @@ wcwidth_std(int32_t code) {
return 0; return 0;
case 0x1a7f: case 0x1a7f:
return 0; return 0;
case 0x1ab0 ... 0x1abe: case 0x1ab0 ... 0x1ac0:
return 0; return 0;
case 0x1b00 ... 0x1b04: case 0x1b00 ... 0x1b04:
return 0; return 0;
@ -335,6 +335,8 @@ wcwidth_std(int32_t code) {
return 0; return 0;
case 0xa823 ... 0xa827: case 0xa823 ... 0xa827:
return 0; return 0;
case 0xa82c:
return 0;
case 0xa880 ... 0xa881: case 0xa880 ... 0xa881:
return 0; return 0;
case 0xa8b4 ... 0xa8c5: case 0xa8b4 ... 0xa8c5:
@ -405,6 +407,8 @@ wcwidth_std(int32_t code) {
return 0; return 0;
case 0x10d24 ... 0x10d27: case 0x10d24 ... 0x10d27:
return 0; return 0;
case 0x10eab ... 0x10eac:
return 0;
case 0x10f46 ... 0x10f50: case 0x10f46 ... 0x10f50:
return 0; return 0;
case 0x11000 ... 0x11002: case 0x11000 ... 0x11002:
@ -429,6 +433,8 @@ wcwidth_std(int32_t code) {
return 0; return 0;
case 0x111c9 ... 0x111cc: case 0x111c9 ... 0x111cc:
return 0; return 0;
case 0x111ce ... 0x111cf:
return 0;
case 0x1122c ... 0x11237: case 0x1122c ... 0x11237:
return 0; return 0;
case 0x1123e: case 0x1123e:
@ -473,6 +479,16 @@ wcwidth_std(int32_t code) {
return 0; return 0;
case 0x1182c ... 0x1183a: case 0x1182c ... 0x1183a:
return 0; return 0;
case 0x11930 ... 0x11935:
return 0;
case 0x11937 ... 0x11938:
return 0;
case 0x1193b ... 0x1193e:
return 0;
case 0x11940:
return 0;
case 0x11942 ... 0x11943:
return 0;
case 0x119d1 ... 0x119d7: case 0x119d1 ... 0x119d7:
return 0; return 0;
case 0x119da ... 0x119e0: case 0x119da ... 0x119e0:
@ -527,6 +543,10 @@ wcwidth_std(int32_t code) {
return 0; return 0;
case 0x16f8f ... 0x16f92: case 0x16f8f ... 0x16f92:
return 0; return 0;
case 0x16fe4:
return 0;
case 0x16ff0 ... 0x16ff1:
return 0;
case 0x1bc9d ... 0x1bc9e: case 0x1bc9d ... 0x1bc9e:
return 0; return 0;
case 0x1d165 ... 0x1d169: case 0x1d165 ... 0x1d169:
@ -637,7 +657,7 @@ wcwidth_std(int32_t code) {
return -3; return -3;
// }}} // }}}
// Text Presentation (218 codepoints) {{{ // Text Presentation (219 codepoints) {{{
case 0x23: case 0x23:
return 1; return 1;
case 0x2a: case 0x2a:
@ -728,6 +748,8 @@ wcwidth_std(int32_t code) {
return 1; return 1;
case 0x26a0: case 0x26a0:
return 1; return 1;
case 0x26a7:
return 1;
case 0x26b0 ... 0x26b1: case 0x26b0 ... 0x26b1:
return 1; return 1;
case 0x26c8: case 0x26c8:
@ -1227,7 +1249,7 @@ wcwidth_std(int32_t code) {
return -2; return -2;
// }}} // }}}
// East Asian double width (181868 codepoints) {{{ // East Asian double width (182418 codepoints) {{{
case 0x1100 ... 0x115f: case 0x1100 ... 0x115f:
return 2; return 2;
case 0x231a ... 0x231b: case 0x231a ... 0x231b:
@ -1320,9 +1342,7 @@ wcwidth_std(int32_t code) {
return 2; return 2;
case 0x3131 ... 0x318e: case 0x3131 ... 0x318e:
return 2; return 2;
case 0x3190 ... 0x31ba: case 0x3190 ... 0x31e3:
return 2;
case 0x31c0 ... 0x31e3:
return 2; return 2;
case 0x31f0 ... 0x321e: case 0x31f0 ... 0x321e:
return 2; return 2;
@ -1360,7 +1380,9 @@ wcwidth_std(int32_t code) {
return 2; return 2;
case 0x17000 ... 0x187f7: case 0x17000 ... 0x187f7:
return 2; return 2;
case 0x18800 ... 0x18af2: case 0x18800 ... 0x18cd5:
return 2;
case 0x18d00 ... 0x18d08:
return 2; return 2;
case 0x1b000 ... 0x1b11e: case 0x1b000 ... 0x1b11e:
return 2; return 2;
@ -1434,33 +1456,37 @@ wcwidth_std(int32_t code) {
return 2; return 2;
case 0x1f6d0 ... 0x1f6d2: case 0x1f6d0 ... 0x1f6d2:
return 2; return 2;
case 0x1f6d5: case 0x1f6d5 ... 0x1f6d7:
return 2; return 2;
case 0x1f6eb ... 0x1f6ec: case 0x1f6eb ... 0x1f6ec:
return 2; return 2;
case 0x1f6f4 ... 0x1f6fa: case 0x1f6f4 ... 0x1f6fc:
return 2; return 2;
case 0x1f7e0 ... 0x1f7eb: case 0x1f7e0 ... 0x1f7eb:
return 2; return 2;
case 0x1f90d ... 0x1f971: case 0x1f90c ... 0x1f93a:
return 2; return 2;
case 0x1f973 ... 0x1f976: case 0x1f93c ... 0x1f945:
return 2; return 2;
case 0x1f97a ... 0x1f9a2: case 0x1f947 ... 0x1f978:
return 2; return 2;
case 0x1f9a5 ... 0x1f9aa: case 0x1f97a ... 0x1f9cb:
return 2;
case 0x1f9ae ... 0x1f9ca:
return 2; return 2;
case 0x1f9cd ... 0x1f9ff: case 0x1f9cd ... 0x1f9ff:
return 2; return 2;
case 0x1fa70 ... 0x1fa73: case 0x1fa70 ... 0x1fa74:
return 2; return 2;
case 0x1fa78 ... 0x1fa7a: case 0x1fa78 ... 0x1fa7a:
return 2; return 2;
case 0x1fa80 ... 0x1fa82: case 0x1fa80 ... 0x1fa86:
return 2; return 2;
case 0x1fa90 ... 0x1fa95: case 0x1fa90 ... 0x1faa8:
return 2;
case 0x1fab0 ... 0x1fab6:
return 2;
case 0x1fac0 ... 0x1fac2:
return 2;
case 0x1fad0 ... 0x1fad6:
return 2; return 2;
case 0x20000 ... 0x2fffd: case 0x20000 ... 0x2fffd:
return 2; return 2;
@ -1473,7 +1499,7 @@ wcwidth_std(int32_t code) {
return 2; return 2;
// }}} // }}}
// Not assigned in the unicode character database (766326 codepoints) {{{ // Not assigned in the unicode character database (765365 codepoints) {{{
case 0x378 ... 0x379: case 0x378 ... 0x379:
return -4; return -4;
case 0x380 ... 0x383: case 0x380 ... 0x383:
@ -1520,7 +1546,7 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x8b5: case 0x8b5:
return -4; return -4;
case 0x8be ... 0x8d2: case 0x8c8 ... 0x8d2:
return -4; return -4;
case 0x984: case 0x984:
return -4; return -4;
@ -1628,7 +1654,7 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0xb49 ... 0xb4a: case 0xb49 ... 0xb4a:
return -4; return -4;
case 0xb4e ... 0xb55: case 0xb4e ... 0xb54:
return -4; return -4;
case 0xb58 ... 0xb5b: case 0xb58 ... 0xb5b:
return -4; return -4;
@ -1718,8 +1744,6 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0xcf3 ... 0xcff: case 0xcf3 ... 0xcff:
return -4; return -4;
case 0xd04:
return -4;
case 0xd0d: case 0xd0d:
return -4; return -4;
case 0xd11: case 0xd11:
@ -1732,7 +1756,7 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0xd64 ... 0xd65: case 0xd64 ... 0xd65:
return -4; return -4;
case 0xd80 ... 0xd81: case 0xd80:
return -4; return -4;
case 0xd84: case 0xd84:
return -4; return -4;
@ -1906,7 +1930,7 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x1aae ... 0x1aaf: case 0x1aae ... 0x1aaf:
return -4; return -4;
case 0x1abf ... 0x1aff: case 0x1ac1 ... 0x1aff:
return -4; return -4;
case 0x1b4c ... 0x1b4f: case 0x1b4c ... 0x1b4f:
return -4; return -4;
@ -1980,7 +2004,7 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x2b74 ... 0x2b75: case 0x2b74 ... 0x2b75:
return -4; return -4;
case 0x2b96 ... 0x2b97: case 0x2b96:
return -4; return -4;
case 0x2c2f: case 0x2c2f:
return -4; return -4;
@ -2016,7 +2040,7 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x2ddf: case 0x2ddf:
return -4; return -4;
case 0x2e50 ... 0x2e7f: case 0x2e53 ... 0x2e7f:
return -4; return -4;
case 0x2e9a: case 0x2e9a:
return -4; return -4;
@ -2036,8 +2060,6 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x318f: case 0x318f:
return -4; return -4;
case 0x31bb ... 0x31bf:
return -4;
case 0x31e4 ... 0x31ef: case 0x31e4 ... 0x31ef:
return -4; return -4;
case 0x321f: case 0x321f:
@ -2052,9 +2074,9 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0xa7c0 ... 0xa7c1: case 0xa7c0 ... 0xa7c1:
return -4; return -4;
case 0xa7c7 ... 0xa7f6: case 0xa7cb ... 0xa7f4:
return -4; return -4;
case 0xa82c ... 0xa82f: case 0xa82d ... 0xa82f:
return -4; return -4;
case 0xa83a ... 0xa83f: case 0xa83a ... 0xa83f:
return -4; return -4;
@ -2094,7 +2116,7 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0xab2f: case 0xab2f:
return -4; return -4;
case 0xab68 ... 0xab6f: case 0xab6c ... 0xab6f:
return -4; return -4;
case 0xabee ... 0xabef: case 0xabee ... 0xabef:
return -4; return -4;
@ -2180,7 +2202,7 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x1018f: case 0x1018f:
return -4; return -4;
case 0x1019c ... 0x1019f: case 0x1019d ... 0x1019f:
return -4; return -4;
case 0x101a1 ... 0x101cf: case 0x101a1 ... 0x101cf:
return -4; return -4;
@ -2298,11 +2320,19 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x10d3a ... 0x10e5f: case 0x10d3a ... 0x10e5f:
return -4; return -4;
case 0x10e7f ... 0x10eff: case 0x10e7f:
return -4;
case 0x10eaa:
return -4;
case 0x10eae ... 0x10eaf:
return -4;
case 0x10eb2 ... 0x10eff:
return -4; return -4;
case 0x10f28 ... 0x10f2f: case 0x10f28 ... 0x10f2f:
return -4; return -4;
case 0x10f5a ... 0x10fdf: case 0x10f5a ... 0x10faf:
return -4;
case 0x10fcc ... 0x10fdf:
return -4; return -4;
case 0x10ff7 ... 0x10fff: case 0x10ff7 ... 0x10fff:
return -4; return -4;
@ -2320,12 +2350,10 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x11135: case 0x11135:
return -4; return -4;
case 0x11147 ... 0x1114f: case 0x11148 ... 0x1114f:
return -4; return -4;
case 0x11177 ... 0x1117f: case 0x11177 ... 0x1117f:
return -4; return -4;
case 0x111ce ... 0x111cf:
return -4;
case 0x111e0: case 0x111e0:
return -4; return -4;
case 0x111f5 ... 0x111ff: case 0x111f5 ... 0x111ff:
@ -2378,11 +2406,9 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x11375 ... 0x113ff: case 0x11375 ... 0x113ff:
return -4; return -4;
case 0x1145a:
return -4;
case 0x1145c: case 0x1145c:
return -4; return -4;
case 0x11460 ... 0x1147f: case 0x11462 ... 0x1147f:
return -4; return -4;
case 0x114c8 ... 0x114cf: case 0x114c8 ... 0x114cf:
return -4; return -4;
@ -2412,7 +2438,21 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x118f3 ... 0x118fe: case 0x118f3 ... 0x118fe:
return -4; return -4;
case 0x11900 ... 0x1199f: case 0x11907 ... 0x11908:
return -4;
case 0x1190a ... 0x1190b:
return -4;
case 0x11914:
return -4;
case 0x11917:
return -4;
case 0x11936:
return -4;
case 0x11939 ... 0x1193a:
return -4;
case 0x11947 ... 0x1194f:
return -4;
case 0x1195a ... 0x1199f:
return -4; return -4;
case 0x119a8 ... 0x119a9: case 0x119a8 ... 0x119a9:
return -4; return -4;
@ -2466,7 +2506,9 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x11daa ... 0x11edf: case 0x11daa ... 0x11edf:
return -4; return -4;
case 0x11ef9 ... 0x11fbf: case 0x11ef9 ... 0x11faf:
return -4;
case 0x11fb1 ... 0x11fbf:
return -4; return -4;
case 0x11ff2 ... 0x11ffe: case 0x11ff2 ... 0x11ffe:
return -4; return -4;
@ -2514,11 +2556,15 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x16fa0 ... 0x16fdf: case 0x16fa0 ... 0x16fdf:
return -4; return -4;
case 0x16fe4 ... 0x16fff: case 0x16fe5 ... 0x16fef:
return -4;
case 0x16ff2 ... 0x16fff:
return -4; return -4;
case 0x187f8 ... 0x187ff: case 0x187f8 ... 0x187ff:
return -4; return -4;
case 0x18af3 ... 0x1afff: case 0x18cd6 ... 0x18cff:
return -4;
case 0x18d09 ... 0x1afff:
return -4; return -4;
case 0x1b11f ... 0x1b14f: case 0x1b11f ... 0x1b14f:
return -4; return -4;
@ -2714,11 +2760,7 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x1f0f6 ... 0x1f0ff: case 0x1f0f6 ... 0x1f0ff:
return -4; return -4;
case 0x1f10d ... 0x1f10f: case 0x1f1ae ... 0x1f1e5:
return -4;
case 0x1f16d ... 0x1f16f:
return -4;
case 0x1f1ad ... 0x1f1e5:
return -4; return -4;
case 0x1f203 ... 0x1f20f: case 0x1f203 ... 0x1f20f:
return -4; return -4;
@ -2730,11 +2772,11 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x1f266 ... 0x1f2ff: case 0x1f266 ... 0x1f2ff:
return -4; return -4;
case 0x1f6d6 ... 0x1f6df: case 0x1f6d8 ... 0x1f6df:
return -4; return -4;
case 0x1f6ed ... 0x1f6ef: case 0x1f6ed ... 0x1f6ef:
return -4; return -4;
case 0x1f6fb ... 0x1f6ff: case 0x1f6fd ... 0x1f6ff:
return -4; return -4;
case 0x1f774 ... 0x1f77f: case 0x1f774 ... 0x1f77f:
return -4; return -4;
@ -2750,31 +2792,37 @@ wcwidth_std(int32_t code) {
return -4; return -4;
case 0x1f888 ... 0x1f88f: case 0x1f888 ... 0x1f88f:
return -4; return -4;
case 0x1f8ae ... 0x1f8ff: case 0x1f8ae ... 0x1f8af:
return -4; return -4;
case 0x1f90c: case 0x1f8b2 ... 0x1f8ff:
return -4; return -4;
case 0x1f972: case 0x1f979:
return -4; return -4;
case 0x1f977 ... 0x1f979: case 0x1f9cc:
return -4;
case 0x1f9a3 ... 0x1f9a4:
return -4;
case 0x1f9ab ... 0x1f9ad:
return -4;
case 0x1f9cb ... 0x1f9cc:
return -4; return -4;
case 0x1fa54 ... 0x1fa5f: case 0x1fa54 ... 0x1fa5f:
return -4; return -4;
case 0x1fa6e ... 0x1fa6f: case 0x1fa6e ... 0x1fa6f:
return -4; return -4;
case 0x1fa74 ... 0x1fa77: case 0x1fa75 ... 0x1fa77:
return -4; return -4;
case 0x1fa7b ... 0x1fa7f: case 0x1fa7b ... 0x1fa7f:
return -4; return -4;
case 0x1fa83 ... 0x1fa8f: case 0x1fa87 ... 0x1fa8f:
return -4; return -4;
case 0x1fa96 ... 0x1ffff: case 0x1faa9 ... 0x1faaf:
return -4;
case 0x1fab7 ... 0x1fabf:
return -4;
case 0x1fac3 ... 0x1facf:
return -4;
case 0x1fad7 ... 0x1faff:
return -4;
case 0x1fb93:
return -4;
case 0x1fbcb ... 0x1fbef:
return -4;
case 0x1fbfa ... 0x1ffff:
return -4; return -4;
case 0x2fffe ... 0x2ffff: case 0x2fffe ... 0x2ffff:
return -4; return -4;
@ -2827,11 +2875,7 @@ is_emoji_presentation_base(uint32_t code) {
return true; return true;
case 0x23cf: case 0x23cf:
return true; return true;
case 0x23e9 ... 0x23ea: case 0x23e9 ... 0x23f3:
return true;
case 0x23ed ... 0x23ef:
return true;
case 0x23f1 ... 0x23f3:
return true; return true;
case 0x23f8 ... 0x23fa: case 0x23f8 ... 0x23fa:
return true; return true;
@ -2895,6 +2939,8 @@ is_emoji_presentation_base(uint32_t code) {
return true; return true;
case 0x26a0 ... 0x26a1: case 0x26a0 ... 0x26a1:
return true; return true;
case 0x26a7:
return true;
case 0x26aa ... 0x26ab: case 0x26aa ... 0x26ab:
return true; return true;
case 0x26b0 ... 0x26b1: case 0x26b0 ... 0x26b1:
@ -2905,7 +2951,7 @@ is_emoji_presentation_base(uint32_t code) {
return true; return true;
case 0x26c8: case 0x26c8:
return true; return true;
case 0x26cf: case 0x26ce ... 0x26cf:
return true; return true;
case 0x26d1: case 0x26d1:
return true; return true;
@ -2921,9 +2967,9 @@ is_emoji_presentation_base(uint32_t code) {
return true; return true;
case 0x2702: case 0x2702:
return true; return true;
case 0x2708 ... 0x2709: case 0x2705:
return true; return true;
case 0x270c ... 0x270d: case 0x2708 ... 0x270d:
return true; return true;
case 0x270f: case 0x270f:
return true; return true;
@ -2937,20 +2983,32 @@ is_emoji_presentation_base(uint32_t code) {
return true; return true;
case 0x2721: case 0x2721:
return true; return true;
case 0x2728:
return true;
case 0x2733 ... 0x2734: case 0x2733 ... 0x2734:
return true; return true;
case 0x2744: case 0x2744:
return true; return true;
case 0x2747: case 0x2747:
return true; return true;
case 0x2753: case 0x274c:
return true;
case 0x274e:
return true;
case 0x2753 ... 0x2755:
return true; return true;
case 0x2757: case 0x2757:
return true; return true;
case 0x2763 ... 0x2764: case 0x2763 ... 0x2764:
return true; return true;
case 0x2795 ... 0x2797:
return true;
case 0x27a1: case 0x27a1:
return true; return true;
case 0x27b0:
return true;
case 0x27bf:
return true;
case 0x2934 ... 0x2935: case 0x2934 ... 0x2935:
return true; return true;
case 0x2b05 ... 0x2b07: case 0x2b05 ... 0x2b07:
@ -2971,125 +3029,51 @@ is_emoji_presentation_base(uint32_t code) {
return true; return true;
case 0x1f004: case 0x1f004:
return true; return true;
case 0x1f0cf:
return true;
case 0x1f170 ... 0x1f171: case 0x1f170 ... 0x1f171:
return true; return true;
case 0x1f17e ... 0x1f17f: case 0x1f17e ... 0x1f17f:
return true; return true;
case 0x1f202: case 0x1f18e:
return true;
case 0x1f191 ... 0x1f19a:
return true;
case 0x1f1e6 ... 0x1f1ff:
return true;
case 0x1f201 ... 0x1f202:
return true; return true;
case 0x1f21a: case 0x1f21a:
return true; return true;
case 0x1f22f: case 0x1f22f:
return true; return true;
case 0x1f237: case 0x1f232 ... 0x1f23a:
return true; return true;
case 0x1f30d ... 0x1f30f: case 0x1f250 ... 0x1f251:
return true; return true;
case 0x1f315: case 0x1f300 ... 0x1f321:
return true; return true;
case 0x1f31c: case 0x1f324 ... 0x1f393:
return true;
case 0x1f321:
return true;
case 0x1f324 ... 0x1f32c:
return true;
case 0x1f336:
return true;
case 0x1f378:
return true;
case 0x1f37d:
return true;
case 0x1f393:
return true; return true;
case 0x1f396 ... 0x1f397: case 0x1f396 ... 0x1f397:
return true; return true;
case 0x1f399 ... 0x1f39b: case 0x1f399 ... 0x1f39b:
return true; return true;
case 0x1f39e ... 0x1f39f: case 0x1f39e ... 0x1f3f0:
return true; return true;
case 0x1f3a7: case 0x1f3f3 ... 0x1f3f5:
return true; return true;
case 0x1f3ac ... 0x1f3ae: case 0x1f3f7 ... 0x1f4fd:
return true; return true;
case 0x1f3c2: case 0x1f4ff ... 0x1f53d:
return true; return true;
case 0x1f3c4: case 0x1f549 ... 0x1f54e:
return true;
case 0x1f3c6:
return true;
case 0x1f3ca ... 0x1f3ce:
return true;
case 0x1f3d4 ... 0x1f3e0:
return true;
case 0x1f3ed:
return true;
case 0x1f3f3:
return true;
case 0x1f3f5:
return true;
case 0x1f3f7:
return true;
case 0x1f408:
return true;
case 0x1f415:
return true;
case 0x1f41f:
return true;
case 0x1f426:
return true;
case 0x1f43f:
return true;
case 0x1f441 ... 0x1f442:
return true;
case 0x1f446 ... 0x1f449:
return true;
case 0x1f44d ... 0x1f44e:
return true;
case 0x1f453:
return true;
case 0x1f46a:
return true;
case 0x1f47d:
return true;
case 0x1f4a3:
return true;
case 0x1f4b0:
return true;
case 0x1f4b3:
return true;
case 0x1f4bb:
return true;
case 0x1f4bf:
return true;
case 0x1f4cb:
return true;
case 0x1f4da:
return true;
case 0x1f4df:
return true;
case 0x1f4e4 ... 0x1f4e6:
return true;
case 0x1f4ea ... 0x1f4ed:
return true;
case 0x1f4f7:
return true;
case 0x1f4f9 ... 0x1f4fb:
return true;
case 0x1f4fd:
return true;
case 0x1f508:
return true;
case 0x1f50d:
return true;
case 0x1f512 ... 0x1f513:
return true;
case 0x1f549 ... 0x1f54a:
return true; return true;
case 0x1f550 ... 0x1f567: case 0x1f550 ... 0x1f567:
return true; return true;
case 0x1f56f ... 0x1f570: case 0x1f56f ... 0x1f570:
return true; return true;
case 0x1f573 ... 0x1f579: case 0x1f573 ... 0x1f57a:
return true; return true;
case 0x1f587: case 0x1f587:
return true; return true;
@ -3097,7 +3081,9 @@ is_emoji_presentation_base(uint32_t code) {
return true; return true;
case 0x1f590: case 0x1f590:
return true; return true;
case 0x1f5a5: case 0x1f595 ... 0x1f596:
return true;
case 0x1f5a4 ... 0x1f5a5:
return true; return true;
case 0x1f5a8: case 0x1f5a8:
return true; return true;
@ -3121,39 +3107,49 @@ is_emoji_presentation_base(uint32_t code) {
return true; return true;
case 0x1f5f3: case 0x1f5f3:
return true; return true;
case 0x1f5fa: case 0x1f5fa ... 0x1f64f:
return true; return true;
case 0x1f610: case 0x1f680 ... 0x1f6c5:
return true; return true;
case 0x1f687: case 0x1f6cb ... 0x1f6d2:
return true; return true;
case 0x1f68d: case 0x1f6d5 ... 0x1f6d7:
return true;
case 0x1f691:
return true;
case 0x1f694:
return true;
case 0x1f698:
return true;
case 0x1f6ad:
return true;
case 0x1f6b2:
return true;
case 0x1f6b9 ... 0x1f6ba:
return true;
case 0x1f6bc:
return true;
case 0x1f6cb:
return true;
case 0x1f6cd ... 0x1f6cf:
return true; return true;
case 0x1f6e0 ... 0x1f6e5: case 0x1f6e0 ... 0x1f6e5:
return true; return true;
case 0x1f6e9: case 0x1f6e9:
return true; return true;
case 0x1f6eb ... 0x1f6ec:
return true;
case 0x1f6f0: case 0x1f6f0:
return true; return true;
case 0x1f6f3: case 0x1f6f3 ... 0x1f6fc:
return true;
case 0x1f7e0 ... 0x1f7eb:
return true;
case 0x1f90c ... 0x1f93a:
return true;
case 0x1f93c ... 0x1f945:
return true;
case 0x1f947 ... 0x1f978:
return true;
case 0x1f97a ... 0x1f9cb:
return true;
case 0x1f9cd ... 0x1f9ff:
return true;
case 0x1fa70 ... 0x1fa74:
return true;
case 0x1fa78 ... 0x1fa7a:
return true;
case 0x1fa80 ... 0x1fa86:
return true;
case 0x1fa90 ... 0x1faa8:
return true;
case 0x1fab0 ... 0x1fab6:
return true;
case 0x1fac0 ... 0x1fac2:
return true;
case 0x1fad0 ... 0x1fad6:
return true; return true;
default: return false; default: return false;
} }