From 35203c05519a74dcf6f936b57225a12c19c0e031 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sat, 20 Aug 2022 21:36:07 -0700 Subject: [PATCH] Do some string library work --- libc/nexgen32e/strsak32.S | 9 - libc/sock/htonl.c | 27 + libc/sock/htons.c | 27 + libc/sock/ntohl.c | 27 + libc/sock/ntohs.c | 27 + libc/sock/shutdown.c | 1 + libc/sock/sock.h | 17 +- libc/str/strcpy16.c | 13 +- libc/str/strlen16.c | 2 +- libc/str/tprecode16to8.c | 2 +- libc/str/tprecode8to16.c | 2 +- libc/str/wcscpy.c | 9 +- libc/str/wcslen.c | 37 +- libc/str/wcsncasecmp.c | 2 +- libc/str/wcsstr.c | 42 + libc/sysv/calls/bsdthread_create.s | 2 +- libc/sysv/calls/bsdthread_register.s | 2 +- libc/sysv/calls/sys_pledge.s | 2 +- libc/sysv/syscalls.sh | 8 +- libc/testlib/testlib.mk | 4 + libc/testlib/viewables.S | 33 + libc/testlib/viewables.h | 12 + libc/testlib/viewables.txt | 924 ++++++++++++++++++ libc/x/{utf16toutf8.c => utf16to8.c} | 2 +- .../x/utf8toutf32_test.c => libc/x/utf32to8.c | 62 +- libc/x/{utf8toutf16.c => utf8to16.c} | 2 +- libc/x/{utf8toutf32.c => utf8to32.c} | 7 +- libc/x/x.h | 7 +- test/libc/fmt/sscanf_test.c | 4 +- test/libc/nexgen32e/strsak32_test.c | 2 +- test/libc/str/strchr_test.c | 16 + test/libc/x/utf16to32_test.c | 4 +- .../x/{utf16toutf8_test.c => utf16to8_test.c} | 22 +- .../x/{utf8toutf16_test.c => utf8to16_test.c} | 21 +- test/libc/x/utf8to32_test.c | 107 ++ third_party/python/Modules/getpath.c | 2 +- third_party/python/Modules/posixmodule.c | 8 +- third_party/python/Python/sysmodule.c | 4 +- third_party/python/launch.c | 2 +- third_party/python/pycomp.c | 4 +- tool/build/ar.c | 2 +- tool/decode/scrubdox.c | 8 +- 42 files changed, 1381 insertions(+), 136 deletions(-) create mode 100644 libc/sock/htonl.c create mode 100644 libc/sock/htons.c create mode 100644 libc/sock/ntohl.c create mode 100644 libc/sock/ntohs.c create mode 100644 libc/str/wcsstr.c create mode 100644 libc/testlib/viewables.S create mode 100644 libc/testlib/viewables.h create mode 100644 libc/testlib/viewables.txt rename libc/x/{utf16toutf8.c => utf16to8.c} (98%) rename test/libc/x/utf8toutf32_test.c => libc/x/utf32to8.c (58%) rename libc/x/{utf8toutf16.c => utf8to16.c} (98%) rename libc/x/{utf8toutf32.c => utf8to32.c} (95%) rename test/libc/x/{utf16toutf8_test.c => utf16to8_test.c} (73%) rename test/libc/x/{utf8toutf16_test.c => utf8to16_test.c} (74%) create mode 100644 test/libc/x/utf8to32_test.c diff --git a/libc/nexgen32e/strsak32.S b/libc/nexgen32e/strsak32.S index b5b835ca9..cfd987ba8 100644 --- a/libc/nexgen32e/strsak32.S +++ b/libc/nexgen32e/strsak32.S @@ -65,14 +65,6 @@ wcsnlen_s: .leafepilogue .endfn wcsnlen_s,globl -// Returns length of NUL-terminated wchar_t string. -// -// @param rdi is non-null NUL-terminated wchar_t string pointer -// @return rax is the number of chars, excluding the NUL -// @asyncsignalsafe -wcslen: or $-1,%rsi -// fallthrough - // Returns length of NUL-terminated memory, with limit. // // @param rdi is non-null memory @@ -176,6 +168,5 @@ wcssak: lea -4(%rdi),%rax .endfn wmemchr,globl .endfn rawwmemchr,globl .endfn wcsnlen,globl - .endfn wcslen,globl .endfn wcschr,globl .endfn wcschrnul,globl diff --git a/libc/sock/htonl.c b/libc/sock/htonl.c new file mode 100644 index 000000000..8b19af151 --- /dev/null +++ b/libc/sock/htonl.c @@ -0,0 +1,27 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or 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 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 "libc/intrin/bswap.h" +#include "libc/sock/sock.h" + +/** + * Converts network to host short. + */ +uint32_t(htonl)(uint32_t x) { + return bswap_32(x); +} diff --git a/libc/sock/htons.c b/libc/sock/htons.c new file mode 100644 index 000000000..654ac5691 --- /dev/null +++ b/libc/sock/htons.c @@ -0,0 +1,27 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or 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 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 "libc/intrin/bswap.h" +#include "libc/sock/sock.h" + +/** + * Converts host to network short. + */ +uint16_t(htons)(uint16_t x) { + return bswap_16(x); +} diff --git a/libc/sock/ntohl.c b/libc/sock/ntohl.c new file mode 100644 index 000000000..c2b223eeb --- /dev/null +++ b/libc/sock/ntohl.c @@ -0,0 +1,27 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or 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 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 "libc/intrin/bswap.h" +#include "libc/sock/sock.h" + +/** + * Converts network to host long. + */ +uint32_t(ntohl)(uint32_t x) { + return bswap_32(x); +} diff --git a/libc/sock/ntohs.c b/libc/sock/ntohs.c new file mode 100644 index 000000000..1bd5141dd --- /dev/null +++ b/libc/sock/ntohs.c @@ -0,0 +1,27 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or 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 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 "libc/intrin/bswap.h" +#include "libc/sock/sock.h" + +/** + * Converts network to host short. + */ +uint16_t(ntohs)(uint16_t x) { + return bswap_16(x); +} diff --git a/libc/sock/shutdown.c b/libc/sock/shutdown.c index 1f35fe3af..89fa9f265 100644 --- a/libc/sock/shutdown.c +++ b/libc/sock/shutdown.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/internal.h" #include "libc/calls/strace.internal.h" +#include "libc/calls/struct/fd.internal.h" #include "libc/dce.h" #include "libc/sock/internal.h" #include "libc/sock/sock.h" diff --git a/libc/sock/sock.h b/libc/sock/sock.h index dcb753ca5..8ffbed55b 100644 --- a/libc/sock/sock.h +++ b/libc/sock/sock.h @@ -1,6 +1,5 @@ #ifndef COSMOPOLITAN_LIBC_SOCK_SOCK_H_ #define COSMOPOLITAN_LIBC_SOCK_SOCK_H_ -#include "libc/intrin/bswap.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ /*───────────────────────────────────────────────────────────────────────────│─╗ @@ -8,13 +7,19 @@ COSMOPOLITAN_C_START_ ╚────────────────────────────────────────────────────────────────────────────│*/ #define INET_ADDRSTRLEN 22 +#define IFHWADDRLEN 6 -#define htons(u16) bswap_16(u16) -#define ntohs(u16) bswap_16(u16) -#define htonl(u32) bswap_32(u32) -#define ntohl(u32) bswap_32(u32) +uint16_t htons(uint16_t); +uint16_t ntohs(uint16_t); +uint32_t htonl(uint32_t); +uint32_t ntohl(uint32_t); -#define IFHWADDRLEN 6 +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) +#define htons(x) __builtin_bswap16(x) +#define ntohs(x) __builtin_bswap16(x) +#define htonl(x) __builtin_bswap32(x) +#define ntohl(x) __builtin_bswap32(x) +#endif const char *inet_ntop(int, const void *, char *, uint32_t); int inet_pton(int, const char *, void *); diff --git a/libc/str/strcpy16.c b/libc/str/strcpy16.c index 0b014ff6d..1b49d332c 100644 --- a/libc/str/strcpy16.c +++ b/libc/str/strcpy16.c @@ -21,12 +21,13 @@ /** * Copies NUL-terminated UCS-2 or UTF-16 string. * - * DEST and SRC must not overlap unless DEST ≤ SRC. + * 𝑑 and 𝑠 must not overlap unless 𝑑 ≤ 𝑠. * - * @param dest is destination memory - * @param src is a NUL-terminated 16-bit string - * @return original dest + * @param d is dination memory + * @param s is a NUL-terminated 16-bit string + * @return original d + * @asyncsignalsafe */ -char16_t *strcpy16(char16_t *dest, const char16_t *src) { - return memcpy(dest, src, (strlen16(src) + 1) * sizeof(char16_t)); +char16_t *strcpy16(char16_t *d, const char16_t *s) { + return memcpy(d, s, (strlen16(s) + 1) * sizeof(char16_t)); } diff --git a/libc/str/strlen16.c b/libc/str/strlen16.c index 6fbd24c89..8a54dc35a 100644 --- a/libc/str/strlen16.c +++ b/libc/str/strlen16.c @@ -31,7 +31,7 @@ typedef char16_t xmm_t __attribute__((__vector_size__(16), __aligned__(16))); */ noasan size_t strlen16(const char16_t *s) { size_t n; - xmm_t v, z = {0}; + xmm_t z = {0}; unsigned m, k = (uintptr_t)s & 15; const xmm_t *p = (const xmm_t *)((uintptr_t)s & -16); if (IsAsan()) __asan_verify(s, 2); diff --git a/libc/str/tprecode16to8.c b/libc/str/tprecode16to8.c index 5d679ae15..397d186a2 100644 --- a/libc/str/tprecode16to8.c +++ b/libc/str/tprecode16to8.c @@ -50,7 +50,7 @@ static noasan axdx_t tprecode16to8_sse2(char *dst, size_t dstsize, * Transcodes UTF-16 to UTF-8. * * This is a low-level function intended for the core runtime. Use - * utf16toutf8() for a much better API that uses malloc(). + * utf16to8() for a much better API that uses malloc(). * * @param dst is output buffer * @param dstsize is bytes in dst diff --git a/libc/str/tprecode8to16.c b/libc/str/tprecode8to16.c index 8f92b318d..4e4aacf74 100644 --- a/libc/str/tprecode8to16.c +++ b/libc/str/tprecode8to16.c @@ -47,7 +47,7 @@ static inline noasan axdx_t tprecode8to16_sse2(char16_t *dst, size_t dstsize, * Transcodes UTF-8 to UTF-16. * * This is a low-level function intended for the core runtime. Use - * utf8toutf16() for a much better API that uses malloc(). + * utf8to16() for a much better API that uses malloc(). * * @param dst is output buffer * @param dstsize is shorts in dst diff --git a/libc/str/wcscpy.c b/libc/str/wcscpy.c index 0cb08d229..a4ac5fdf3 100644 --- a/libc/str/wcscpy.c +++ b/libc/str/wcscpy.c @@ -23,12 +23,11 @@ * * 𝑑 and 𝑠 must not overlap unless 𝑑 ≤ 𝑠. * - * @param 𝑑 is destination memory - * @param 𝑠 is a NUL-terminated string - * @return original dest + * @param d is destination memory + * @param s is a NUL-terminated string + * @return original d * @asyncsignalsafe */ wchar_t *wcscpy(wchar_t *d, const wchar_t *s) { - memcpy(d, s, (wcslen(s) + 1) * sizeof(wchar_t)); - return d; + return memcpy(d, s, (wcslen(s) + 1) * sizeof(wchar_t)); } diff --git a/libc/str/wcslen.c b/libc/str/wcslen.c index 962024704..2d34228de 100644 --- a/libc/str/wcslen.c +++ b/libc/str/wcslen.c @@ -1,7 +1,7 @@ /*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ │vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,27 +16,28 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/dce.h" +#include "libc/intrin/asan.internal.h" #include "libc/str/str.h" +typedef wchar_t xmm_t __attribute__((__vector_size__(16), __aligned__(16))); + /** - * Searches for substring. + * Returns length of NUL-terminated wide string. * - * @param haystack is the search area, as a NUL-terminated string - * @param needle is the desired substring, also NUL-terminated - * @return pointer to first substring within haystack, or NULL + * @param s is non-null NUL-terminated wide string pointer + * @return number of wide characters (excluding NUL) * @asyncsignalsafe - * @see memmem() */ -wchar_t *wcsstr(const wchar_t *haystack, const wchar_t *needle) { - size_t i; - for (;;) { - for (i = 0;;) { - if (!needle[i]) return (/*unconst*/ wchar_t *)haystack; - if (!haystack[i]) break; - if (needle[i] != haystack[i]) break; - ++i; - } - if (!*haystack++) break; - } - return NULL; +noasan size_t wcslen(const wchar_t *s) { + size_t n; + xmm_t z = {0}; + unsigned m, k = (uintptr_t)s & 15; + const xmm_t *p = (const xmm_t *)((uintptr_t)s & -16); + if (IsAsan()) __asan_verify(s, 4); + m = __builtin_ia32_pmovmskb128(*p == z) >> k << k; + while (!m) m = __builtin_ia32_pmovmskb128(*++p == z); + n = (const wchar_t *)p + (__builtin_ctzl(m) >> 2) - s; + if (IsAsan()) __asan_verify(s, n); + return n; } diff --git a/libc/str/wcsncasecmp.c b/libc/str/wcsncasecmp.c index 5ab2e48f1..4272ea1a1 100644 --- a/libc/str/wcsncasecmp.c +++ b/libc/str/wcsncasecmp.c @@ -30,6 +30,6 @@ int wcsncasecmp(const wchar_t *a, const wchar_t *b, size_t n) { size_t i = 0; unsigned x, y; if (!n-- || a == b) return 0; - while ((x = tolower(a[i])) == (y = tolower(b[i])) && b[i] && i < n) ++i; + while ((x = towlower(a[i])) == (y = towlower(b[i])) && b[i] && i < n) ++i; return x - y; } diff --git a/libc/str/wcsstr.c b/libc/str/wcsstr.c new file mode 100644 index 000000000..962024704 --- /dev/null +++ b/libc/str/wcsstr.c @@ -0,0 +1,42 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or 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 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 "libc/str/str.h" + +/** + * Searches for substring. + * + * @param haystack is the search area, as a NUL-terminated string + * @param needle is the desired substring, also NUL-terminated + * @return pointer to first substring within haystack, or NULL + * @asyncsignalsafe + * @see memmem() + */ +wchar_t *wcsstr(const wchar_t *haystack, const wchar_t *needle) { + size_t i; + for (;;) { + for (i = 0;;) { + if (!needle[i]) return (/*unconst*/ wchar_t *)haystack; + if (!haystack[i]) break; + if (needle[i] != haystack[i]) break; + ++i; + } + if (!*haystack++) break; + } + return NULL; +} diff --git a/libc/sysv/calls/bsdthread_create.s b/libc/sysv/calls/bsdthread_create.s index 9462b3df7..a2f275db8 100644 --- a/libc/sysv/calls/bsdthread_create.s +++ b/libc/sysv/calls/bsdthread_create.s @@ -1,2 +1,2 @@ .include "o/libc/sysv/macros.internal.inc" -.scall bsdthread_create,0xfffffffff2168fff,globl +.scall bsdthread_create,0xfffffffff2168fff,globl,hidden diff --git a/libc/sysv/calls/bsdthread_register.s b/libc/sysv/calls/bsdthread_register.s index e1890933f..864aa4dd3 100644 --- a/libc/sysv/calls/bsdthread_register.s +++ b/libc/sysv/calls/bsdthread_register.s @@ -1,2 +1,2 @@ .include "o/libc/sysv/macros.internal.inc" -.scall bsdthread_register,0xfffffffff216efff,globl +.scall bsdthread_register,0xfffffffff216efff,globl,hidden diff --git a/libc/sysv/calls/sys_pledge.s b/libc/sysv/calls/sys_pledge.s index 18fc40da1..f26b30eeb 100644 --- a/libc/sysv/calls/sys_pledge.s +++ b/libc/sysv/calls/sys_pledge.s @@ -1,2 +1,2 @@ .include "o/libc/sysv/macros.internal.inc" -.scall sys_pledge,0xfff06cffffffffff,globl +.scall sys_pledge,0xfff06cffffffffff,globl,hidden diff --git a/libc/sysv/syscalls.sh b/libc/sysv/syscalls.sh index f17c0c224..871182ff0 100755 --- a/libc/sysv/syscalls.sh +++ b/libc/sysv/syscalls.sh @@ -371,8 +371,8 @@ scall pidfd_send_signal 0xfffffffffffff1a8 globl # ├─ linux conferences ban scall io_uring_setup 0xfffffffffffff1a9 globl # └─ gnu founder richard stallman publicly disgraced scall io_uring_enter 0xfffffffffffff1aa globl scall io_uring_register 0xfffffffffffff1ab globl -#────────────────────────RHEL CLOUD────────────────────────── # ←┬─ red hat terminates community release of enterprise linux circa 2020 -scall sys_pledge 0xfff06cffffffffff globl # └─ online linux services ban the president of united states of america +#────────────────────────RHEL CLOUD────────────────────────── # ←──────┬─ red hat terminates community release of enterprise linux circa 2020 +scall sys_pledge 0xfff06cffffffffff globl hidden # └─ online linux services ban the president of united states of america scall msyscall 0xfff025ffffffffff globl scall sys_bogus 0x5005005002500500 globl scall open_tree 0xfffffffffffff1ac globl @@ -478,9 +478,9 @@ scall access_extended 0xfffffffff211cfff globl scall audit_session_join 0xfffffffff21adfff globl scall audit_session_port 0xfffffffff21b0fff globl scall audit_session_self 0xfffffffff21acfff globl -scall bsdthread_create 0xfffffffff2168fff globl +scall bsdthread_create 0xfffffffff2168fff globl hidden scall bsdthread_ctl 0xfffffffff21defff globl -scall bsdthread_register 0xfffffffff216efff globl +scall bsdthread_register 0xfffffffff216efff globl hidden scall bsdthread_terminate 0xfffffffff2169fff globl scall change_fdguard_np 0xfffffffff21bcfff globl scall chmod_extended 0xfffffffff211afff globl diff --git a/libc/testlib/testlib.mk b/libc/testlib/testlib.mk index b4b422893..e80b5c5e0 100644 --- a/libc/testlib/testlib.mk +++ b/libc/testlib/testlib.mk @@ -14,12 +14,14 @@ LIBC_TESTLIB_A_CHECKS = $(LIBC_TESTLIB_A).pkg LIBC_TESTLIB_A_ASSETS = \ libc/testlib/blocktronics.txt \ + libc/testlib/viewables.txt \ libc/testlib/hyperion.txt \ libc/testlib/moby.txt LIBC_TESTLIB_A_HDRS = \ libc/testlib/bench.h \ libc/testlib/blocktronics.h \ + libc/testlib/viewables.h \ libc/testlib/ezbench.h \ libc/testlib/fastrandomstring.h \ libc/testlib/hyperion.h \ @@ -29,6 +31,7 @@ LIBC_TESTLIB_A_HDRS = \ LIBC_TESTLIB_A_SRCS_S = \ libc/testlib/bench.S \ libc/testlib/blocktronics.S \ + libc/testlib/viewables.S \ libc/testlib/combo.S \ libc/testlib/fixture.S \ libc/testlib/hyperion.S \ @@ -126,6 +129,7 @@ $(LIBC_TESTLIB_A).pkg: \ $(foreach x,$(LIBC_TESTLIB_A_DIRECTDEPS),$($(x)_A).pkg) o/$(MODE)/libc/testlib/blocktronics.o: libc/testlib/blocktronics.txt +o/$(MODE)/libc/testlib/viewables.o: libc/testlib/viewables.txt o/$(MODE)/libc/testlib/hyperion.o: libc/testlib/hyperion.txt o/$(MODE)/libc/testlib/moby.o: libc/testlib/moby.txt diff --git a/libc/testlib/viewables.S b/libc/testlib/viewables.S new file mode 100644 index 000000000..4b793452e --- /dev/null +++ b/libc/testlib/viewables.S @@ -0,0 +1,33 @@ +/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ +│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or 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 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 "libc/macros.internal.h" +.rodata + +// Nontrivial NUL-terminated string test vector. + .underrun +kViewables: +0: .incbin "libc/testlib/viewables.txt" +1: .byte 0 + .endobj kViewables,globl + .overrun + + .align 8 +kViewablesSize: + .quad 1b-0b + .endobj kViewablesSize,globl diff --git a/libc/testlib/viewables.h b/libc/testlib/viewables.h new file mode 100644 index 000000000..e127c9b3d --- /dev/null +++ b/libc/testlib/viewables.h @@ -0,0 +1,12 @@ +#ifndef COSMOPOLITAN_LIBC_TESTLIB_VIEWABLES_H_ +#define COSMOPOLITAN_LIBC_TESTLIB_VIEWABLES_H_ +#if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ + +extern size_t kViewablesSize; +extern char kViewables[]; +extern uint8_t kViewablesZip[]; + +COSMOPOLITAN_C_END_ +#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ +#endif /* COSMOPOLITAN_LIBC_TESTLIB_VIEWABLES_H_ */ diff --git a/libc/testlib/viewables.txt b/libc/testlib/viewables.txt new file mode 100644 index 000000000..ddb7e9765 --- /dev/null +++ b/libc/testlib/viewables.txt @@ -0,0 +1,924 @@ +VIEWABLE UNICODE CHARACTERS +According To PragmataPro + +Basic Latin +═══════════════════════════════════════════════════════ +0000 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +0020 │ ! " # $ % & ' ( ) * + , - . / +0030 │ 0 1 2 3 4 5 6 7 8 9 : ; < = > ? +0040 │ @ A B C D E F G H I J K L M N O +0050 │ P Q R S T U V W X Y Z [ \ ] ^ _ +0060 │ ` a b c d e f g h i j k l m n o +0070 │ p q r s t u v w x y z { | } ~ + +Latin-1 Supplement +═══════════════════════════════════════════════════════ +0080 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +00a0 │ ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ +00b0 │ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ +00c0 │ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï +00d0 │ Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß +00e0 │ à á â ã ä å æ ç è é ê ë ì í î ï +00f0 │ ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ + +Latin Extended-A +═══════════════════════════════════════════════════════ +0100 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +0100 │ Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď +0110 │ Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ +0120 │ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į +0130 │ İ ı IJ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ +0140 │ ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ō ō Ŏ ŏ +0150 │ Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş +0160 │ Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů +0170 │ Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ + +Latin Extended-B +═══════════════════════════════════════════════════════ +0180 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +0180 │ ƀ Ɓ Ƃ ƃ Ƅ ƅ Ɔ Ƈ ƈ Ɖ Ɗ Ƌ ƌ ƍ Ǝ Ə +0190 │ Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ ƙ ƚ ƛ Ɯ Ɲ ƞ Ɵ +01a0 │ Ơ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư +01b0 │ ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ +01c0 │ ǀ ǁ ǂ ǃ DŽ Dž dž LJ Lj lj NJ Nj nj Ǎ ǎ Ǐ +01d0 │ ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ +01e0 │ Ǡ ǡ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ +01f0 │ ǰ DZ Dz dz Ǵ ǵ Ƕ Ƿ Ǹ ǹ Ǻ ǻ Ǽ ǽ Ǿ ǿ +0200 │ Ȁ ȁ Ȃ ȃ Ȅ ȅ Ȇ ȇ Ȉ ȉ Ȋ ȋ Ȍ ȍ Ȏ ȏ +0210 │ Ȑ ȑ Ȓ ȓ Ȕ ȕ Ȗ ȗ Ș ș Ț ț Ȝ ȝ Ȟ ȟ +0220 │ Ƞ ȡ Ȣ ȣ Ȥ ȥ Ȧ ȧ Ȩ ȩ Ȫ ȫ Ȭ ȭ Ȯ ȯ +0230 │ Ȱ ȱ Ȳ ȳ ȴ ȵ ȶ ȷ ȸ ȹ Ⱥ Ȼ ȼ Ƚ Ⱦ ȿ +0240 │ ɀ Ɂ ɂ Ƀ Ʉ Ʌ Ɇ ɇ Ɉ ɉ Ɋ ɋ Ɍ ɍ Ɏ ɏ + +IPA Extensions +═══════════════════════════════════════════════════════ +0250 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +0250 │ ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɗ ɘ ə ɚ ɛ ɜ ɝ ɞ ɟ +0260 │ ɠ ɡ ɢ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ +0270 │ ɰ ɱ ɲ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ +0280 │ ʀ ʁ ʂ ʃ ʄ ʅ ʆ ʇ ʈ ʉ ʊ ʋ ʌ ʍ ʎ ʏ +0290 │ ʐ ʑ ʒ ʓ ʔ ʕ ʖ ʗ ʘ ʙ ʚ ʛ ʜ ʝ ʞ ʟ +02a0 │ ʠ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ ʩ ʪ ʫ ʬ ʭ ʮ ʯ + +Spacing Modifier Letters +═══════════════════════════════════════════════════════ +02b0 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +02b0 │ ʰ ʱ ʲ ʳ ʴ ʵ ʶ ʷ ʸ ʹ ʺ ʻ ʼ ʽ ʾ ʿ +02c0 │ ˀ ˁ ˂ ˃ ˄ ˅ ˆ ˇ ˈ ˉ ˊ ˋ ˌ ˍ ˎ ˏ +02d0 │ ː ˑ ˒ ˓ ˔ ˕ ˖ ˗ ˘ ˙ ˚ ˛ ˜ ˝ ˞ ˟ +02e0 │ ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩ ˪ ˫ ˬ ˭ ˮ ˯ +02f0 │ ˰ ˱ ˲ ˳ ˴ ˵ ˶ ˷ ˸ ˹ ˺ ˻ ˼ ˽ ˾ ˿ + +Greek and Coptic +═══════════════════════════════════════════════════════ +0370 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +0370 │ ; +0380 │ ΄ ΅ Ά · Έ Ή Ί Ό Ύ Ώ +0390 │ ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο +03a0 │ Π Ρ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί +03b0 │ ΰ α β γ δ ε ζ η θ ι κ λ μ ν ξ ο +03c0 │ π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ +03d0 │ ϐ ϑ ϕ ϖ Ϝ ϝ +03f0 │ ϰ ϱ ϴ ϵ + +Cyrillic +═══════════════════════════════════════════════════════ +0400 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +0400 │ Ѐ Ё Ђ Ѓ Є Ѕ І Ї Ј Љ Њ Ћ Ќ Ѝ Ў Џ +0410 │ А Б В Г Д Е Ж З И Й К Л М Н О П +0420 │ Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я +0430 │ а б в г д е ж з и й к л м н о п +0440 │ р с т у ф х ц ч ш щ ъ ы ь э ю я +0450 │ ѐ ё ђ ѓ є ѕ і ї ј љ њ ћ ќ ѝ ў џ +0460 │ Ѡ ѡ Ѣ ѣ Ѥ ѥ +0470 │ Ѳ ѳ +0490 │ Ґ ґ Ҙ ҙ Қ қ + +Runic +═══════════════════════════════════════════════════════ +16a0 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +16a0 │ ᚠ ᚡ ᚢ ᚣ ᚤ ᚥ ᚦ ᚧ ᚨ ᚩ ᚪ ᚫ ᚬ ᚭ ᚮ ᚯ +16b0 │ ᚰ ᚱ ᚲ ᚳ ᚴ ᚵ ᚶ ᚷ ᚸ ᚹ ᚺ ᚻ ᚼ ᚽ ᚾ ᚿ +16c0 │ ᛀ ᛁ ᛂ ᛃ ᛄ ᛅ ᛆ ᛇ ᛈ ᛉ ᛊ ᛋ ᛌ ᛍ ᛎ ᛏ +16d0 │ ᛐ ᛑ ᛒ ᛓ ᛔ ᛕ ᛖ ᛗ ᛘ ᛙ ᛚ ᛛ ᛜ ᛝ ᛞ ᛟ +16e0 │ ᛠ ᛡ ᛢ ᛣ ᛤ ᛥ ᛦ ᛧ ᛨ ᛩ ᛪ ᛫ ᛬ ᛭ ᛮ ᛯ +16f0 │ ᛰ + +Phonetic Extensions +═══════════════════════════════════════════════════════ +1d00 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1d00 │ ᴀ ᴁ ᴂ ᴃ ᴄ ᴅ ᴆ ᴇ ᴈ ᴉ ᴊ ᴋ ᴌ ᴍ ᴎ ᴏ +1d10 │ ᴐ ᴑ ᴒ ᴓ ᴔ ᴕ ᴖ ᴗ ᴘ ᴙ ᴚ ᴛ ᴜ ᴝ ᴞ ᴟ +1d20 │ ᴠ ᴡ ᴢ ᴣ ᴤ ᴥ ᴦ ᴧ ᴨ ᴩ ᴪ ᴫ ᴬ ᴭ ᴮ ᴯ +1d30 │ ᴰ ᴱ ᴲ ᴳ ᴴ ᴵ ᴶ ᴷ ᴸ ᴹ ᴺ ᴻ ᴼ ᴽ ᴾ ᴿ +1d40 │ ᵀ ᵁ ᵂ ᵃ ᵄ ᵅ ᵆ ᵇ ᵈ ᵉ ᵊ ᵋ ᵌ ᵍ ᵎ ᵏ +1d50 │ ᵐ ᵑ ᵒ ᵓ ᵔ ᵕ ᵖ ᵗ ᵘ ᵙ ᵚ ᵛ ᵜ ᵝ ᵞ ᵟ +1d60 │ ᵠ ᵡ ᵢ ᵣ ᵤ ᵥ ᵦ ᵧ ᵨ ᵩ ᵪ ᵫ ᵬ ᵭ ᵮ ᵯ +1d70 │ ᵰ ᵱ ᵲ ᵳ ᵴ ᵵ ᵶ ᵷ ᵸ ᵹ ᵺ ᵻ ᵼ ᵽ ᵾ ᵿ + +Phonetic Extensions Supplement +═══════════════════════════════════════════════════════ +1d80 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1d90 │ ᶜ +1da0 │ ᶠ ᶥ +1db0 │ ᶷ ᶻ ᶿ + +Latin Extended Additional +═══════════════════════════════════════════════════════ +1e00 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1e00 │ Ḁ ḁ Ḃ ḃ Ḅ ḅ Ḇ ḇ Ḉ ḉ Ḋ ḋ Ḍ ḍ Ḏ ḏ +1e10 │ Ḑ ḑ Ḓ ḓ Ḕ ḕ Ḗ ḗ Ḙ ḙ Ḛ ḛ Ḝ ḝ Ḟ ḟ +1e20 │ Ḡ ḡ Ḣ ḣ Ḥ ḥ Ḧ ḧ Ḩ ḩ Ḫ ḫ Ḭ ḭ Ḯ ḯ +1e30 │ Ḱ ḱ Ḳ ḳ Ḵ ḵ Ḷ ḷ Ḹ ḹ Ḻ ḻ Ḽ ḽ Ḿ ḿ +1e40 │ Ṁ ṁ Ṃ ṃ Ṅ ṅ Ṇ ṇ Ṉ ṉ Ṋ ṋ Ṍ ṍ Ṏ ṏ +1e50 │ Ṑ ṑ Ṓ ṓ Ṕ ṕ Ṗ ṗ Ṙ ṙ Ṛ ṛ Ṝ ṝ Ṟ ṟ +1e60 │ Ṡ ṡ Ṣ ṣ Ṥ ṥ Ṧ ṧ Ṩ ṩ Ṫ ṫ Ṭ ṭ Ṯ ṯ +1e70 │ Ṱ ṱ Ṳ ṳ Ṵ ṵ Ṷ ṷ Ṹ ṹ Ṻ ṻ Ṽ ṽ Ṿ ṿ +1e80 │ Ẁ ẁ Ẃ ẃ Ẅ ẅ Ẇ ẇ Ẉ ẉ Ẋ ẋ Ẍ ẍ Ẏ ẏ +1e90 │ Ẑ ẑ Ẓ ẓ Ẕ ẕ ẖ ẗ ẘ ẙ ẚ ẛ ẜ ẝ ẞ ẟ +1ea0 │ Ạ ạ Ả ả Ấ ấ Ầ ầ Ẩ ẩ Ẫ ẫ Ậ ậ Ắ ắ +1eb0 │ Ằ ằ Ẳ ẳ Ẵ ẵ Ặ ặ Ẹ ẹ Ẻ ẻ Ẽ ẽ Ế ế +1ec0 │ Ề ề Ể ể Ễ ễ Ệ ệ Ỉ ỉ Ị ị Ọ ọ Ỏ ỏ +1ed0 │ Ố ố Ồ ồ Ổ ổ Ỗ ỗ Ộ ộ Ớ ớ Ờ ờ Ở ở +1ee0 │ Ỡ ỡ Ợ ợ Ụ ụ Ủ ủ Ứ ứ Ừ ừ Ử ử Ữ ữ +1ef0 │ Ự ự Ỳ ỳ Ỵ ỵ Ỷ ỷ Ỹ ỹ Ỻ ỻ Ỽ ỽ Ỿ ỿ + +Greek Extended +═══════════════════════════════════════════════════════ +1f00 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1f00 │ ἀ ἁ ἂ ἃ ἄ ἅ ἆ ἇ Ἀ Ἁ Ἂ Ἃ Ἄ Ἅ Ἆ Ἇ +1f10 │ ἐ ἑ ἒ ἓ ἔ ἕ Ἐ Ἑ Ἒ Ἓ Ἔ Ἕ +1f20 │ ἠ ἡ ἢ ἣ ἤ ἥ ἦ ἧ Ἠ Ἡ Ἢ Ἣ Ἤ Ἥ Ἦ Ἧ +1f30 │ ἰ ἱ ἲ ἳ ἴ ἵ ἶ ἷ Ἰ Ἱ Ἲ Ἳ Ἴ Ἵ Ἶ Ἷ +1f40 │ ὀ ὁ ὂ ὃ ὄ ὅ Ὀ Ὁ Ὂ Ὃ Ὄ Ὅ +1f50 │ ὐ ὑ ὒ ὓ ὔ ὕ ὖ ὗ Ὑ Ὓ Ὕ Ὗ +1f60 │ ὠ ὡ ὢ ὣ ὤ ὥ ὦ ὧ Ὠ Ὡ Ὢ Ὣ Ὤ Ὥ Ὦ Ὧ +1f70 │ ὰ ά ὲ έ ὴ ή ὶ ί ὸ ό ὺ ύ ὼ ώ +1f80 │ ᾀ ᾁ ᾂ ᾃ ᾄ ᾅ ᾆ ᾇ ᾈ ᾉ ᾊ ᾋ ᾌ ᾍ ᾎ ᾏ +1f90 │ ᾐ ᾑ ᾒ ᾓ ᾔ ᾕ ᾖ ᾗ ᾘ ᾙ ᾚ ᾛ ᾜ ᾝ ᾞ ᾟ +1fa0 │ ᾠ ᾡ ᾢ ᾣ ᾤ ᾥ ᾦ ᾧ ᾨ ᾩ ᾪ ᾫ ᾬ ᾭ ᾮ ᾯ +1fb0 │ ᾰ ᾱ ᾲ ᾳ ᾴ ᾶ ᾷ Ᾰ Ᾱ Ὰ Ά ᾼ +1fc0 │ ῁ ῂ ῃ ῄ ῆ ῇ Ὲ Έ Ὴ Ή ῌ ῍ ῎ ῏ +1fd0 │ ῐ ῑ ῒ ΐ ῖ ῗ Ῐ Ῑ Ὶ Ί ῝ ῞ ῟ +1fe0 │ ῠ ῡ ῢ ΰ ῤ ῥ ῦ ῧ Ῠ Ῡ Ὺ Ύ Ῥ ῭ ΅ ` +1ff0 │ ῲ ῳ ῴ ῶ ῷ Ὸ Ό Ὼ Ώ ῼ ´ + +General Punctuation +═══════════════════════════════════════════════════════ +2000 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2010 │ ‐ ‑ ‒ – — ― ‖ ‗ ‘ ’ ‚ ‛ “ ” „ ‟ +2020 │ † ‡ • ‣ ․ ‥ … ‧ +2030 │ ‰ ‱ ′ ″ ‴ ‵ ‶ ‷ ‸ ‹ › ※ ‼ ‽ ‾ ‿ +2040 │ ⁀ ⁁ ⁂ ⁃ ⁄ ⁅ ⁆ ⁇ ⁈ ⁉ ⁊ ⁋ ⁌ ⁍ ⁎ ⁏ +2050 │ ⁐ ⁑ ⁒ ⁓ ⁔ ⁕ ⁖ ⁗ ⁘ ⁙ ⁚ ⁛ ⁜ ⁝ ⁞ + +Superscripts and Subscripts +═══════════════════════════════════════════════════════ +2070 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2070 │ ⁰ ⁱ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ +2080 │ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎ +2090 │ ₐ ₑ ₒ ₓ ₔ ₕ ₖ ₗ ₘ ₙ ₚ ₛ ₜ + +Currency Symbols +═══════════════════════════════════════════════════════ +20a0 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +20a0 │ ₣ ₤ ₩ ₪ € +20b0 │ ₱ ₲ ₳ ₵ ₹ ₺ ₽ ₿ + +Letterlike Symbols +═══════════════════════════════════════════════════════ +2100 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2100 │ ℀ ℁ ℂ ℃ ℄ ℅ ℆ ℇ ℈ ℉ ℊ ℋ ℌ ℍ ℎ ℏ +2110 │ ℐ ℑ ℒ ℓ ℔ ℕ № ℗ ℘ ℙ ℚ ℛ ℜ ℝ ℞ ℟ +2120 │ ℠ ℡ ™ ℣ ℤ ℥ Ω ℧ ℨ ℩ K Å ℬ ℭ ℮ ℯ +2130 │ ℰ ℱ Ⅎ ℳ ℴ ℵ ℶ ℷ ℸ ℹ ℺ ℻ ℼ ℽ ℾ ℿ +2140 │ ⅀ ⅁ ⅂ ⅃ ⅄ ⅅ ⅆ ⅇ ⅈ ⅉ ⅊ ⅋ ⅌ ⅍ ⅎ ⅏ + +Number Forms +═══════════════════════════════════════════════════════ +2150 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2150 │ ⅐ ⅑ ⅒ ⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ ⅟ +2160 │ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ +2170 │ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ +2180 │ ↀ ↁ ↂ Ↄ ↄ ↅ ↆ ↇ ↈ ↉ ↊ ↋ + +Arrows +═══════════════════════════════════════════════════════ +2190 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2190 │ ← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↚ ↛ ↜ ↝ ↞ ↟ +21a0 │ ↠ ↡ ↢ ↣ ↤ ↥ ↦ ↧ ↨ ↩ ↪ ↫ ↬ ↭ ↮ ↯ +21b0 │ ↰ ↱ ↲ ↳ ↴ ↵ ↶ ↷ ↸ ↹ ↺ ↻ ↼ ↽ ↾ ↿ +21c0 │ ⇀ ⇁ ⇂ ⇃ ⇄ ⇅ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌ ⇍ ⇎ ⇏ +21d0 │ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇖ ⇗ ⇘ ⇙ ⇚ ⇛ ⇜ ⇝ ⇞ ⇟ +21e0 │ ⇠ ⇡ ⇢ ⇣ ⇤ ⇥ ⇦ ⇧ ⇨ ⇩ ⇪ ⇫ ⇬ ⇭ ⇮ ⇯ +21f0 │ ⇰ ⇱ ⇲ ⇳ ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ ⇻ ⇼ ⇽ ⇾ ⇿ + +Mathematical Operators +═══════════════════════════════════════════════════════ +2200 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2200 │ ∀ ∁ ∂ ∃ ∄ ∅ ∆ ∇ ∈ ∉ ∊ ∋ ∌ ∍ ∎ ∏ +2210 │ ∐ ∑ − ∓ ∔ ∕ ∖ ∗ ∘ ∙ √ ∛ ∜ ∝ ∞ ∟ +2220 │ ∠ ∡ ∢ ∣ ∤ ∥ ∦ ∧ ∨ ∩ ∪ ∫ ∬ ∭ ∮ ∯ +2230 │ ∰ ∱ ∲ ∳ ∴ ∵ ∶ ∷ ∸ ∹ ∺ ∻ ∼ ∽ ∾ ∿ +2240 │ ≀ ≁ ≂ ≃ ≄ ≅ ≆ ≇ ≈ ≉ ≊ ≋ ≌ ≍ ≎ ≏ +2250 │ ≐ ≑ ≒ ≓ ≔ ≕ ≖ ≗ ≘ ≙ ≚ ≛ ≜ ≝ ≞ ≟ +2260 │ ≠ ≡ ≢ ≣ ≤ ≥ ≦ ≧ ≨ ≩ ≪ ≫ ≬ ≭ ≮ ≯ +2270 │ ≰ ≱ ≲ ≳ ≴ ≵ ≶ ≷ ≸ ≹ ≺ ≻ ≼ ≽ ≾ ≿ +2280 │ ⊀ ⊁ ⊂ ⊃ ⊄ ⊅ ⊆ ⊇ ⊈ ⊉ ⊊ ⊋ ⊌ ⊍ ⊎ ⊏ +2290 │ ⊐ ⊑ ⊒ ⊓ ⊔ ⊕ ⊖ ⊗ ⊘ ⊙ ⊚ ⊛ ⊜ ⊝ ⊞ ⊟ +22a0 │ ⊠ ⊡ ⊢ ⊣ ⊤ ⊥ ⊦ ⊧ ⊨ ⊩ ⊪ ⊫ ⊬ ⊭ ⊮ ⊯ +22b0 │ ⊰ ⊱ ⊲ ⊳ ⊴ ⊵ ⊶ ⊷ ⊸ ⊹ ⊺ ⊻ ⊼ ⊽ ⊾ ⊿ +22c0 │ ⋀ ⋁ ⋂ ⋃ ⋄ ⋅ ⋆ ⋇ ⋈ ⋉ ⋊ ⋋ ⋌ ⋍ ⋎ ⋏ +22d0 │ ⋐ ⋑ ⋒ ⋓ ⋔ ⋕ ⋖ ⋗ ⋘ ⋙ ⋚ ⋛ ⋜ ⋝ ⋞ ⋟ +22e0 │ ⋠ ⋡ ⋢ ⋣ ⋤ ⋥ ⋦ ⋧ ⋨ ⋩ ⋪ ⋫ ⋬ ⋭ ⋮ ⋯ +22f0 │ ⋰ ⋱ ⋲ ⋳ ⋴ ⋵ ⋶ ⋷ ⋸ ⋹ ⋺ ⋻ ⋼ ⋽ ⋾ ⋿ + +Miscellaneous Technical +═══════════════════════════════════════════════════════ +2300 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2300 │ ⌀ ⌁ ⌂ ⌃ ⌄ ⌅ ⌆ ⌇ ⌈ ⌉ ⌊ ⌋ ⌌ ⌍ ⌎ ⌏ +2310 │ ⌐ ⌑ ⌒ ⌓ ⌔ ⌕ ⌖ ⌗ ⌘ ⌙ ⌚ ⌛ ⌜ ⌝ ⌞ ⌟ +2320 │ ⌠ ⌡ ⌢ ⌣ ⌤ ⌥ ⌦ ⌧ ⌨ 〈 〉 ⌫ ⌬ +2330 │ ⌴ ⌶ ⌷ ⌸ ⌹ ⌺ ⌻ ⌼ ⌽ ⌾ ⌿ +2340 │ ⍀ ⍁ ⍂ ⍃ ⍄ ⍅ ⍆ ⍇ ⍈ ⍉ ⍊ ⍋ ⍌ ⍍ ⍎ ⍏ +2350 │ ⍐ ⍑ ⍒ ⍓ ⍔ ⍕ ⍖ ⍗ ⍘ ⍙ ⍚ ⍛ ⍜ ⍝ ⍞ ⍟ +2360 │ ⍠ ⍡ ⍢ ⍣ ⍤ ⍥ ⍦ ⍧ ⍨ ⍩ ⍪ ⍫ ⍬ ⍭ ⍮ ⍯ +2370 │ ⍱ ⍲ ⍳ ⍴ ⍵ ⍶ ⍷ ⍸ ⍹ ⍺ ⍽ +2380 │ ⎀ ⎁ ⎂ ⎃ ⎄ ⎅ ⎆ ⎇ ⎈ ⎉ ⎊ ⎋ ⎌ ⎍ ⎎ ⎏ +2390 │ ⎐ ⎑ ⎒ ⎓ ⎔ ⎕ ⎖ ⎗ ⎘ ⎙ ⎚ ⎛ ⎜ ⎝ ⎞ ⎟ +23a0 │ ⎠ ⎡ ⎢ ⎣ ⎤ ⎥ ⎦ ⎧ ⎨ ⎩ ⎪ ⎫ ⎬ ⎭ ⎮ ⎯ +23b0 │ ⎰ ⎱ ⎲ ⎳ ⎴ ⎵ ⎶ ⎷ ⎸ ⎹ ⎺ ⎻ ⎼ ⎽ +23c0 │ ⏏ +23d0 │ ⏐ ⏜ ⏝ ⏞ ⏟ +23e0 │ ⏠ ⏡ ⏩ ⏪ ⏫ ⏬ ⏭ ⏮ ⏯ +23f0 │ ⏰ ⏱ ⏲ ⏳ ⏸ ⏹ ⏺ ⏻ ⏼ ⏽ ⏾ + +Control Pictures +═══════════════════════════════════════════════════════ +2400 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2400 │ ␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ +2410 │ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ +2420 │ ␠ ␡ ␢ ␣ ␤ ␥ ␦ + +Enclosed Alphanumerics +═══════════════════════════════════════════════════════ +2460 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2460 │ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ +2470 │ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ +2480 │ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ +24b0 │ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ +24c0 │ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ +24d0 │ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ +24e0 │ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ + +Box Drawing +═══════════════════════════════════════════════════════ +2500 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2500 │ ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ +2510 │ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ +2520 │ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ +2530 │ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ +2540 │ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏ +2550 │ ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟ +2560 │ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ +2570 │ ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿ + +Block Elements +═══════════════════════════════════════════════════════ +2580 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2580 │ ▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ +2590 │ ▐ ░ ▒ ▓ ▔ ▕ ▖ ▗ ▘ ▙ ▚ ▛ ▜ ▝ ▞ ▟ + +Geometric Shapes +═══════════════════════════════════════════════════════ +25a0 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +25a0 │ ■ □ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ▪ ▫ ▬ ▭ ▮ ▯ +25b0 │ ▰ ▱ ▲ △ ▴ ▵ ▶ ▷ ▸ ▹ ► ▻ ▼ ▽ ▾ ▿ +25c0 │ ◀ ◁ ◂ ◃ ◄ ◅ ◆ ◇ ◈ ◉ ◊ ○ ◌ ◍ ◎ ● +25d0 │ ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗ ◘ ◙ ◚ ◛ ◜ ◝ ◞ ◟ +25e0 │ ◠ ◡ ◢ ◣ ◤ ◥ ◦ ◧ ◨ ◩ ◪ ◫ ◬ ◭ ◮ ◯ +25f0 │ ◰ ◱ ◲ ◳ ◴ ◵ ◶ ◷ ◸ ◹ ◺ ◻ ◼ ◽ ◾ ◿ + +Miscellaneous Symbols +═══════════════════════════════════════════════════════ +2600 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2600 │ ☀ ☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏ +2610 │ ☐ ☑ ☒ ☓ ☔ ☕ ☖ ☗ ☘ ☚ ☛ ☜ ☝ ☞ ☟ +2620 │ ☠ ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☭ ☮ ☯ +2630 │ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☹ ☺ ☻ ☼ ☽ ☾ ☿ +2640 │ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ +2650 │ ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟ +2660 │ ♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♩ ♪ ♫ ♬ ♭ ♮ ♯ +2670 │ ♳ ♴ ♵ ♶ ♷ ♸ ♹ ♺ +2680 │ ⚀ ⚁ ⚂ ⚃ ⚄ ⚅ ⚆ ⚇ ⚈ ⚉ ⚊ ⚋ ⚌ ⚍ ⚎ ⚏ +2690 │ ⚐ ⚑ ⚒ ⚙ +26a0 │ ⚠ ⚡ ⚢ ⚣ ⚤ ⚥ ⚦ ⚧ ⚨ ⚪ ⚫ ⚬ ⚭ ⚮ ⚯ +26b0 │ ⚰ ⚱ ⚲ ⚳ ⚴ ⚵ ⚶ ⚷ ⚸ ⚹ ⚺ ⚻ ⚼ ⚽ +26d0 │ ⛔ + +Dingbats +═══════════════════════════════════════════════════════ +2700 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2700 │ ✁ ✂ ✃ ✈ +2710 │ ✓ ✔ ✘ ✚ +2720 │ ✭ +2740 │ ❌ +2750 │ ❘ ❙ ❚ +2760 │ ❨ ❩ ❪ ❫ ❬ ❭ ❮ ❯ +2770 │ ❰ ❱ ❲ ❳ ❴ ❵ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ +2780 │ ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ➍ ➎ ➏ +2790 │ ➐ ➑ ➒ ➓ ➔ ➕ ➖ ➗ ➘ ➙ ➚ ➛ ➜ ➝ ➞ ➟ +27a0 │ ➠ ➡ ➢ ➣ ➤ ➥ ➦ ➧ ➨ ➩ ➪ ➫ ➬ ➭ ➮ ➯ +27b0 │ ➰ ➱ ➲ ➳ ➴ ➵ ➶ ➷ ➸ ➹ ➺ ➻ ➼ ➽ ➾ ➿ + +Miscellaneous Mathematical Symbols-A +═══════════════════════════════════════════════════════ +27c0 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +27c0 │ ⟀ ⟁ ⟂ ⟃ ⟄ ⟅ ⟆ ⟇ ⟈ ⟉ ⟊ ⟌ +27d0 │ ⟐ ⟑ ⟒ ⟓ ⟔ ⟕ ⟖ ⟗ ⟘ ⟙ ⟚ ⟛ ⟜ ⟝ ⟞ ⟟ +27e0 │ ⟠ ⟡ ⟢ ⟣ ⟤ ⟥ ⟦ ⟧ ⟨ ⟩ ⟪ ⟫ ⟬ ⟭ ⟮ ⟯ + +Supplemental Arrows-A +═══════════════════════════════════════════════════════ +27f0 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +27f0 │ ⟰ ⟱ ⟲ ⟳ ⟴ ⟵ ⟶ ⟷ ⟸ ⟹ ⟺ ⟻ ⟼ ⟽ ⟾ ⟿ + +Braille Patterns +═══════════════════════════════════════════════════════ +2800 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2800 │ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ +2810 │ ⠐ ⠑ ⠒ ⠓ ⠔ ⠕ ⠖ ⠗ ⠘ ⠙ ⠚ ⠛ ⠜ ⠝ ⠞ ⠟ +2820 │ ⠠ ⠡ ⠢ ⠣ ⠤ ⠥ ⠦ ⠧ ⠨ ⠩ ⠪ ⠫ ⠬ ⠭ ⠮ ⠯ +2830 │ ⠰ ⠱ ⠲ ⠳ ⠴ ⠵ ⠶ ⠷ ⠸ ⠹ ⠺ ⠻ ⠼ ⠽ ⠾ ⠿ +2840 │ ⡀ ⡁ ⡂ ⡃ ⡄ ⡅ ⡆ ⡇ ⡈ ⡉ ⡊ ⡋ ⡌ ⡍ ⡎ ⡏ +2850 │ ⡐ ⡑ ⡒ ⡓ ⡔ ⡕ ⡖ ⡗ ⡘ ⡙ ⡚ ⡛ ⡜ ⡝ ⡞ ⡟ +2860 │ ⡠ ⡡ ⡢ ⡣ ⡤ ⡥ ⡦ ⡧ ⡨ ⡩ ⡪ ⡫ ⡬ ⡭ ⡮ ⡯ +2870 │ ⡰ ⡱ ⡲ ⡳ ⡴ ⡵ ⡶ ⡷ ⡸ ⡹ ⡺ ⡻ ⡼ ⡽ ⡾ ⡿ +2880 │ ⢀ ⢁ ⢂ ⢃ ⢄ ⢅ ⢆ ⢇ ⢈ ⢉ ⢊ ⢋ ⢌ ⢍ ⢎ ⢏ +2890 │ ⢐ ⢑ ⢒ ⢓ ⢔ ⢕ ⢖ ⢗ ⢘ ⢙ ⢚ ⢛ ⢜ ⢝ ⢞ ⢟ +28a0 │ ⢠ ⢡ ⢢ ⢣ ⢤ ⢥ ⢦ ⢧ ⢨ ⢩ ⢪ ⢫ ⢬ ⢭ ⢮ ⢯ +28b0 │ ⢰ ⢱ ⢲ ⢳ ⢴ ⢵ ⢶ ⢷ ⢸ ⢹ ⢺ ⢻ ⢼ ⢽ ⢾ ⢿ +28c0 │ ⣀ ⣁ ⣂ ⣃ ⣄ ⣅ ⣆ ⣇ ⣈ ⣉ ⣊ ⣋ ⣌ ⣍ ⣎ ⣏ +28d0 │ ⣐ ⣑ ⣒ ⣓ ⣔ ⣕ ⣖ ⣗ ⣘ ⣙ ⣚ ⣛ ⣜ ⣝ ⣞ ⣟ +28e0 │ ⣠ ⣡ ⣢ ⣣ ⣤ ⣥ ⣦ ⣧ ⣨ ⣩ ⣪ ⣫ ⣬ ⣭ ⣮ ⣯ +28f0 │ ⣰ ⣱ ⣲ ⣳ ⣴ ⣵ ⣶ ⣷ ⣸ ⣹ ⣺ ⣻ ⣼ ⣽ ⣾ ⣿ + +Supplemental Arrows-B +═══════════════════════════════════════════════════════ +2900 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2900 │ ⤆ ⤇ ⤈ ⤉ ⤊ ⤋ +2910 │ ⤒ ⤓ ⤙ ⤚ ⤛ ⤜ +2930 │ ⤸ +2940 │ ⥀ ⥁ ⥂ ⥃ ⥄ ⥅ ⥆ ⥉ ⥊ ⥋ ⥌ ⥍ ⥎ ⥏ +2950 │ ⥐ ⥑ ⥒ ⥓ ⥔ ⥕ ⥖ ⥗ ⥘ ⥙ ⥚ ⥛ ⥜ ⥝ ⥞ ⥟ +2960 │ ⥠ ⥡ ⥢ ⥣ ⥤ ⥥ ⥦ ⥧ ⥨ ⥩ ⥪ ⥫ ⥬ ⥭ ⥮ ⥯ +2970 │ ⥰ ⥱ ⥲ ⥳ ⥴ ⥵ ⥶ ⥷ ⥸ ⥹ ⥺ ⥻ ⥼ ⥽ ⥾ ⥿ + +Miscellaneous Mathematical Symbols-B +═══════════════════════════════════════════════════════ +2980 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2980 │ ⦀ ⦁ ⦂ ⦃ ⦄ ⦅ ⦆ ⦇ ⦈ ⦉ ⦊ ⦋ ⦌ ⦍ ⦎ ⦏ +2990 │ ⦐ ⦑ ⦒ ⦓ ⦔ ⦗ ⦘ ⦙ ⦚ ⦜ +29b0 │ ⦻ ⦼ ⦽ ⦾ ⦿ +29c0 │ ⧊ ⧋ ⧎ ⧏ +29d0 │ ⧐ ⧑ ⧒ ⧓ ⧔ ⧕ ⧖ ⧗ ⧘ ⧙ ⧚ ⧛ ⧜ ⧞ +29e0 │ ⧣ ⧤ ⧥ ⧦ ⧧ ⧨ ⧩ ⧪ ⧫ ⧬ ⧭ ⧮ ⧯ +29f0 │ ⧰ ⧱ ⧲ ⧳ ⧴ ⧵ ⧶ ⧷ ⧸ ⧹ ⧺ ⧻ ⧼ ⧽ ⧾ ⧿ + +Supplemental Mathematical Operators +═══════════════════════════════════════════════════════ +2a00 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2a00 │ ⨀ ⨁ ⨂ ⨍ ⨎ ⨏ +2a10 │ ⨐ ⨑ ⨒ ⨓ ⨔ ⨕ ⨖ ⨗ ⨘ ⨙ ⨚ ⨛ ⨜ ⨟ +2a20 │ ⨡ ⨢ ⨣ ⨤ ⨥ ⨦ ⨧ ⨨ ⨩ ⨪ ⨫ ⨬ ⨭ ⨮ ⨯ +2a30 │ ⨰ ⨱ ⨲ ⨳ ⨴ ⨵ ⨼ ⨽ ⨾ ⨿ +2a40 │ ⩀ ⩁ ⩂ ⩃ ⩄ ⩅ ⩆ ⩇ ⩈ ⩉ ⩌ ⩍ ⩎ ⩏ +2a50 │ ⩑ ⩒ ⩓ ⩔ ⩕ ⩖ ⩗ ⩘ ⩙ ⩚ ⩛ ⩜ ⩝ ⩞ ⩟ +2a60 │ ⩠ ⩡ ⩢ ⩣ ⩤ ⩥ ⩦ ⩧ ⩨ ⩩ ⩪ ⩫ ⩬ ⩭ ⩮ ⩯ +2a70 │ ⩰ ⩱ ⩲ ⩳ ⩷ ⩹ ⩺ ⩻ ⩼ ⩽ ⩾ ⩿ +2a80 │ ⪀ ⪁ ⪂ ⪃ ⪄ ⪅ ⪆ ⪇ ⪈ ⪉ ⪊ ⪋ ⪌ ⪍ ⪎ ⪏ +2a90 │ ⪐ ⪑ ⪒ ⪓ ⪔ ⪕ ⪖ ⪗ ⪘ ⪙ ⪚ ⪛ ⪜ ⪝ ⪞ ⪟ +2aa0 │ ⪠ ⪡ ⪢ ⪣ ⪤ ⪦ ⪧ ⪨ ⪩ ⪪ ⪫ ⪬ ⪭ ⪮ ⪯ +2ab0 │ ⪰ ⪱ ⪲ ⪳ ⪴ ⪵ ⪶ ⪷ ⪸ ⪹ ⪺ ⪽ ⪾ ⪿ +2ac0 │ ⫀ ⫁ ⫂ ⫃ ⫄ ⫅ ⫆ ⫇ ⫈ ⫉ ⫊ ⫋ ⫌ ⫏ +2ad0 │ ⫐ ⫑ ⫒ ⫓ ⫔ ⫕ ⫖ ⫙ ⫚ ⫛ ⫝̸ ⫝ ⫞ +2ae0 │ ⫬ ⫭ ⫮ ⫯ +2af0 │ ⫰ ⫱ ⫲ ⫳ ⫴ ⫵ ⫶ ⫹ ⫺ ⫻ ⫼ ⫽ ⫾ ⫿ + +Miscellaneous Symbols and Arrows +═══════════════════════════════════════════════════════ +2b00 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2b00 │ ⬀ ⬁ ⬂ ⬃ ⬅ ⬆ ⬇ ⬈ ⬉ ⬊ ⬋ ⬍ ⬎ ⬏ +2b10 │ ⬐ ⬑ ⬒ ⬓ ⬔ ⬕ ⬖ ⬗ ⬘ ⬙ ⬚ ⬛ ⬜ ⬝ ⬞ ⬟ +2b20 │ ⬥ ⬦ ⬧ ⬨ ⬩ ⬪ ⬫ ⬮ ⬯ +2b30 │ ⬱ +2b40 │ ⭍ ⭎ ⭏ +2b50 │ ⭐ ⭑ ⭒ ⭖ ⭗ ⭘ ⭙ ⭚ ⭛ ⭜ ⭝ ⭞ ⭟ +2b60 │ ⭠ ⭡ ⭢ ⭣ ⭤ ⭥ ⭦ ⭧ ⭨ ⭩ ⭪ ⭫ ⭬ ⭭ ⭮ ⭯ +2b70 │ ⭱ ⭳ ⭿ +2b80 │ ⮀ ⮁ ⮂ ⮃ ⮄ ⮅ ⮆ ⮇ ⮈ ⮊ ⮌ ⮍ ⮎ ⮏ +2b90 │ ⮕ ⮘ ⮙ ⮚ ⮛ ⮜ ⮝ ⮞ ⮟ +2ba0 │ ⮠ ⮡ ⮢ ⮣ ⮤ ⮥ ⮦ ⮧ ⮨ ⮩ ⮪ ⮫ ⮬ ⮭ ⮮ ⮯ +2bb0 │ ⮸ ⮽ +2bc0 │ ⯀ ⯁ ⯂ ⯃ ⯅ ⯆ ⯇ ⯈ ⯌ ⯍ ⯎ ⯏ +2be0 │ ⯭ ⯯ + +Latin Extended-C +═══════════════════════════════════════════════════════ +2c60 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2c70 │ ⱱ ⱼ ⱽ + +Supplemental Punctuation +═══════════════════════════════════════════════════════ +2e00 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +2e20 │ ⸮ + +Bopomofo +═══════════════════════════════════════════════════════ +3100 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +3100 │ ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ +3110 │ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ +3120 │ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ + +Private Use Area +═══════════════════════════════════════════════════════ +e000 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +e0a0 │       +e0b0 │                 +e1c0 │       +e4c0 │              +e8c0 │   +e900 │         +e920 │        +e930 │     +e940 │          +e950 │  +e960 │     +e970 │      +e980 │             +e990 │       +e9a0 │         +e9b0 │                 +e9c0 │                 +e9d0 │                 +e9e0 │                 +e9f0 │            +ea00 │           +ea10 │    +ea20 │            +ea40 │              +ea50 │     +ea60 │                +ea70 │     +ea80 │   +ea90 │   +eb00 │             +eb20 │              +eb30 │            +eb40 │                 +eb50 │                 +eb60 │                 +eb70 │     +eb80 │                 +eb90 │                 +eba0 │                 +ebb0 │                 +ebc0 │           +ebe0 │                 +ebf0 │                 +ec00 │                 +ec10 │                 +ec20 │                 +ec30 │                 +ec40 │          +eca0 │                +ecc0 │                 +ecd0 │            +ece0 │                 +ecf0 │                 +ed00 │                 +ed10 │     +ed20 │                 +ed30 │                 +ed40 │                 +ed50 │                 +ed60 │           +ed80 │                 +ed90 │                 +eda0 │                 +edb0 │                 +edc0 │                 +edd0 │                 +ede0 │          + +Alphabetic Presentation Forms +═══════════════════════════════════════════════════════ +fb00 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +fb00 │ fi fl +fb20 │ ﬩ + +CJK Compatibility Forms +═══════════════════════════════════════════════════════ +fe30 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +fe30 │ ︰ ︱ ︲ ︳ ︿ +fe40 │ ﹀ ﹁ ﹂ ﹇ ﹈ + +Small Form Variants +═══════════════════════════════════════════════════════ +fe50 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +fe50 │ ﹐ ﹑ ﹒ ﹔ ﹕ ﹖ ﹗ ﹘ ﹙ ﹚ ﹛ ﹜ ﹝ ﹞ ﹟ +fe60 │ ﹠ ﹡ ﹢ ﹣ ﹤ ﹥ ﹦ ﹨ ﹩ ﹪ ﹫ + +Halfwidth and Fullwidth Forms +═══════════════════════════════════════════════════════ +ff00 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +ff00 │ ! " # $ % & ' ( ) * + , - . / +ff10 │ 0 1 2 3 4 5 6 7 8 9 : ; < = > ? +ff20 │ @ A B C D E F G H I J K L M N O +ff30 │ P Q R S T U V W X Y Z [ \ ] ^ _ +ff40 │ ` a b c d e f g h i j k l m n o +ff50 │ p q r s t u v w x y z { | } ~ +ff60 │ 。 「 」 、 ・ +ffe0 │ ¢ £ ¬  ̄ ¦ ¥ ₩ │ ← ↑ → ↓ ■ ○ + +Specials +═══════════════════════════════════════════════════════ +fff0 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +fff0 │     � + + _ _ + __ _ ___| |_ _ __ __ _| | + / _` / __| __| '__/ _` | | + | (_| \__ \ |_| | | (_| | | + \__,_|___/\__|.| \__,_|_| + _ __ | | __ _ _ __ ___ ___ + | '_ \| |/ _` | '_ \ / _ \/ __| + | |_) | | (_| | | | | __/\__ \ + | .__/|_|\__,_|_| |_|\___||___/ + |_| + +Old Italic +═══════════════════════════════════════════════════════ +10300 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +10300 │ 𐌀 𐌁 𐌂 𐌃 𐌄 𐌅 𐌆 𐌇 𐌈 𐌉 𐌊 𐌋 𐌌 𐌍 𐌎 𐌏 +10310 │ 𐌐 𐌑 𐌒 𐌓 𐌔 𐌕 𐌖 𐌗 𐌘 𐌙 𐌚 𐌛 𐌜 𐌝 𐌞 𐌟 +10320 │ 𐌠 𐌡 𐌢 𐌣 + +Gothic +═══════════════════════════════════════════════════════ +10330 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +10330 │ 𐌰 𐌱 𐌲 𐌳 𐌴 𐌵 𐌶 𐌷 𐌸 𐌹 𐌺 𐌻 𐌼 𐌽 𐌾 𐌿 +10340 │ 𐍀 𐍁 𐍂 𐍃 𐍄 𐍅 𐍆 𐍇 𐍈 𐍉 𐍊 + +Deseret +═══════════════════════════════════════════════════════ +10400 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +10400 │ 𐐀 𐐁 𐐂 𐐃 𐐄 𐐅 𐐆 𐐇 𐐈 𐐉 𐐊 𐐋 𐐌 𐐍 𐐎 𐐏 +10410 │ 𐐐 𐐑 𐐒 𐐓 𐐔 𐐕 𐐖 𐐗 𐐘 𐐙 𐐚 𐐛 𐐜 𐐝 𐐞 𐐟 +10420 │ 𐐠 𐐡 𐐢 𐐣 𐐤 𐐥 𐐦 𐐧 𐐨 𐐩 𐐪 𐐫 𐐬 𐐭 𐐮 𐐯 +10430 │ 𐐰 𐐱 𐐲 𐐳 𐐴 𐐵 𐐶 𐐷 𐐸 𐐹 𐐺 𐐻 𐐼 𐐽 𐐾 𐐿 +10440 │ 𐑀 𐑁 𐑂 𐑃 𐑄 𐑅 𐑆 𐑇 𐑈 𐑉 𐑊 𐑋 𐑌 𐑍 𐑎 𐑏 + +Osmanya +═══════════════════════════════════════════════════════ +10480 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +10480 │ 𐒀 𐒁 𐒂 𐒃 𐒄 𐒅 𐒆 𐒇 𐒈 𐒉 𐒊 𐒋 𐒌 𐒍 𐒎 𐒏 +10490 │ 𐒐 𐒑 𐒒 𐒓 𐒔 𐒕 𐒖 𐒗 𐒘 𐒙 𐒚 𐒛 𐒜 𐒝 + +Osage +═══════════════════════════════════════════════════════ +104b0 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +104b0 │ 𐒰 𐒱 𐒲 𐒳 𐒴 𐒵 𐒶 𐒷 𐒸 𐒹 𐒺 𐒻 𐒼 𐒽 𐒾 𐒿 +104c0 │ 𐓀 𐓁 𐓂 𐓃 𐓄 𐓅 𐓆 𐓇 𐓈 𐓉 𐓊 𐓋 𐓌 𐓍 𐓎 𐓏 +104d0 │ 𐓐 𐓑 𐓒 𐓓 𐓘 𐓙 𐓚 𐓛 𐓜 𐓝 𐓞 𐓟 +104e0 │ 𐓠 𐓡 𐓢 𐓣 𐓤 𐓥 𐓦 𐓧 𐓨 𐓩 𐓪 𐓫 𐓬 𐓭 𐓮 𐓯 +104f0 │ 𐓰 𐓱 𐓲 𐓳 𐓴 𐓵 𐓶 𐓷 𐓸 𐓹 𐓺 𐓻 + +Brahmi +═══════════════════════════════════════════════════════ +11000 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +11000 │ 𑀃 𑀄 𑀅 𑀆 𑀇 𑀈 𑀉 𑀊 𑀋 𑀌 𑀍 𑀎 𑀏 +11010 │ 𑀐 𑀑 𑀒 𑀓 𑀔 𑀕 𑀖 𑀗 𑀘 𑀙 𑀚 𑀛 𑀜 𑀝 𑀞 𑀟 +11020 │ 𑀠 𑀡 𑀢 𑀣 𑀤 𑀥 𑀦 𑀧 𑀨 𑀩 𑀪 𑀫 𑀬 𑀭 𑀮 𑀯 +11030 │ 𑀰 𑀱 𑀲 𑀳 𑀴 𑀵 𑀶 𑀷 +11040 │ 𑁇 𑁈 𑁉 𑁊 𑁋 𑁌 𑁍 +11050 │ 𑁒 𑁓 𑁔 𑁕 𑁖 𑁗 𑁘 𑁙 𑁚 𑁛 𑁜 𑁝 𑁞 𑁟 +11060 │ 𑁠 𑁡 𑁢 𑁣 𑁤 𑁥 𑁦 𑁧 𑁨 𑁩 𑁪 𑁫 𑁬 𑁭 𑁮 𑁯 + +Sinhala Archaic Numbers +═══════════════════════════════════════════════════════ +111e0 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +111e0 │ 𑇡 𑇢 𑇣 𑇤 𑇥 𑇦 𑇧 𑇨 𑇩 𑇪 𑇫 𑇬 𑇭 𑇮 𑇯 +111f0 │ 𑇰 𑇱 𑇲 𑇳 𑇴 + +Egyptian Hieroglyphs +═══════════════════════════════════════════════════════ +13000 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +13000 │ 𓀀 𓀁 𓀂 𓀃 𓀄 𓀅 𓀆 𓀇 𓀈 𓀉 𓀊 𓀋 𓀌 𓀍 𓀎 𓀏 +13010 │ 𓀐 𓀑 𓀒 𓀓 𓀔 𓀕 𓀖 𓀗 𓀘 𓀙 𓀚 𓀛 𓀜 𓀝 𓀞 𓀟 +13020 │ 𓀠 𓀡 𓀢 𓀣 𓀤 𓀥 𓀦 𓀧 𓀨 𓀩 𓀪 𓀫 𓀬 𓀭 𓀮 𓀯 +13030 │ 𓀰 𓀱 𓀲 𓀳 𓀴 𓀵 𓀶 𓀷 𓀸 𓀹 𓀺 𓀻 𓀼 𓀽 𓀾 𓀿 +13040 │ 𓁀 𓁁 𓁂 𓁃 𓁄 𓁅 𓁆 𓁇 𓁈 𓁉 𓁊 𓁋 𓁌 𓁍 𓁎 𓁏 +13050 │ 𓁐 𓁑 𓁒 𓁓 𓁔 𓁕 𓁖 𓁗 𓁘 𓁙 𓁚 𓁛 𓁜 𓁝 𓁞 𓁟 +13060 │ 𓁠 𓁡 𓁢 𓁣 𓁤 𓁥 𓁦 𓁧 𓁨 𓁩 𓁪 𓁫 𓁬 𓁭 𓁮 𓁯 +13070 │ 𓁰 𓁱 𓁲 𓁳 𓁴 𓁵 𓁶 𓁷 𓁸 𓁹 𓁺 𓁻 𓁼 𓁽 𓁾 𓁿 +13080 │ 𓂀 𓂁 𓂂 𓂃 𓂄 𓂅 𓂆 𓂇 𓂈 𓂉 𓂊 𓂋 𓂌 𓂍 𓂎 𓂏 +13090 │ 𓂐 𓂑 𓂒 𓂓 𓂔 𓂕 𓂖 𓂗 𓂘 𓂙 𓂚 𓂛 𓂜 𓂝 𓂞 𓂟 +130a0 │ 𓂠 𓂡 𓂢 𓂣 𓂤 𓂥 𓂦 𓂧 𓂨 𓂩 𓂪 𓂫 𓂬 𓂭 𓂮 𓂯 +130b0 │ 𓂰 𓂱 𓂲 𓂳 𓂴 𓂵 𓂶 𓂷 𓂻 𓂼 𓂽 𓂾 𓂿 +130c0 │ 𓃀 𓃁 𓃂 𓃃 𓃄 𓃅 𓃆 𓃇 𓃈 𓃉 𓃊 𓃋 𓃌 𓃍 𓃎 𓃏 +130d0 │ 𓃐 𓃑 𓃒 𓃓 𓃔 𓃕 𓃖 𓃗 𓃘 𓃙 𓃚 𓃛 𓃜 𓃝 𓃞 𓃟 +130e0 │ 𓃠 𓃡 𓃢 𓃣 𓃤 𓃥 𓃦 𓃧 𓃨 𓃩 𓃪 𓃫 𓃬 𓃭 𓃮 𓃯 +130f0 │ 𓃰 𓃱 𓃲 𓃳 𓃴 𓃵 𓃶 𓃷 𓃸 𓃹 𓃺 𓃻 𓃼 𓃽 𓃾 𓃿 +13100 │ 𓄀 𓄁 𓄂 𓄃 𓄄 𓄅 𓄆 𓄇 𓄈 𓄉 𓄊 𓄋 𓄌 𓄍 𓄎 𓄏 +13110 │ 𓄐 𓄑 𓄒 𓄓 𓄔 𓄕 𓄖 𓄗 𓄘 𓄙 𓄚 𓄛 𓄜 𓄝 𓄞 𓄟 +13120 │ 𓄠 𓄡 𓄢 𓄣 𓄤 𓄥 𓄦 𓄧 𓄨 𓄩 𓄪 𓄫 𓄬 𓄭 𓄮 𓄯 +13130 │ 𓄰 𓄱 𓄲 𓄳 𓄴 𓄵 𓄶 𓄷 𓄸 𓄹 𓄺 𓄻 𓄼 𓄽 𓄾 𓄿 +13140 │ 𓅀 𓅁 𓅂 𓅃 𓅄 𓅅 𓅆 𓅇 𓅈 𓅉 𓅊 𓅋 𓅌 𓅍 𓅎 𓅏 +13150 │ 𓅐 𓅑 𓅒 𓅓 𓅔 𓅕 𓅖 𓅗 𓅘 𓅙 𓅚 𓅛 𓅜 𓅝 𓅞 𓅟 +13160 │ 𓅠 𓅡 𓅢 𓅣 𓅤 𓅥 𓅦 𓅧 𓅨 𓅩 𓅪 𓅫 𓅬 𓅭 𓅮 𓅯 +13170 │ 𓅰 𓅱 𓅲 𓅳 𓅴 𓅵 𓅶 𓅷 𓅸 𓅹 𓅺 𓅻 𓅼 𓅽 𓅾 𓅿 +13180 │ 𓆀 𓆁 𓆂 𓆃 𓆄 𓆅 𓆆 𓆇 𓆈 𓆉 𓆊 𓆋 𓆌 𓆍 𓆎 𓆏 +13190 │ 𓆐 𓆑 𓆒 𓆓 𓆔 𓆕 𓆖 𓆗 𓆘 𓆙 𓆚 𓆛 𓆜 𓆝 𓆞 𓆟 +131a0 │ 𓆠 𓆡 𓆢 𓆣 𓆤 𓆥 𓆦 𓆧 𓆨 𓆩 𓆪 𓆫 𓆬 𓆭 𓆮 𓆯 +131b0 │ 𓆰 𓆱 𓆲 𓆳 𓆴 𓆵 𓆶 𓆷 𓆸 𓆹 𓆺 𓆻 𓆼 𓆽 𓆾 𓆿 +131c0 │ 𓇀 𓇁 𓇂 𓇃 𓇄 𓇅 𓇆 𓇇 𓇈 𓇉 𓇊 𓇋 𓇌 𓇍 𓇎 𓇏 +131d0 │ 𓇐 𓇑 𓇒 𓇓 𓇔 𓇕 𓇖 𓇗 𓇘 𓇙 𓇚 𓇛 𓇜 𓇝 𓇞 𓇟 +131e0 │ 𓇠 𓇡 𓇢 𓇣 𓇤 𓇥 𓇦 𓇧 𓇨 𓇩 𓇪 𓇫 𓇬 𓇭 𓇮 𓇯 +131f0 │ 𓇰 𓇱 𓇲 𓇳 𓇴 𓇵 𓇶 𓇷 𓇸 𓇹 𓇺 𓇻 𓇼 𓇽 𓇾 𓇿 +13200 │ 𓈀 𓈁 𓈂 𓈃 𓈄 𓈅 𓈆 𓈇 𓈈 𓈉 𓈊 𓈋 𓈌 𓈍 𓈎 𓈏 +13210 │ 𓈐 𓈑 𓈒 𓈓 𓈔 𓈕 𓈖 𓈗 𓈘 𓈙 𓈚 𓈛 𓈜 𓈝 𓈞 𓈟 +13220 │ 𓈠 𓈡 𓈢 𓈣 𓈤 𓈥 𓈦 𓈧 𓈨 𓈩 𓈪 𓈫 𓈬 𓈭 𓈮 𓈯 +13230 │ 𓈰 𓈱 𓈲 𓈳 𓈴 𓈵 𓈶 𓈷 𓈸 𓈹 𓈺 𓈻 𓈼 𓈽 𓈾 𓈿 +13240 │ 𓉀 𓉁 𓉂 𓉃 𓉄 𓉅 𓉆 𓉇 𓉈 𓉉 𓉊 𓉋 𓉌 𓉍 𓉎 𓉏 +13250 │ 𓉐 𓉑 𓉒 𓉓 𓉔 𓉕 𓉖 𓉗 𓉘 𓉙 𓉚 𓉛 𓉜 𓉝 𓉞 𓉟 +13260 │ 𓉠 𓉡 𓉢 𓉣 𓉤 𓉥 𓉦 𓉧 𓉨 𓉩 𓉪 𓉫 𓉬 𓉭 𓉮 𓉯 +13270 │ 𓉰 𓉱 𓉲 𓉳 𓉴 𓉵 𓉶 𓉷 𓉸 𓉹 𓉺 𓉻 𓉼 𓉽 𓉾 𓉿 +13280 │ 𓊀 𓊁 𓊂 𓊃 𓊄 𓊅 𓊆 𓊇 𓊈 𓊉 𓊊 𓊋 𓊌 𓊍 𓊎 𓊏 +13290 │ 𓊐 𓊑 𓊒 𓊓 𓊔 𓊕 𓊖 𓊗 𓊘 𓊙 𓊚 𓊛 𓊜 𓊝 𓊞 𓊟 +132a0 │ 𓊠 𓊡 𓊢 𓊣 𓊤 𓊥 𓊦 𓊧 𓊨 𓊩 𓊪 𓊫 𓊬 𓊭 𓊮 𓊯 +132b0 │ 𓊰 𓊱 𓊲 𓊳 𓊴 𓊵 𓊶 𓊷 𓊸 𓊹 𓊺 𓊻 𓊼 𓊽 𓊾 𓊿 +132c0 │ 𓋀 𓋁 𓋂 𓋃 𓋄 𓋅 𓋆 𓋇 𓋈 𓋉 𓋊 𓋋 𓋌 𓋍 𓋎 𓋏 +132d0 │ 𓋐 𓋑 𓋒 𓋓 𓋔 𓋕 𓋖 𓋗 𓋘 𓋙 𓋚 𓋛 𓋜 𓋝 𓋞 𓋟 +132e0 │ 𓋠 𓋡 𓋢 𓋣 𓋤 𓋥 𓋦 𓋧 𓋨 𓋩 𓋪 𓋫 𓋬 𓋭 𓋮 𓋯 +132f0 │ 𓋰 𓋱 𓋲 𓋳 𓋴 𓋵 𓋶 𓋷 𓋸 𓋹 𓋺 𓋻 𓋼 𓋽 𓋾 𓋿 +13300 │ 𓌀 𓌁 𓌂 𓌃 𓌄 𓌅 𓌆 𓌇 𓌈 𓌉 𓌊 𓌋 𓌌 𓌍 𓌎 𓌏 +13310 │ 𓌐 𓌑 𓌒 𓌓 𓌔 𓌕 𓌖 𓌗 𓌘 𓌙 𓌚 𓌛 𓌜 𓌝 𓌞 𓌟 +13320 │ 𓌠 𓌡 𓌢 𓌣 𓌤 𓌥 𓌦 𓌧 𓌨 𓌩 𓌪 𓌫 𓌬 𓌭 𓌮 𓌯 +13330 │ 𓌰 𓌱 𓌲 𓌳 𓌴 𓌵 𓌶 𓌷 𓌸 𓌹 𓌺 𓌻 𓌼 𓌽 𓌾 𓌿 +13340 │ 𓍀 𓍁 𓍂 𓍃 𓍄 𓍅 𓍆 𓍇 𓍈 𓍉 𓍊 𓍋 𓍌 𓍍 𓍎 𓍏 +13350 │ 𓍐 𓍑 𓍒 𓍓 𓍔 𓍕 𓍖 𓍗 𓍘 𓍙 𓍚 𓍛 𓍜 𓍝 𓍞 𓍟 +13360 │ 𓍠 𓍡 𓍢 𓍣 𓍤 𓍥 𓍦 𓍧 𓍨 𓍩 𓍪 𓍫 𓍬 𓍭 𓍮 𓍯 +13370 │ 𓍰 𓍱 𓍲 𓍳 𓍴 𓍵 𓍶 𓍷 𓍸 𓍹 𓍺 𓍻 𓍼 𓍽 𓍾 𓍿 +13380 │ 𓎀 𓎁 𓎂 𓎃 𓎄 𓎅 𓎆 𓎇 𓎈 𓎉 𓎊 𓎋 𓎌 𓎍 𓎎 𓎏 +13390 │ 𓎐 𓎑 𓎒 𓎓 𓎔 𓎕 𓎖 𓎗 𓎘 𓎙 𓎚 𓎛 𓎜 𓎝 𓎞 𓎟 +133a0 │ 𓎠 𓎡 𓎢 𓎣 𓎤 𓎥 𓎦 𓎧 𓎨 𓎩 𓎪 𓎫 𓎬 𓎭 𓎮 𓎯 +133b0 │ 𓎰 𓎱 𓎲 𓎳 𓎴 𓎵 𓎶 𓎷 𓎸 𓎹 𓎺 𓎻 𓎼 𓎽 𓎾 𓎿 +133c0 │ 𓏀 𓏁 𓏂 𓏃 𓏄 𓏅 𓏆 𓏇 𓏈 𓏉 𓏊 𓏋 𓏌 𓏍 𓏎 𓏏 +133d0 │ 𓏐 𓏑 𓏒 𓏓 𓏔 𓏕 𓏖 𓏗 𓏘 𓏙 𓏚 𓏛 𓏜 𓏝 𓏞 𓏟 +133e0 │ 𓏠 𓏡 𓏢 𓏣 𓏤 𓏥 𓏦 𓏧 𓏨 𓏩 𓏪 𓏫 𓏬 𓏭 𓏮 𓏯 +133f0 │ 𓏰 𓏱 𓏲 𓏳 𓏴 𓏵 𓏶 𓏷 𓏸 𓏹 𓏺 𓏻 𓏼 𓏽 𓏾 𓏿 +13400 │ 𓐀 𓐁 𓐂 𓐃 𓐄 𓐅 𓐆 𓐇 𓐈 𓐉 𓐊 𓐋 𓐌 𓐍 𓐎 𓐏 +13410 │ 𓐐 𓐑 𓐒 𓐓 𓐔 𓐕 𓐖 𓐗 𓐘 𓐙 𓐚 𓐛 𓐜 𓐝 𓐞 𓐟 +13420 │ 𓐠 𓐡 𓐢 𓐣 𓐤 𓐥 𓐦 𓐧 𓐨 𓐩 𓐪 𓐫 𓐬 𓐭 𓐮 + +Mathematical Alphanumeric Symbols +═══════════════════════════════════════════════════════ +1d400 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1d400 │ 𝐀 𝐁 𝐂 𝐃 𝐄 𝐅 𝐆 𝐇 𝐈 𝐉 𝐊 𝐋 𝐌 𝐍 𝐎 𝐏 +1d410 │ 𝐐 𝐑 𝐒 𝐓 𝐔 𝐕 𝐖 𝐗 𝐘 𝐙 𝐚 𝐛 𝐜 𝐝 𝐞 𝐟 +1d420 │ 𝐠 𝐡 𝐢 𝐣 𝐤 𝐥 𝐦 𝐧 𝐨 𝐩 𝐪 𝐫 𝐬 𝐭 𝐮 𝐯 +1d430 │ 𝐰 𝐱 𝐲 𝐳 𝐴 𝐵 𝐶 𝐷 𝐸 𝐹 𝐺 𝐻 𝐼 𝐽 𝐾 𝐿 +1d440 │ 𝑀 𝑁 𝑂 𝑃 𝑄 𝑅 𝑆 𝑇 𝑈 𝑉 𝑊 𝑋 𝑌 𝑍 𝑎 𝑏 +1d450 │ 𝑐 𝑑 𝑒 𝑓 𝑔 𝑕 𝑖 𝑗 𝑘 𝑙 𝑚 𝑛 𝑜 𝑝 𝑞 𝑟 +1d460 │ 𝑠 𝑡 𝑢 𝑣 𝑤 𝑥 𝑦 𝑧 𝑨 𝑩 𝑪 𝑫 𝑬 𝑭 𝑮 𝑯 +1d470 │ 𝑰 𝑱 𝑲 𝑳 𝑴 𝑵 𝑶 𝑷 𝑸 𝑹 𝑺 𝑻 𝑼 𝑽 𝑾 𝑿 +1d480 │ 𝒀 𝒁 𝒂 𝒃 𝒄 𝒅 𝒆 𝒇 𝒈 𝒉 𝒊 𝒋 𝒌 𝒍 𝒎 𝒏 +1d490 │ 𝒐 𝒑 𝒒 𝒓 𝒔 𝒕 𝒖 𝒗 𝒘 𝒙 𝒚 𝒛 𝒜 𝒝 𝒞 𝒟 +1d4a0 │ 𝒠 𝒡 𝒢 𝒣 𝒤 𝒥 𝒦 𝒧 𝒨 𝒩 𝒪 𝒫 𝒬 𝒭 𝒮 𝒯 +1d4b0 │ 𝒰 𝒱 𝒲 𝒳 𝒴 𝒵 𝒶 𝒷 𝒸 𝒹 𝒺 𝒻 𝒽 𝒾 𝒿 +1d4c0 │ 𝓀 𝓁 𝓂 𝓃 𝓄 𝓅 𝓆 𝓇 𝓈 𝓉 𝓊 𝓋 𝓌 𝓍 𝓎 𝓏 +1d4d0 │ 𝓐 𝓑 𝓒 𝓓 𝓔 𝓕 𝓖 𝓗 𝓘 𝓙 𝓚 𝓛 𝓜 𝓝 𝓞 𝓟 +1d4e0 │ 𝓠 𝓡 𝓢 𝓣 𝓤 𝓥 𝓦 𝓧 𝓨 𝓩 𝓪 𝓫 𝓬 𝓭 𝓮 𝓯 +1d4f0 │ 𝓰 𝓱 𝓲 𝓳 𝓴 𝓵 𝓶 𝓷 𝓸 𝓹 𝓺 𝓻 𝓼 𝓽 𝓾 𝓿 +1d500 │ 𝔀 𝔁 𝔂 𝔃 𝔄 𝔅 𝔆 𝔇 𝔈 𝔉 𝔊 𝔋 𝔌 𝔍 𝔎 𝔏 +1d510 │ 𝔐 𝔑 𝔒 𝔓 𝔔 𝔕 𝔖 𝔗 𝔘 𝔙 𝔚 𝔛 𝔜 𝔝 𝔞 𝔟 +1d520 │ 𝔠 𝔡 𝔢 𝔣 𝔤 𝔥 𝔦 𝔧 𝔨 𝔩 𝔪 𝔫 𝔬 𝔭 𝔮 𝔯 +1d530 │ 𝔰 𝔱 𝔲 𝔳 𝔴 𝔵 𝔶 𝔷 𝔸 𝔹 𝔻 𝔼 𝔽 𝔾 +1d540 │ 𝕀 𝕁 𝕂 𝕃 𝕄 𝕆 𝕊 𝕋 𝕌 𝕍 𝕎 𝕏 +1d550 │ 𝕐 𝕒 𝕓 𝕔 𝕕 𝕖 𝕗 𝕘 𝕙 𝕚 𝕛 𝕜 𝕝 𝕞 𝕟 +1d560 │ 𝕠 𝕡 𝕢 𝕣 𝕤 𝕥 𝕦 𝕧 𝕨 𝕩 𝕪 𝕫 𝕬 𝕭 𝕮 𝕯 +1d570 │ 𝕰 𝕱 𝕲 𝕳 𝕴 𝕵 𝕶 𝕷 𝕸 𝕹 𝕺 𝕻 𝕼 𝕽 𝕾 𝕿 +1d580 │ 𝖀 𝖁 𝖂 𝖃 𝖄 𝖅 𝖆 𝖇 𝖈 𝖉 𝖊 𝖋 𝖌 𝖍 𝖎 𝖏 +1d590 │ 𝖐 𝖑 𝖒 𝖓 𝖔 𝖕 𝖖 𝖗 𝖘 𝖙 𝖚 𝖛 𝖜 𝖝 𝖞 𝖟 +1d5a0 │ 𝖠 𝖡 𝖢 𝖣 𝖤 𝖥 𝖦 𝖧 𝖨 𝖩 𝖪 𝖫 𝖬 𝖭 𝖮 𝖯 +1d5b0 │ 𝖰 𝖱 𝖲 𝖳 𝖴 𝖵 𝖶 𝖷 𝖸 𝖹 𝖺 𝖻 𝖼 𝖽 𝖾 𝖿 +1d5c0 │ 𝗀 𝗁 𝗂 𝗃 𝗄 𝗅 𝗆 𝗇 𝗈 𝗉 𝗊 𝗋 𝗌 𝗍 𝗎 𝗏 +1d5d0 │ 𝗐 𝗑 𝗒 𝗓 𝗔 𝗕 𝗖 𝗗 𝗘 𝗙 𝗚 𝗛 𝗜 𝗝 𝗞 𝗟 +1d5e0 │ 𝗠 𝗡 𝗢 𝗣 𝗤 𝗥 𝗦 𝗧 𝗨 𝗩 𝗪 𝗫 𝗬 𝗭 𝗮 𝗯 +1d5f0 │ 𝗰 𝗱 𝗲 𝗳 𝗴 𝗵 𝗶 𝗷 𝗸 𝗹 𝗺 𝗻 𝗼 𝗽 𝗾 𝗿 +1d600 │ 𝘀 𝘁 𝘂 𝘃 𝘄 𝘅 𝘆 𝘇 𝘈 𝘉 𝘊 𝘋 𝘌 𝘍 𝘎 𝘏 +1d610 │ 𝘐 𝘑 𝘒 𝘓 𝘔 𝘕 𝘖 𝘗 𝘘 𝘙 𝘚 𝘛 𝘜 𝘝 𝘞 𝘟 +1d620 │ 𝘠 𝘡 𝘢 𝘣 𝘤 𝘥 𝘦 𝘧 𝘨 𝘩 𝘪 𝘫 𝘬 𝘭 𝘮 𝘯 +1d630 │ 𝘰 𝘱 𝘲 𝘳 𝘴 𝘵 𝘶 𝘷 𝘸 𝘹 𝘺 𝘻 𝘼 𝘽 𝘾 𝘿 +1d640 │ 𝙀 𝙁 𝙂 𝙃 𝙄 𝙅 𝙆 𝙇 𝙈 𝙉 𝙊 𝙋 𝙌 𝙍 𝙎 𝙏 +1d650 │ 𝙐 𝙑 𝙒 𝙓 𝙔 𝙕 𝙖 𝙗 𝙘 𝙙 𝙚 𝙛 𝙜 𝙝 𝙞 𝙟 +1d660 │ 𝙠 𝙡 𝙢 𝙣 𝙤 𝙥 𝙦 𝙧 𝙨 𝙩 𝙪 𝙫 𝙬 𝙭 𝙮 𝙯 +1d670 │ 𝙰 𝙱 𝙲 𝙳 𝙴 𝙵 𝙶 𝙷 𝙸 𝙹 𝙺 𝙻 𝙼 𝙽 𝙾 𝙿 +1d680 │ 𝚀 𝚁 𝚂 𝚃 𝚄 𝚅 𝚆 𝚇 𝚈 𝚉 𝚊 𝚋 𝚌 𝚍 𝚎 𝚏 +1d690 │ 𝚐 𝚑 𝚒 𝚓 𝚔 𝚕 𝚖 𝚗 𝚘 𝚙 𝚚 𝚛 𝚜 𝚝 𝚞 𝚟 +1d6a0 │ 𝚠 𝚡 𝚢 𝚣 𝚤 𝚥 𝚩 𝚪 𝚫 𝚬 𝚭 𝚮 𝚯 +1d6b0 │ 𝚰 𝚱 𝚲 𝚳 𝚴 𝚵 𝚶 𝚷 𝚸 𝚹 𝚺 𝚻 𝚼 𝚽 𝚾 𝚿 +1d6c0 │ 𝛀 𝛁 𝛂 𝛃 𝛄 𝛅 𝛆 𝛇 𝛈 𝛉 𝛊 𝛋 𝛌 𝛍 𝛎 𝛏 +1d6d0 │ 𝛐 𝛑 𝛒 𝛓 𝛔 𝛕 𝛖 𝛗 𝛘 𝛙 𝛚 𝛛 𝛜 𝛝 𝛞 𝛟 +1d6e0 │ 𝛠 𝛡 𝛢 𝛣 𝛤 𝛥 𝛦 𝛧 𝛨 𝛩 𝛪 𝛫 𝛬 𝛭 𝛮 𝛯 +1d6f0 │ 𝛰 𝛱 𝛲 𝛳 𝛴 𝛵 𝛶 𝛷 𝛸 𝛹 𝛺 𝛻 𝛼 𝛽 𝛾 𝛿 +1d700 │ 𝜀 𝜁 𝜂 𝜃 𝜄 𝜅 𝜆 𝜇 𝜈 𝜉 𝜊 𝜋 𝜌 𝜍 𝜎 𝜏 +1d710 │ 𝜐 𝜑 𝜒 𝜓 𝜔 𝜕 𝜖 𝜗 𝜘 𝜙 𝜚 𝜛 𝜜 𝜝 𝜞 𝜟 +1d720 │ 𝜠 𝜡 𝜢 𝜣 𝜤 𝜥 𝜦 𝜧 𝜨 𝜩 𝜪 𝜫 𝜬 𝜭 𝜮 𝜯 +1d730 │ 𝜰 𝜱 𝜲 𝜳 𝜴 𝜵 𝜶 𝜷 𝜸 𝜹 𝜺 𝜻 𝜼 𝜽 𝜾 𝜿 +1d740 │ 𝝀 𝝁 𝝂 𝝃 𝝄 𝝅 𝝆 𝝇 𝝈 𝝉 𝝊 𝝋 𝝌 𝝍 𝝎 𝝏 +1d750 │ 𝝐 𝝑 𝝒 𝝓 𝝔 𝝕 𝝖 𝝗 𝝘 𝝙 𝝚 𝝛 𝝜 𝝝 𝝞 𝝟 +1d760 │ 𝝠 𝝡 𝝢 𝝣 𝝤 𝝥 𝝦 𝝧 𝝨 𝝩 𝝪 𝝫 𝝬 𝝭 𝝮 𝝯 +1d770 │ 𝝰 𝝱 𝝲 𝝳 𝝴 𝝵 𝝶 𝝷 𝝸 𝝹 𝝺 𝝻 𝝼 𝝽 𝝾 𝝿 +1d780 │ 𝞀 𝞁 𝞂 𝞃 𝞄 𝞅 𝞆 𝞇 𝞈 𝞉 𝞊 𝞋 𝞌 𝞍 𝞎 𝞏 +1d790 │ 𝞐 𝞑 𝞒 𝞓 𝞔 𝞕 𝞖 𝞗 𝞘 𝞙 𝞚 𝞛 𝞜 𝞝 𝞞 𝞟 +1d7a0 │ 𝞠 𝞡 𝞢 𝞣 𝞤 𝞥 𝞦 𝞧 𝞨 𝞩 𝞪 𝞫 𝞬 𝞭 𝞮 𝞯 +1d7b0 │ 𝞰 𝞱 𝞲 𝞳 𝞴 𝞵 𝞶 𝞷 𝞸 𝞹 𝞺 𝞻 𝞼 𝞽 𝞾 𝞿 +1d7c0 │ 𝟀 𝟁 𝟂 𝟃 𝟄 𝟅 𝟆 𝟇 𝟈 𝟉 𝟊 𝟎 𝟏 +1d7d0 │ 𝟐 𝟑 𝟒 𝟓 𝟔 𝟕 𝟖 𝟗 𝟘 𝟙 𝟚 𝟛 𝟜 𝟝 𝟞 𝟟 +1d7e0 │ 𝟠 𝟡 𝟢 𝟣 𝟤 𝟥 𝟦 𝟧 𝟨 𝟩 𝟪 𝟫 𝟬 𝟭 𝟮 𝟯 +1d7f0 │ 𝟰 𝟱 𝟲 𝟳 𝟴 𝟵 𝟶 𝟷 𝟸 𝟹 𝟺 𝟻 𝟼 𝟽 𝟾 𝟿 + +Mahjong Tiles +═══════════════════════════════════════════════════════ +1f000 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1f000 │ 🀀 🀁 🀂 🀃 🀄 🀅 🀆 🀇 🀈 🀉 🀊 🀋 🀌 🀍 🀎 🀏 +1f010 │ 🀐 🀑 🀒 🀓 🀔 🀕 🀖 🀗 🀘 🀙 🀚 🀛 🀜 🀝 🀞 🀟 +1f020 │ 🀠 🀡 🀢 🀣 🀤 🀥 🀦 🀧 🀨 🀩 🀪 🀫 + +Domino Tiles +═══════════════════════════════════════════════════════ +1f030 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1f030 │ 🀰 🀱 🀲 🀳 🀴 🀵 🀶 🀷 🀸 🀹 🀺 🀻 🀼 🀽 🀾 🀿 +1f040 │ 🁀 🁁 🁂 🁃 🁄 🁅 🁆 🁇 🁈 🁉 🁊 🁋 🁌 🁍 🁎 🁏 +1f050 │ 🁐 🁑 🁒 🁓 🁔 🁕 🁖 🁗 🁘 🁙 🁚 🁛 🁜 🁝 🁞 🁟 +1f060 │ 🁠 🁡 🁢 🁣 🁤 🁥 🁦 🁧 🁨 🁩 🁪 🁫 🁬 🁭 🁮 🁯 +1f070 │ 🁰 🁱 🁲 🁳 🁴 🁵 🁶 🁷 🁸 🁹 🁺 🁻 🁼 🁽 🁾 🁿 +1f080 │ 🂀 🂁 🂂 🂃 🂄 🂅 🂆 🂇 🂈 🂉 🂊 🂋 🂌 🂍 🂎 🂏 +1f090 │ 🂐 🂑 🂒 🂓 + +Playing Cards +═══════════════════════════════════════════════════════ +1f0a0 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1f0a0 │ 🂠 🂡 🂢 🂣 🂤 🂥 🂦 🂧 🂨 🂩 🂪 🂫 🂬 🂭 🂮 +1f0b0 │ 🂰 🂱 🂲 🂳 🂴 🂵 🂶 🂷 🂸 🂹 🂺 🂻 🂼 🂽 🂾 +1f0c0 │ 🃀 🃁 🃂 🃃 🃄 🃅 🃆 🃇 🃈 🃉 🃊 🃋 🃌 🃍 🃎 🃏 +1f0d0 │ 🃐 🃑 🃒 🃓 🃔 🃕 🃖 🃗 🃘 🃙 🃚 🃛 🃜 🃝 🃞 🃟 + +Enclosed Alphanumeric Supplement +═══════════════════════════════════════════════════════ +1f100 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1f100 │ 🄀 🄁 🄂 🄃 🄄 🄅 🄆 🄇 🄈 🄉 🄊 +1f110 │ 🄐 🄑 🄒 🄓 🄔 🄕 🄖 🄗 🄘 🄙 🄚 🄛 🄜 🄝 🄞 🄟 +1f120 │ 🄠 🄡 🄢 🄣 🄤 🄥 🄦 🄧 🄨 🄩 🄪 🄫 🄬 🄭 🄮 🄯 +1f130 │ 🄰 🄱 🄲 🄳 🄴 🄵 🄶 🄷 🄸 🄹 🄺 🄻 🄼 🄽 🄾 🄿 +1f140 │ 🅀 🅁 🅂 🅃 🅄 🅅 🅆 🅇 🅈 🅉 🅊 🅋 🅌 🅍 🅎 🅏 +1f150 │ 🅐 🅑 🅒 🅓 🅔 🅕 🅖 🅗 🅘 🅙 🅚 🅛 🅜 🅝 🅞 🅟 +1f160 │ 🅠 🅡 🅢 🅣 🅤 🅥 🅦 🅧 🅨 🅩 +1f170 │ 🅰 🅱 🅲 🅳 🅴 🅵 🅶 🅷 🅸 🅹 🅺 🅻 🅼 🅽 🅾 🅿 +1f180 │ 🆀 🆁 🆂 🆃 🆄 🆅 🆆 🆇 🆈 🆉 🆊 🆋 🆌 🆍 🆎 🆏 +1f190 │ 🆐 🆑 🆒 🆓 🆔 🆕 🆖 🆗 🆘 🆙 🆚 +1f1e0 │ 🇦 🇧 🇨 🇩 🇪 🇫 🇬 🇭 🇮 🇯 +1f1f0 │ 🇰 🇱 🇲 🇳 🇴 🇵 🇶 🇷 🇸 🇹 🇺 🇻 🇼 🇽 🇾 🇿 + +Enclosed Ideographic Supplement +═══════════════════════════════════════════════════════ +1f200 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1f200 │ 🈀 🈁 🈂 +1f210 │ 🈐 🈑 🈒 🈓 🈔 🈕 🈖 🈗 🈘 🈙 🈚 🈛 🈜 🈝 🈞 🈟 +1f220 │ 🈠 🈡 🈢 🈣 🈤 🈥 🈦 🈧 🈨 🈩 🈪 🈫 🈬 🈭 🈮 🈯 +1f230 │ 🈰 🈱 🈲 🈳 🈴 🈵 🈶 🈷 🈸 🈹 🈺 +1f240 │ 🉀 🉁 🉂 🉃 🉄 🉅 🉆 🉇 🉈 +1f250 │ 🉐 🉑 + +Miscellaneous Symbols and Pictographs +═══════════════════════════════════════════════════════ +1f300 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1f300 │ 🌀 🌁 🌂 🌃 🌄 🌅 🌆 🌇 🌈 🌉 🌊 🌋 🌌 🌍 🌎 🌏 +1f310 │ 🌐 🌑 🌒 🌓 🌔 🌕 🌖 🌗 🌘 🌙 🌚 🌛 🌜 🌝 🌞 🌟 +1f320 │ 🌠 🌡 🌢 🌣 🌤 🌥 🌦 🌧 🌨 🌩 🌪 🌫 🌬 🌭 🌮 🌯 +1f330 │ 🌰 🌱 🌲 🌳 🌴 🌵 🌶 🌷 🌸 🌹 🌺 🌻 🌼 🌽 🌾 🌿 +1f340 │ 🍀 🍁 🍂 🍃 🍄 🍅 🍆 🍇 🍈 🍉 🍊 🍋 🍌 🍍 🍎 🍏 +1f350 │ 🍐 🍑 🍒 🍓 🍔 🍕 🍖 🍗 🍘 🍙 🍚 🍛 🍜 🍝 🍞 🍟 +1f360 │ 🍠 🍡 🍢 🍣 🍤 🍥 🍦 🍧 🍨 🍩 🍪 🍫 🍬 🍭 🍮 🍯 +1f370 │ 🍰 🍱 🍲 🍳 🍴 🍵 🍶 🍷 🍸 🍹 🍺 🍻 🍼 🍽 🍾 🍿 +1f380 │ 🎀 🎁 🎂 🎃 🎄 🎅 🎆 🎇 🎈 🎉 🎊 🎋 🎌 🎍 🎎 🎏 +1f390 │ 🎐 🎑 🎒 🎓 🎔 🎕 🎖 🎗 🎘 🎙 🎚 🎛 🎜 🎝 🎞 🎟 +1f3a0 │ 🎠 🎡 🎢 🎣 🎤 🎥 🎦 🎧 🎨 🎩 🎪 🎫 🎬 🎭 🎮 🎯 +1f3b0 │ 🎰 🎱 🎲 🎳 🎴 🎵 🎶 🎷 🎸 🎹 🎺 🎻 🎼 🎽 🎾 🎿 +1f3c0 │ 🏀 🏁 🏂 🏃 🏄 🏅 🏆 🏇 🏈 🏉 🏊 🏋 🏌 🏍 🏎 🏏 +1f3d0 │ 🏐 🏑 🏒 🏓 🏔 🏕 🏖 🏗 🏘 🏙 🏚 🏛 🏜 🏝 🏞 🏟 +1f3e0 │ 🏠 🏡 🏢 🏣 🏤 🏥 🏦 🏧 🏨 🏩 🏪 🏫 🏬 🏭 🏮 🏯 +1f3f0 │ 🏰 🏱 🏲 🏳 🏴 🏵 🏶 🏷 🏸 🏹 🏺 🏻 🏼 🏽 🏾 🏿 +1f400 │ 🐀 🐁 🐂 🐃 🐄 🐅 🐆 🐇 🐈 🐉 🐊 🐋 🐌 🐍 🐎 🐏 +1f410 │ 🐐 🐑 🐒 🐓 🐔 🐕 🐖 🐗 🐘 🐙 🐚 🐛 🐜 🐝 🐞 🐟 +1f420 │ 🐠 🐡 🐢 🐣 🐤 🐥 🐦 🐧 🐨 🐩 🐪 🐫 🐬 🐭 🐮 🐯 +1f430 │ 🐰 🐱 🐲 🐳 🐴 🐵 🐶 🐷 🐸 🐹 🐺 🐻 🐼 🐽 🐾 🐿 +1f440 │ 👀 👁 👂 👃 👄 👅 👆 👇 👈 👉 👊 👋 👌 👍 👎 👏 +1f450 │ 👐 👑 👒 👓 👔 👕 👖 👗 👘 👙 👚 👛 👜 👝 👞 👟 +1f460 │ 👠 👡 👢 👣 👤 👥 👦 👧 👨 👩 👪 👫 👬 👭 👮 👯 +1f470 │ 👰 👱 👲 👳 👴 👵 👶 👷 👸 👹 👺 👻 👼 👽 👾 👿 +1f480 │ 💀 💁 💂 💃 💄 💅 💆 💇 💈 💉 💊 💋 💌 💍 💎 💏 +1f490 │ 💐 💑 💒 💓 💔 💕 💖 💗 💘 💙 💚 💛 💜 💝 💞 💟 +1f4a0 │ 💠 💡 💢 💣 💤 💥 💦 💧 💨 💩 💪 💫 💬 💭 💮 💯 +1f4b0 │ 💰 💱 💲 💳 💴 💵 💶 💷 💸 💹 💺 💻 💼 💽 💾 💿 +1f4c0 │ 📀 📁 📂 📃 📄 📅 📆 📇 📈 📉 📊 📋 📌 📍 📎 📏 +1f4d0 │ 📐 📑 📒 📓 📔 📕 📖 📗 📘 📙 📚 📛 📜 📝 📞 📟 +1f4e0 │ 📠 📡 📢 📣 📤 📥 📦 📧 📨 📩 📪 📫 📬 📭 📮 📯 +1f4f0 │ 📰 📱 📲 📳 📴 📵 📶 📷 📸 📹 📺 📻 📼 📽 📾 📿 +1f500 │ 🔀 🔁 🔂 🔃 🔄 🔅 🔆 🔇 🔈 🔉 🔊 🔋 🔌 🔍 🔎 🔏 +1f510 │ 🔐 🔑 🔒 🔓 🔔 🔕 🔖 🔗 🔘 🔙 🔚 🔛 🔜 🔝 🔞 🔟 +1f520 │ 🔠 🔡 🔢 🔣 🔤 🔥 🔦 🔧 🔨 🔩 🔪 🔫 🔬 🔭 🔮 🔯 +1f530 │ 🔰 🔱 🔲 🔳 🔴 🔵 🔶 🔷 🔸 🔹 🔺 🔻 🔼 🔽 🔾 🔿 +1f540 │ 🕀 🕁 🕂 🕃 🕄 🕅 🕆 🕇 🕈 🕉 🕊 🕋 🕌 🕍 🕎 🕏 +1f550 │ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 🕞 🕟 +1f560 │ 🕠 🕡 🕢 🕣 🕤 🕥 🕦 🕧 🕨 🕩 🕪 🕫 🕬 🕭 🕮 🕯 +1f570 │ 🕰 🕱 🕲 🕳 🕴 🕵 🕶 🕷 🕸 🕹 🕺 🕻 🕼 🕽 🕾 🕿 +1f580 │ 🖀 🖁 🖂 🖃 🖄 🖅 🖆 🖇 🖈 🖉 🖊 🖋 🖌 🖍 🖎 🖏 +1f590 │ 🖐 🖑 🖒 🖓 🖔 🖕 🖖 🖗 🖘 🖙 🖚 🖛 🖜 🖝 🖞 🖟 +1f5a0 │ 🖠 🖡 🖢 🖣 🖤 🖥 🖦 🖧 🖨 🖩 🖪 🖫 🖬 🖭 🖮 🖯 +1f5b0 │ 🖰 🖱 🖲 🖳 🖴 🖵 🖶 🖷 🖸 🖹 🖺 🖻 🖼 🖽 🖾 🖿 +1f5c0 │ 🗀 🗁 🗂 🗃 🗄 🗅 🗆 🗇 🗈 🗉 🗊 🗋 🗌 🗍 🗎 🗏 +1f5d0 │ 🗐 🗑 🗒 🗓 🗔 🗕 🗖 🗗 🗘 🗙 🗚 🗛 🗜 🗝 🗞 🗟 +1f5e0 │ 🗠 🗡 🗢 🗣 🗤 🗥 🗦 🗧 🗨 🗩 🗪 🗫 🗬 🗭 🗮 🗯 +1f5f0 │ 🗰 🗱 🗲 🗳 🗴 🗵 🗶 🗷 🗸 🗹 🗺 🗻 🗼 🗽 🗾 🗿 + +Emoticons +═══════════════════════════════════════════════════════ +1f600 │ 0 1 2 3 4 5 6 7 8 9 a b c d e f +─────────────────────────────────────────────────────── +1f600 │ 😀 😁 😂 😃 😄 😅 😆 😇 😈 😉 😊 😋 😌 😍 😎 😏 +1f610 │ 😐 😑 😒 😓 😔 😕 😖 😗 😘 😙 😚 😛 😜 😝 😞 😟 +1f620 │ 😠 😡 😢 😣 😤 😥 😦 😧 😨 😩 😪 😫 😬 😭 😮 😯 +1f630 │ 😰 😱 😲 😳 😴 😵 😶 😷 😸 😹 😺 😻 😼 😽 😾 😿 +1f640 │ 🙀 🙁 🙂 🙃 🙄 🙅 🙆 🙇 🙈 🙉 🙊 🙋 🙌 🙍 🙎 🙏 diff --git a/libc/x/utf16toutf8.c b/libc/x/utf16to8.c similarity index 98% rename from libc/x/utf16toutf8.c rename to libc/x/utf16to8.c index feaaf7895..64075e2cf 100644 --- a/libc/x/utf16toutf8.c +++ b/libc/x/utf16to8.c @@ -41,7 +41,7 @@ static const int16_t kDel16[8] = {127, 127, 127, 127, 127, 127, 127, 127}; * @param n if -1 implies strlen * @param z if non-NULL receives output length */ -char *utf16toutf8(const char16_t *p, size_t n, size_t *z) { +char *utf16to8(const char16_t *p, size_t n, size_t *z) { char *r, *q; wint_t x, y; unsigned m, j, w; diff --git a/test/libc/x/utf8toutf32_test.c b/libc/x/utf32to8.c similarity index 58% rename from test/libc/x/utf8toutf32_test.c rename to libc/x/utf32to8.c index 1881071a2..32b609469 100644 --- a/test/libc/x/utf8toutf32_test.c +++ b/libc/x/utf32to8.c @@ -1,7 +1,7 @@ /*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ │vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -17,37 +17,35 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/mem/mem.h" -#include "libc/runtime/gc.internal.h" -#include "libc/testlib/ezbench.h" -#include "libc/testlib/hyperion.h" -#include "libc/testlib/testlib.h" +#include "libc/str/str.h" +#include "libc/str/tpenc.h" #include "libc/x/x.h" -TEST(utf8toutf32, test) { - EXPECT_STREQ(L"", gc(utf8toutf32(0, 0, 0))); - EXPECT_STREQ(L"", gc(utf8toutf32("", -1, 0))); - EXPECT_STREQ(L"hello", gc(utf8toutf32("hello", -1, 0))); -} - -TEST(utf8toutf32, testLargeAscii) { - EXPECT_STREQ(L"hellohellohelloz", gc(utf8toutf32("hellohellohelloz", -1, 0))); - EXPECT_STREQ(L"hellohellohellozhellohellohelloz", - gc(utf8toutf32("hellohellohellozhellohellohelloz", -1, 0))); -} - -TEST(utf8toutf32, testLargeThompsonPikeEncoded) { - EXPECT_STREQ(L"hellohellohello𝑧hellohellohelloz", - gc(utf8toutf32("hellohellohello𝑧hellohellohelloz", -1, 0))); - EXPECT_STREQ(L"hellohellohelloh𝑧ellohellohelloz", - gc(utf8toutf32("hellohellohelloh𝑧ellohellohelloz", -1, 0))); - EXPECT_STREQ( - L"𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑧", - gc(utf8toutf32( - "𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑧", - -1, 0))); -} - -BENCH(utf8toutf32, bench) { - EZBENCH2("utf8toutf32", donothing, - free(utf8toutf32(kHyperion, kHyperionSize, 0))); +/** + * Transcodes UTF-32 to UTF-8. + * + * @param p is input value + * @param n if -1 implies wcslen + * @param z if non-NULL receives output length + */ +char *utf32to8(const wchar_t *p, size_t n, size_t *z) { + size_t i; + wint_t x; + uint64_t w; + char *r, *q; + if (z) *z = 0; + if (n == -1) n = p ? wcslen(p) : 0; + if ((q = r = malloc(n * 6 + 1))) { + for (i = 0; i < n; ++i) { + x = p[i]; + w = tpenc(x); + do { + *q++ = w; + } while ((w >>= 8)); + } + if (z) *z = q - r; + *q++ = '\0'; + if ((q = realloc(r, q - r))) r = q; + } + return r; } diff --git a/libc/x/utf8toutf16.c b/libc/x/utf8to16.c similarity index 98% rename from libc/x/utf8toutf16.c rename to libc/x/utf8to16.c index e794327c0..98ab7fa98 100644 --- a/libc/x/utf8toutf16.c +++ b/libc/x/utf8to16.c @@ -29,7 +29,7 @@ * @param n if -1 implies strlen * @param z if non-NULL receives output length */ -char16_t *utf8toutf16(const char *p, size_t n, size_t *z) { +char16_t *utf8to16(const char *p, size_t n, size_t *z) { size_t i; wint_t x, a, b; char16_t *r, *q; diff --git a/libc/x/utf8toutf32.c b/libc/x/utf8to32.c similarity index 95% rename from libc/x/utf8toutf32.c rename to libc/x/utf8to32.c index f5fdb1391..0208d5e41 100644 --- a/libc/x/utf8toutf32.c +++ b/libc/x/utf8to32.c @@ -16,6 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/intrin/likely.h" #include "libc/intrin/pcmpgtb.h" #include "libc/intrin/pmovmskb.h" #include "libc/intrin/punpckhbw.h" @@ -35,7 +36,8 @@ * @param n if -1 implies strlen * @param z if non-NULL receives output length */ -wchar_t *utf8toutf32(const char *p, size_t n, size_t *z) { +wchar_t *utf8to32(const char *p, size_t n, size_t *z) { + int e; size_t i; unsigned m, j; wint_t x, a, b; @@ -45,7 +47,8 @@ wchar_t *utf8toutf32(const char *p, size_t n, size_t *z) { if (n == -1) n = p ? strlen(p) : 0; if ((q = r = malloc(n * sizeof(wchar_t) + sizeof(wchar_t)))) { for (i = 0; i < n;) { - if (i + 16 < n) { /* 10x speedup for ascii */ + if (!((uintptr_t)(p + i) & 15) && i + 16 < n) { + /* 10x speedup for ascii */ bzero(vz, 16); do { memcpy(v1, p + i, 16); diff --git a/libc/x/x.h b/libc/x/x.h index b80de0b36..4f4ae4bb5 100644 --- a/libc/x/x.h +++ b/libc/x/x.h @@ -52,10 +52,11 @@ char *xstrmul(const char *, size_t) paramsnonnull((1)) _XMAL; char *xinet_ntop(int, const void *) _XPNN _XMAL; void *xunbinga(size_t, const char16_t *) attributeallocalign((1)) _XMAL _XRET; void *xunbing(const char16_t *) _XMAL _XRET; -char16_t *utf8toutf16(const char *, size_t, size_t *) dontdiscard; -char *utf16toutf8(const char16_t *, size_t, size_t *) dontdiscard; -wchar_t *utf8toutf32(const char *, size_t, size_t *) dontdiscard; +char16_t *utf8to16(const char *, size_t, size_t *) dontdiscard; +char *utf16to8(const char16_t *, size_t, size_t *) dontdiscard; +wchar_t *utf8to32(const char *, size_t, size_t *) dontdiscard; wchar_t *utf16to32(const char16_t *, size_t, size_t *) dontdiscard; +char *utf32to8(const wchar_t *, size_t, size_t *) dontdiscard; char *xhomedir(void) dontdiscard; char *xstripext(const char *) dontdiscard; char *xstripexts(const char *) dontdiscard; diff --git a/test/libc/fmt/sscanf_test.c b/test/libc/fmt/sscanf_test.c index 1e89a89ca..dfe5b5718 100644 --- a/test/libc/fmt/sscanf_test.c +++ b/test/libc/fmt/sscanf_test.c @@ -16,9 +16,9 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/intrin/bits.h" #include "libc/errno.h" #include "libc/fmt/fmt.h" +#include "libc/intrin/bits.h" #include "libc/limits.h" #include "libc/mem/mem.h" #include "libc/testlib/testlib.h" @@ -87,7 +87,7 @@ TEST(sscanf, testStringBuffer_gothicUtf8ToUtf8_roundTrips) { EXPECT_STREQ("𐌴𐌵𐌶𐌷", s2); } -TEST(sscanf, testStringBuffer_gothicUtf8ToUtf16) { +TEST(sscanf, testStringBuffer_gothicUtf8to16) { char16_t s1[64], s2[64]; ASSERT_EQ(2, sscanf("𐌰𐌱𐌲𐌳 𐌴𐌵𐌶𐌷", "%63hs %63hs", s1, s2)); EXPECT_STREQ(u"𐌰𐌱𐌲𐌳", s1); diff --git a/test/libc/nexgen32e/strsak32_test.c b/test/libc/nexgen32e/strsak32_test.c index c7ccb6055..5edb67dba 100644 --- a/test/libc/nexgen32e/strsak32_test.c +++ b/test/libc/nexgen32e/strsak32_test.c @@ -32,7 +32,7 @@ TEST(strsak32, test) { BENCH(strsak32, bench) { size_t wcslen_(const wchar_t *) asm("wcslen"); - wchar_t *p = gc(utf8toutf32(kHyperion, kHyperionSize, 0)); + wchar_t *p = gc(utf8to32(kHyperion, kHyperionSize, 0)); EZBENCH_N("wcslen", kHyperionSize, wcslen_(p)); for (int i = 128; i >= 2; i /= 2) { p[i - 0] = 0; diff --git a/test/libc/str/strchr_test.c b/test/libc/str/strchr_test.c index 37d85e7e9..a3ae1586d 100644 --- a/test/libc/str/strchr_test.c +++ b/test/libc/str/strchr_test.c @@ -167,6 +167,22 @@ TEST(rawmemchr, fuzz) { free(p); } +/* + * strchr 0 l: 10c 3ns m: 38c 12ns + * strchr 5 l: 13c 4ns m: 42c 14ns + * strchr 8 l: 14c 5ns m: 44c 14ns + * strchr 17 l: 13c 4ns m: 45c 15ns + * strchr 34 l: 16c 5ns m: 48c 16ns + * strchr z l: 369c 119ns m: 408c 132ns + * rawmemchr z l: 236c 76ns m: 391c 126ns + * memchr z l: 357c 115ns m: 423c 137ns + * strchr Z l: 1,872c 605ns m: 1,911c 617ns + * rawmemchr \0 l: 1,184c 382ns m: 1,880c 607ns + * strlen l: 1,174c 379ns m: 1,237c 400ns + * memchr Z l: 1,866c 603ns m: 1,945c 628ns + * strchrnul z l: 365c 118ns m: 408c 132ns + * strchrnul Z l: 1,871c 604ns m: 1,914c 618ns + */ BENCH(strchr, bench2) { char *strchr_(const char *, int) asm("strchr"); char *strchrnul_(const char *, int) asm("strchrnul"); diff --git a/test/libc/x/utf16to32_test.c b/test/libc/x/utf16to32_test.c index 78abb12e5..132588a7f 100644 --- a/test/libc/x/utf16to32_test.c +++ b/test/libc/x/utf16to32_test.c @@ -51,6 +51,6 @@ TEST(utf16to32, testAstralPlanesGothic) { BENCH(utf16to8, bench) { size_t n; char16_t *h; - h = gc(utf8toutf16(kHyperion, kHyperionSize, &n)); - EZBENCH2("utf16toutf8", donothing, free(utf16to32(h, n, 0))); + h = gc(utf8to16(kHyperion, kHyperionSize, &n)); + EZBENCH2("utf16to32", donothing, free(utf16to32(h, n, 0))); } diff --git a/test/libc/x/utf16toutf8_test.c b/test/libc/x/utf16to8_test.c similarity index 73% rename from test/libc/x/utf16toutf8_test.c rename to test/libc/x/utf16to8_test.c index 3484f75fe..0af0c445c 100644 --- a/test/libc/x/utf16toutf8_test.c +++ b/test/libc/x/utf16to8_test.c @@ -23,21 +23,21 @@ #include "libc/testlib/testlib.h" #include "libc/x/x.h" -TEST(utf16toutf8, test) { - EXPECT_STREQ("hello☻♥", gc(utf16toutf8(u"hello☻♥", -1, 0))); - EXPECT_STREQ("hello☻♥hello☻♥h", gc(utf16toutf8(u"hello☻♥hello☻♥h", -1, 0))); - EXPECT_STREQ("hello☻♥hello☻♥hi", gc(utf16toutf8(u"hello☻♥hello☻♥hi", -1, 0))); +TEST(utf16to8, test) { + EXPECT_STREQ("hello☻♥", gc(utf16to8(u"hello☻♥", -1, 0))); + EXPECT_STREQ("hello☻♥hello☻♥h", gc(utf16to8(u"hello☻♥hello☻♥h", -1, 0))); + EXPECT_STREQ("hello☻♥hello☻♥hi", gc(utf16to8(u"hello☻♥hello☻♥hi", -1, 0))); EXPECT_STREQ("hello☻♥hello☻♥hello☻♥hello☻♥hello☻♥", - gc(utf16toutf8(u"hello☻♥hello☻♥hello☻♥hello☻♥hello☻♥", -1, 0))); - EXPECT_STREQ("hello--hello--h", gc(utf16toutf8(u"hello--hello--h", -1, 0))); - EXPECT_STREQ("hello--hello--hi", gc(utf16toutf8(u"hello--hello--hi", -1, 0))); + gc(utf16to8(u"hello☻♥hello☻♥hello☻♥hello☻♥hello☻♥", -1, 0))); + EXPECT_STREQ("hello--hello--h", gc(utf16to8(u"hello--hello--h", -1, 0))); + EXPECT_STREQ("hello--hello--hi", gc(utf16to8(u"hello--hello--hi", -1, 0))); EXPECT_STREQ("hello--hello--hello--hello--hello--", - gc(utf16toutf8(u"hello--hello--hello--hello--hello--", -1, 0))); + gc(utf16to8(u"hello--hello--hello--hello--hello--", -1, 0))); } -BENCH(utf16toutf8, bench) { +BENCH(utf16to8, bench) { size_t n; char16_t *h; - h = gc(utf8toutf16(kHyperion, kHyperionSize, &n)); - EZBENCH2("utf16toutf8", donothing, free(utf16toutf8(h, n, 0))); + h = gc(utf8to16(kHyperion, kHyperionSize, &n)); + EZBENCH2("utf16to8", donothing, free(utf16to8(h, n, 0))); } diff --git a/test/libc/x/utf8toutf16_test.c b/test/libc/x/utf8to16_test.c similarity index 74% rename from test/libc/x/utf8toutf16_test.c rename to test/libc/x/utf8to16_test.c index 5c0ad707f..34dd37e3c 100644 --- a/test/libc/x/utf8toutf16_test.c +++ b/test/libc/x/utf8to16_test.c @@ -23,19 +23,18 @@ #include "libc/testlib/testlib.h" #include "libc/x/x.h" -TEST(utf8toutf16, test) { - EXPECT_STREQ(u"hello☻♥", gc(utf8toutf16("hello☻♥", -1, 0))); - EXPECT_STREQ(u"hello☻♥hello☻♥h", gc(utf8toutf16("hello☻♥hello☻♥h", -1, 0))); - EXPECT_STREQ(u"hello☻♥hello☻♥hi", gc(utf8toutf16("hello☻♥hello☻♥hi", -1, 0))); +TEST(utf8to16, test) { + EXPECT_STREQ(u"hello☻♥", gc(utf8to16("hello☻♥", -1, 0))); + EXPECT_STREQ(u"hello☻♥hello☻♥h", gc(utf8to16("hello☻♥hello☻♥h", -1, 0))); + EXPECT_STREQ(u"hello☻♥hello☻♥hi", gc(utf8to16("hello☻♥hello☻♥hi", -1, 0))); EXPECT_STREQ(u"hello☻♥hello☻♥hello☻♥hello☻♥hello☻♥", - gc(utf8toutf16("hello☻♥hello☻♥hello☻♥hello☻♥hello☻♥", -1, 0))); - EXPECT_STREQ(u"hello--hello--h", gc(utf8toutf16("hello--hello--h", -1, 0))); - EXPECT_STREQ(u"hello--hello--hi", gc(utf8toutf16("hello--hello--hi", -1, 0))); + gc(utf8to16("hello☻♥hello☻♥hello☻♥hello☻♥hello☻♥", -1, 0))); + EXPECT_STREQ(u"hello--hello--h", gc(utf8to16("hello--hello--h", -1, 0))); + EXPECT_STREQ(u"hello--hello--hi", gc(utf8to16("hello--hello--hi", -1, 0))); EXPECT_STREQ(u"hello--hello--hello--hello--hello--", - gc(utf8toutf16("hello--hello--hello--hello--hello--", -1, 0))); + gc(utf8to16("hello--hello--hello--hello--hello--", -1, 0))); } -BENCH(utf8toutf16, bench) { - EZBENCH2("utf8toutf16", donothing, - free(utf8toutf16(kHyperion, kHyperionSize, 0))); +BENCH(utf8to16, bench) { + EZBENCH2("utf8to16", donothing, free(utf8to16(kHyperion, kHyperionSize, 0))); } diff --git a/test/libc/x/utf8to32_test.c b/test/libc/x/utf8to32_test.c new file mode 100644 index 000000000..c01dd60b5 --- /dev/null +++ b/test/libc/x/utf8to32_test.c @@ -0,0 +1,107 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or 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 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 "libc/mem/mem.h" +#include "libc/mem/shuffle.internal.h" +#include "libc/runtime/gc.internal.h" +#include "libc/stdio/rand.h" +#include "libc/testlib/ezbench.h" +#include "libc/testlib/hyperion.h" +#include "libc/testlib/testlib.h" +#include "libc/testlib/viewables.h" +#include "libc/x/x.h" + +TEST(utf8to32, test) { + EXPECT_STREQ(L"", gc(utf8to32(0, 0, 0))); + EXPECT_STREQ(L"", gc(utf8to32("", -1, 0))); + EXPECT_STREQ(L"hello", gc(utf8to32("hello", -1, 0))); +} + +TEST(utf8to32, poke) { + wchar_t *p = gc(utf8to32("hi", 2, 0)); + ASSERT_EQ('h', p[0]); + ASSERT_EQ('i', p[1]); + ASSERT_EQ(0, p[2]); +} + +TEST(utf32to8, poke) { + char *p = gc(utf32to8(L"hi", 2, 0)); + ASSERT_EQ('h', p[0]); + ASSERT_EQ('i', p[1]); + ASSERT_EQ(0, p[2]); +} + +TEST(utf8to32, testLargeAscii) { + EXPECT_STREQ(L"hellohellohelloz", gc(utf8to32("hellohellohelloz", -1, 0))); + EXPECT_STREQ(L"hellohellohellozhellohellohelloz", + gc(utf8to32("hellohellohellozhellohellohelloz", -1, 0))); +} + +TEST(utf32to8, testLargeAscii) { + EXPECT_STREQ("hellohellohelloz", gc(utf32to8(L"hellohellohelloz", -1, 0))); + EXPECT_STREQ("hellohellohellozhellohellohelloz", + gc(utf32to8(L"hellohellohellozhellohellohelloz", -1, 0))); +} + +TEST(utf8to32, testLargeThompsonPikeEncoded) { + EXPECT_STREQ(L"hellohellohello𝑧hellohellohelloz", + gc(utf8to32("hellohellohello𝑧hellohellohelloz", -1, 0))); + EXPECT_STREQ(L"hellohellohelloh𝑧ellohellohelloz", + gc(utf8to32("hellohellohelloh𝑧ellohellohelloz", -1, 0))); + EXPECT_STREQ( + L"𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑧", + gc(utf8to32( + "𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑧", + -1, 0))); +} + +TEST(utf32to8, testLargeThompsonPikeEncoded) { + EXPECT_STREQ("hellohellohello𝑧hellohellohelloz", + gc(utf32to8(L"hellohellohello𝑧hellohellohelloz", -1, 0))); + EXPECT_STREQ("hellohellohelloh𝑧ellohellohelloz", + gc(utf32to8(L"hellohellohelloh𝑧ellohellohelloz", -1, 0))); + EXPECT_STREQ( + "𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑧", + gc(utf32to8( + L"𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑕𝑒𝑙𝑙𝑜𝑧", + -1, 0))); +} + +char *GenerateBranchyUtf8Text(size_t *out_n) { + char *p; + size_t n; + wchar_t *q = gc(utf8to32(kViewables, kViewablesSize, &n)); + shuffle(lemur64, q, n); + p = utf32to8(q, n, &n); + if (out_n) *out_n = n; + return p; +} + +/* + * utf8to32 l: 5,806c 1,875ns m: 5,863c 1,894ns + * utf32to8 l: 104,671c 33,808ns m: 103,803c 33,528ns + * utf8to32 [branchy] l: 746,846c 241,227ns m: 747,312c 241,377ns + */ +BENCH(utf8to32, bench) { + EZBENCH2("utf8to32", donothing, free(utf8to32(kHyperion, kHyperionSize, 0))); + size_t n; + wchar_t *h = gc(utf8to32(kHyperion, kHyperionSize, &n)); + EZBENCH2("utf32to8", donothing, free(utf32to8(h, n, 0))); + char *p = gc(GenerateBranchyUtf8Text(&n)); + EZBENCH2("utf8to32 [branchy]", donothing, free(utf8to32(p, n, 0))); +} diff --git a/third_party/python/Modules/getpath.c b/third_party/python/Modules/getpath.c index 04c096279..837f33dbd 100644 --- a/third_party/python/Modules/getpath.c +++ b/third_party/python/Modules/getpath.c @@ -664,7 +664,7 @@ Py_GetProgramFullPath(void) { static bool once; if (_cmpxchg(&once, false, true)) { - progpath = utf8toutf32(GetProgramExecutableName(), -1, 0); + progpath = utf8to32(GetProgramExecutableName(), -1, 0); __cxa_atexit(free, progpath, 0); } return progpath; diff --git a/third_party/python/Modules/posixmodule.c b/third_party/python/Modules/posixmodule.c index fd404f1c1..bf4c0a2dc 100644 --- a/third_party/python/Modules/posixmodule.c +++ b/third_party/python/Modules/posixmodule.c @@ -3399,7 +3399,7 @@ os__getfinalpathname_impl(PyObject *module, PyObject *path) int result_length; PyObject *result; if (!(path_utf8 = PyUnicode_AsUTF8String(path))) return 0; - path_utf16 = gc(utf8toutf16(PyBytes_AS_STRING(path_utf8), PyBytes_GET_SIZE(path_utf8), 0)); + path_utf16 = gc(utf8to16(PyBytes_AS_STRING(path_utf8), PyBytes_GET_SIZE(path_utf8), 0)); Py_DECREF(path_utf8); if (!path_utf16) return PyErr_NoMemory(); Py_BEGIN_ALLOW_THREADS @@ -3439,7 +3439,7 @@ os__getfinalpathname_impl(PyObject *module, PyObject *path) buf_size = result_length; target_path = tmp; } - final8 = gc(utf16toutf8(target_path, result_length, &final8z)); + final8 = gc(utf16to8(target_path, result_length, &final8z)); result = PyUnicode_FromStringAndSize(final8, final8z); cleanup: if (target_path != buf) { @@ -3537,7 +3537,7 @@ os__getvolumepathname_impl(PyObject *module, PyObject *path) size_t buflen; bool32 ret; if (!(path_utf8 = PyUnicode_AsUTF8String(path))) return 0; - path_utf16 = gc(utf8toutf16(PyBytes_AS_STRING(path_utf8), PyBytes_GET_SIZE(path_utf8), &buflen)); + path_utf16 = gc(utf8to16(PyBytes_AS_STRING(path_utf8), PyBytes_GET_SIZE(path_utf8), &buflen)); Py_DECREF(path_utf8); if (!path_utf16) return PyErr_NoMemory(); buflen += 1; @@ -3554,7 +3554,7 @@ os__getvolumepathname_impl(PyObject *module, PyObject *path) Py_SAFE_DOWNCAST(buflen, size_t, uint32_t)); Py_END_ALLOW_THREADS if (ret) { - mountpath8 = gc(utf16toutf8(mountpath, -1, &buflen)); + mountpath8 = gc(utf16to8(mountpath, -1, &buflen)); result = PyUnicode_FromStringAndSize(mountpath8, buflen); } else { result = win32_error_object("_getvolumepathname", path); diff --git a/third_party/python/Python/sysmodule.c b/third_party/python/Python/sysmodule.c index ff5768aec..4537c638c 100644 --- a/third_party/python/Python/sysmodule.c +++ b/third_party/python/Python/sysmodule.c @@ -12,9 +12,9 @@ #include "libc/runtime/gc.internal.h" #include "libc/runtime/runtime.h" #include "libc/stdio/stdio.h" +#include "libc/str/locale.h" #include "libc/sysv/consts/exit.h" #include "libc/sysv/consts/s.h" -#include "libc/str/locale.h" #include "libc/x/x.h" #include "third_party/python/Include/abstract.h" #include "third_party/python/Include/boolobject.h" @@ -1044,7 +1044,7 @@ sys_getwindowsversion(PyObject *self) PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMinorVersion)); PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwBuildNumber)); PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwPlatformId)); - PyStructSequence_SET_ITEM(version, pos++, PyUnicode_FromString(gc(utf16toutf8(ver.szCSDVersion,-1,0)))); + PyStructSequence_SET_ITEM(version, pos++, PyUnicode_FromString(gc(utf16to8(ver.szCSDVersion,-1,0)))); PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMajor)); PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMinor)); PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wSuiteMask)); diff --git a/third_party/python/launch.c b/third_party/python/launch.c index 485468eed..40b611672 100644 --- a/third_party/python/launch.c +++ b/third_party/python/launch.c @@ -125,7 +125,7 @@ main(int argc, char *argv[]) Py_LimitedPath(); if (!(a = PyList_New(argc))) return 127; for (i = 0; i < argc; ++i) { - if (!(w = utf8toutf32(argv[i], -1, &n))) return 126; + if (!(w = utf8to32(argv[i], -1, &n))) return 126; if (!(s = PyUnicode_FromWideChar(w, n))) return 125; PyList_SetItem(a, i, s); free(w); diff --git a/third_party/python/pycomp.c b/third_party/python/pycomp.c index 8ce97e3cf..fca5985e6 100644 --- a/third_party/python/pycomp.c +++ b/third_party/python/pycomp.c @@ -17,11 +17,11 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/assert.h" -#include "libc/intrin/bits.h" #include "libc/calls/calls.h" #include "libc/calls/struct/iovec.h" #include "libc/calls/struct/stat.h" #include "libc/fmt/conv.h" +#include "libc/intrin/bits.h" #include "libc/log/check.h" #include "libc/log/log.h" #include "libc/runtime/gc.internal.h" @@ -125,7 +125,7 @@ main(int argc, char *argv[]) Py_IgnoreEnvironmentFlag++; Py_FrozenFlag++; /* Py_VerboseFlag++; */ - Py_SetProgramName(gc(utf8toutf32(argv[0], -1, 0))); + Py_SetProgramName(gc(utf8to32(argv[0], -1, 0))); _Py_InitializeEx_Private(1, 0); name = gc(xjoinpaths("/zip/.python", StripComponents(inpath, 3))); code = Py_CompileStringExFlags(p, name, Py_file_input, NULL, optimize); diff --git a/tool/build/ar.c b/tool/build/ar.c index 9f8314ce0..9c75d5b29 100644 --- a/tool/build/ar.c +++ b/tool/build/ar.c @@ -301,7 +301,7 @@ int main(int argc, char *argv[]) { } // write output archive - CHECK_NE(-1, (outfd = open(outpath, O_WRONLY | O_TRUNC | O_CREAT, 0644))); + CHECK_NE(-1, (outfd = creat(outpath, 0644))); ftruncate(outfd, outsize); if ((outsize = writev(outfd, iov, ARRAYLEN(iov))) == -1) { reason = "writev1 failed"; diff --git a/tool/decode/scrubdox.c b/tool/decode/scrubdox.c index ecf9c08d4..8638c68e9 100644 --- a/tool/decode/scrubdox.c +++ b/tool/decode/scrubdox.c @@ -162,14 +162,14 @@ int main(int argc, char *argv[]) { } xn += 1000; L = xmalloc((yn + 2) * sizeof(*L)); - L[0] = utf8toutf16(gc(xasprintf(" %*s ", xn, " ")), -1, 0); + L[0] = utf8to16(gc(xasprintf(" %*s ", xn, " ")), -1, 0); for (y = 0; y < yn; ++y) { s = xasprintf(" %s%*s ", T[y], xn - n, " "); - L[y + 1] = utf8toutf16(s, -1, 0); + L[y + 1] = utf8to16(s, -1, 0); free(T[y]); free(s); } - L[yn + 2 - 1] = utf8toutf16(gc(xasprintf(" %*s ", xn, " ")), -1, 0); + L[yn + 2 - 1] = utf8to16(gc(xasprintf(" %*s ", xn, " ")), -1, 0); free(T); V = xcalloc((yn + 1) * (xn + 1), 1); for (y = 1; y <= yn; ++y) { @@ -185,7 +185,7 @@ int main(int argc, char *argv[]) { } } for (y = 1; y + 1 < yn; ++y) { - s = utf16toutf8(L[y], -1, 0); + s = utf16to8(L[y], -1, 0); n = strlen(s); while (n && s[n - 1] == ' ') s[n - 1] = 0, --n; puts(s + 1);