diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-01-21 03:03:58 +0100 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-01-21 03:03:58 +0100 |
commit | 4f93f935dc7a981ca073a322425c3f5929ffb644 (patch) | |
tree | 4460586408ec7fdfcecf3ba4584f0435067125a6 | |
parent | 72ea25a4d73e3e026366d4165f5bc4ec9e7418cb (diff) |
Support line- & column-based match locations
48 files changed, 6946 insertions, 15 deletions
@@ -17,8 +17,10 @@ #include "cbs.h" #include "src/compat.h" -#define CC "cc" -#define CFLAGS "-Wall", "-Wextra", "-Wpedantic", "-Werror", "-pipe" +#define CC "cc" +#define CFLAGS \ + "-Wall", "-Wextra", "-Wpedantic", "-Werror", "-pipe", \ + "-Ivendor/librune/include" #define CFLAGS_DEBUG "-DGRAB_DEBUG", "-g", "-ggdb3" #ifdef __APPLE__ # define CFLAGS_RELEASE "-O3" @@ -88,8 +90,20 @@ main(int argc, char **argv) cmdprc(c); } } else { + cmd_t c = {0}; struct strv sv = {0}; + if (chdir("./vendor/librune/") == -1) + die("chdir: ./vendor/librune/"); + + cmdadd(&c, CC, "-lpthread", "-o", "make", "make.c"); + cmdprc(c); + cmdadd(&c, "./make"); + cmdprc(c); + + if (chdir("../../") == -1) + die("chdir: ../../"); + env_or_default(&sv, "CC", CC); if (dflag) env_or_default(&sv, "CFLAGS", CFLAGS, CFLAGS_DEBUG); @@ -114,7 +128,8 @@ main(int argc, char **argv) cmdadd(&c, "-lpcre2-posix"); strvfree(&pc); } - cmdadd(&c, "-o", i == 0 ? "grab" : "git-grab", "src/grab.c"); + cmdadd(&c, "-o", i == 0 ? "grab" : "git-grab", "src/grab.c", + "vendor/librune/librune.a"); cmdprc(c); } @@ -22,6 +22,8 @@ # endif #endif +#include <gbrk.h> + #include "compat.h" #include "da.h" @@ -32,7 +34,9 @@ warn(__VA_ARGS__); \ rv = EXIT_FAILURE; \ } while (0) -#define streq(a, b) (!strcmp(a, b)) + +#define streq(a, b) (!strcmp(a, b)) +#define memeq(a, b, n) (!memcmp(a, b, n)) #define EEARLY "Input string terminated prematurely" @@ -80,7 +84,7 @@ static bool xisspace(char); static char *xstrchrnul(const char *, char); static int filecnt, rv; -static bool cflag, nflag, sflag, Uflag, zflag; +static bool bflag, cflag, nflag, sflag, Uflag, zflag; static bool fflag = GIT_GRAB; static put_func putf = putm; @@ -96,9 +100,9 @@ usage(const char *s) { fprintf(stderr, #if GIT_GRAB - "Usage: %s [-s | -z] [-cnU] pattern [glob ...]\n" + "Usage: %s [-s | -z] [-bcnU] pattern [glob ...]\n" #else - "Usage: %s [-s | -z] [-cfnU] pattern [file ...]\n" + "Usage: %s [-s | -z] [-bcfnU] pattern [file ...]\n" #endif " %s -h\n", s, s); @@ -111,6 +115,7 @@ main(int argc, char **argv) int opt; struct ops ops; struct option longopts[] = { + {"byte-offset", no_argument, nullptr, 'b'}, {"color", no_argument, nullptr, 'c'}, #if GIT_GRAB {"filenames", no_argument, nullptr, 'f'}, @@ -128,9 +133,9 @@ main(int argc, char **argv) size_t len; ssize_t nr; FILE *flist; - const char *opts = "chnsUz"; + const char *opts = "bchnsUz"; #else - const char *opts = "cfhnsUz"; + const char *opts = "bcfhnsUz"; #endif argv[0] = basename(argv[0]); @@ -141,6 +146,9 @@ main(int argc, char **argv) while ((opt = getopt_long(argc, argv, opts, longopts, nullptr)) != -1) { switch (opt) { + case 'b': + bflag = true; + break; case 'c': cflag = true; break; @@ -410,6 +418,13 @@ void putm(struct sv sv, regmatch_t *rm, const char *filename) { static const char *fn, *ln, *ma, *se; + static struct { + const char8_t *p; + size_t col, row; + } pos = { + .col = 1, + .row = 1, + }; if (cflag && !fn) { char *optstr; @@ -469,11 +484,36 @@ putm(struct sv sv, regmatch_t *rm, const char *filename) if (fflag || filecnt > 1) { char sep = zflag ? '\0' : ':'; printf("\33[%sm%s\33[0m" /* filename */ - "\33[%sm%c\33[0m" /* separator */ - "\33[%sm%td\33[0m" /* byte offset */ - "\33[%sm%c\33[0m" /* separator */ - , - fn, filename, se, sep, ln, sv.p - sv.bp, se, sep); + "\33[%sm%c\33[0m", /* separator */ + fn, filename, se, sep); + + if (bflag) { + printf("\33[%sm%td\33[0m" /* byte offset */ + "\33[%sm%c\33[0m", /* separator */ + ln, sv.p - sv.bp, se, sep); + } else { + size_t len; + struct u8view v; + + if (!pos.p) + pos.p = (char8_t *)sv.bp; + len = (char8_t *)sv.p - pos.p; + + while (u8gnext(&v, &pos.p, &len)) { + if (*v.p == '\n' || memeq(v.p, "\r\n", 2)) { + pos.col = 1; + pos.row++; + } else + pos.col++; + } + + printf("\33[%sm%zu\33[0m" /* row */ + "\33[%sm%c\33[0m" /* separator */ + "\33[%sm%zu\33[0m" /* column */ + "\33[%sm%c\33[0m" /* separator */ + , + ln, pos.row, se, sep, ln, pos.col, se, sep); + } } if (rm) { fwrite(sv.p, 1, rm->rm_so, stdout); @@ -491,9 +531,38 @@ putm_nc(struct sv sv, regmatch_t *rm, const char *filename) { (void)rm; + static struct { + const char8_t *p; + size_t col, row; + } pos = { + .col = 1, + .row = 1, + }; + if (fflag || filecnt > 1) { char sep = zflag ? '\0' : ':'; - printf("%s%c%td%c", filename, sep, sv.p - sv.bp, sep); + printf("%s%c", filename, sep); + + if (bflag) + printf("%td%c", sv.p - sv.bp, sep); + else { + size_t len; + struct u8view v; + + if (!pos.p) + pos.p = (char8_t *)sv.bp; + len = (char8_t *)sv.p - pos.p; + + while (u8gnext(&v, &pos.p, &len)) { + if (*v.p == '\n' || memeq(v.p, "\r\n", 2)) { + pos.col = 1; + pos.row++; + } else + pos.col++; + } + + printf("%zu%c%zu%c", pos.row, sep, pos.col, sep); + } } fwrite(sv.p, 1, sv.len, stdout); if (!(sflag && sv.p[sv.len - 1] == '\n')) diff --git a/vendor/librune/.gitignore b/vendor/librune/.gitignore new file mode 100644 index 0000000..457da10 --- /dev/null +++ b/vendor/librune/.gitignore @@ -0,0 +1,12 @@ +.cache/ +test/gbrk +*.[ao] +a.out +compile_commands.json +failures +main +make +main.c +Makefile +NOTE-TO-SELF +test.c diff --git a/vendor/librune/LICENSE b/vendor/librune/LICENSE new file mode 100644 index 0000000..b946725 --- /dev/null +++ b/vendor/librune/LICENSE @@ -0,0 +1,14 @@ +BSD Zero Clause License + +Copyright © 2024 Thomas Voss + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +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. diff --git a/vendor/librune/README.md b/vendor/librune/README.md new file mode 100644 index 0000000..fa98774 --- /dev/null +++ b/vendor/librune/README.md @@ -0,0 +1,33 @@ +# librune — easy Unicode in a post-ASCII world + +Librune is a C library that aims to make interacting with Unicode and +UTF-8 easy in C. There are no plans at the moment to support UTF-16 or +-32, but they may be supported if such a usecase ever comes up. + +This library has been tested to build and work properly on both C99 and +C23. + + +## Terminology + +This library uses the term ‘rune’ to refer to a single Unicode-codepoint, +and defines a `rune` datatype which is an unsigned integer type which +represents a rune (shocker). + + +## Headers + +This library contains the following headers: + +1. `gbrk.h` — grapheme-iteration functions +2. `rune.h` — rune-constants, -macros, and -functions +3. `utf8.h` — UTF-8 encoding, decoding, iteration, etc. + + +## Installation + +There is no ‘intended’ way in which this library should be installed, +used, and distributed. This library is primarily written for myself, and +I prefer to vendor it in my projects. You may choose to install it as a +shared and/or static library. You’re an engineer aren’t you? Figure it +out. diff --git a/vendor/librune/cbs.h b/vendor/librune/cbs.h new file mode 100644 index 0000000..bcf82df --- /dev/null +++ b/vendor/librune/cbs.h @@ -0,0 +1,939 @@ +/* Single-header library to help write build scripts in C. This library is + POSIX compliant, so it should work on all respectible UNIX-like systems. + + You can find the CBS git repository at https://git.sr.ht/~mango/cbs and you + can include this in your project with the following command: + + $ wget 'https://git.sr.ht/~mango/cbs/blob/master/cbs.h' + + This library is licensed under the 0-Clause BSD license, and as such you may + do whatever you want to it, however you want to it, whenever you want. You + are encouraged in fact to modify this library to suit your specific usecase. + + All functions and macros are documented. You can figure out the API pretty + easily by just reading the comments in this file. + + In many cases you may want to be able to execute commands on multiple threads + to speed up compilation, such as the -j option when using Make. Functions + for creating and using thread pools will be made available if the CBS_PTHREAD + macro is defined before including this file. Do note that on POSIX platforms + it will require linking to the pthreads library when bootstrapping the build + script. + + This file does not support C89. Fuck C89, that shit is ancient. Move on. + + IMPORTANT NOTE: Any identifiers prefixed with an underscore (e.g. ‘_rebuild’) + are meant for internal use only and you should not touch them unless you know + what you’re doing. + + IMPORTANT NOTE: All the functions and macros in this library will terminate + the program on error. If this is undesired behavior, feel free to edit the + functions to return errors. + + There are a few exceptions to the above rule, and they are documented. + + This library does not aim to ever support Windows */ + +#ifndef C_BUILD_SYSTEM_H +#define C_BUILD_SYSTEM_H + +#ifdef __GNUC__ +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-function" +#endif + +/* Assert that the user is building for a supported platform. The only portable + way to check for POSIX is to validate that unistd.h exists. This is only + possible without compiler extensions in C23 (although some compilers support + it as an extension in earlier editions), so people compiling for pre-C23 + might not get this error if on a bad platform, and may end up being a bit + confused. + + It’s just a maybe though, this is nothing more than a sanity check for the + users sake. */ +#if defined(__has_include) && !__has_include(<unistd.h>) +# error "Non-POSIX platform detected" +#endif + +#ifdef __APPLE__ +# define st_mtim st_mtimespec +#endif + +#include <sys/stat.h> +#include <sys/wait.h> + +#include <errno.h> +#include <libgen.h> +#include <limits.h> +#ifdef CBS_PTHREAD +# include <pthread.h> +#endif +#include <stdarg.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <wordexp.h> + +/* C23 changed a lot so we want to check for it */ +#if __STDC_VERSION__ >= 202000 +# define CBS_IS_C23 1 +#endif + +/* Some C23 compat. In C23 booleans are actual keywords, and the noreturn + attribute is different. */ +#if CBS_IS_C23 +# define noreturn [[noreturn]] +#else +# include <stdbool.h> +# include <stdnoreturn.h> +#endif + +/* Give helpful diagnostics when people use die() incorrectly on GCC. C23 + introduced C++ attribute syntax, so we need a check for that too. */ +#ifdef __GNUC__ +# if CBS_IS_C23 +# define ATTR_FMT [[gnu::format(printf, 1, 2)]] +# else +# define ATTR_FMT __attribute__((format(printf, 1, 2))) +# endif +#else +# define ATTR_FMT +#endif + +/* Clang defines this attribute, and while it does nothing it does serve as + good documentation. */ +#ifndef _Nullable +# define _Nullable +#endif + +/* Convert the given variadic arguments to a string array */ +#define _vtoa(...) ((char *[]){__VA_ARGS__}) + +/* Internal global versions of argc and argv, so our functions and macros can + access them from anywhere. */ +static int _cbs_argc; +static char **_cbs_argv; + +/* A vector of strings used to accumulate output of functions such as pcquery(). + The array of strings buf has length len, and is not null-terminated. You + should always zero-initialize variables of this type. */ +struct strv { + char **buf; + size_t len; +}; + +/* Free and zero a string vector. Because this function zeros the structure, it + is safe to reuse the vector after this function is called. */ +static void strvfree(struct strv *); + +/* A wrapper function around realloc(). It behaves exactly the same except + instead of taking a buffer size as an argument, it takes a count n of + elements, and a size m of each element. This allows it to properly check for + overflow, and errors if overflow would occur. */ +static void *bufalloc(void *_Nullable, size_t n, size_t m); + +/* Error reporting functions. The die() function takes the same arguments as + printf() and prints the corresponding string to stderr. It also prefixes the + string with the command name followed by a colon, and suffixes the string + with a colon and the error string returned from strerror(). + + If you want to print just the error message and no custom text, NULL may be + passed to die(). NULL should not be passed to diex(). + + diex() is the same as die() but does not print a strerror() error string. */ +ATTR_FMT noreturn static void die(const char *_Nullable, ...); +ATTR_FMT noreturn static void diex(const char *, ...); + +/* Initializes some data required for this header to work properly. This should + be the first thing called in main() with argc and argv passed. */ +static void cbsinit(int, char **); + +/* Get the number of items in the array a */ +#define lengthof(a) (sizeof(a) / sizeof(*(a))) + +/* Struct representing a CLI command that various functions act on. You should + always zero-initialize variables of this type before use. + + After executing a command, you can reuse the already allocated buffer this + command holds by calling cmdclr(). When you’re really done with an object of + this type, remember to call free() on ._argv. + + The ._argv field is a NULL-terminated list of command arguments of length + ._len. You may safely read from both of these fields but they should NOT be + modified without use of cmdadd() and cmdaddv(). */ +typedef struct { + char **_argv; + size_t _len, _cap; +} cmd_t; + +/* Returns whether or not a binary of the given name exists in the users + environment as defined by $PATH. */ +static bool binexists(const char *); + +/* cmdadd() adds the variadic string arguments to the given command. + Alternatively, the cmdaddv() function adds the n strings pointed to by p to + the given command. */ +static void cmdaddv(cmd_t *, char **p, size_t n); +#define cmdadd(cmd, ...) \ + cmdaddv(cmd, _vtoa(__VA_ARGS__), lengthof(_vtoa(__VA_ARGS__))) + +/* Clear (but not free) the command c. Useful for reusing the same command + struct to minimize allocations. */ +static void cmdclr(cmd_t *c); + +/* The cmdexec() function executes the given command and waits for it to + terminate, returning its exit code. The cmdexeca() function executes the + given command and returns immediately, returning its process ID. + + The cmdexecb() function is like cmdexec() except it writes the given commands + standard output to the character buffer pointed to by p. It also stores the + size of the output in *n. The character buffer p is null-terminated. If the + given command produces no output to the standard output, p will be set to + NULL. + + cmdexec() and cmdexecb() have the same return values as cmdwait(). */ +static int cmdexec(cmd_t); +static pid_t cmdexeca(cmd_t); +static int cmdexecb(cmd_t, char **p, size_t *n); + +/* Wait for the process with the given PID to terminate, and return its exit + status. If the process was terminated by a signal 256 is returned. */ +static int cmdwait(pid_t); + +/* Write a representation of the given command to the given file stream. This + can be used to mimick the echoing behavior of make(1). The cmdput() function + is a nice convenience function so you can avoid writing ‘stdout’ all the + time. */ +static void cmdput(cmd_t); +static void cmdputf(FILE *, cmd_t); + +/* Expand the environment variable s using /bin/sh expansion rules and append + the results in the given string vector. If the environment variable is NULL + or empty, then store the strings specified by the array p of length n. + + env_or_default() is the same as env_or_defaultv() but you provide p as + variadic arguments. + + If the pointer p is null, then no default value is appended to the given + string vector when the environment variable is not present. */ +static void env_or_defaultv(struct strv *, const char *s, char *_Nullable *p, + size_t n); +#define env_or_default(sv, s, ...) \ + env_or_defaultv((sv), (s), _vtoa(__VA_ARGS__), lengthof(_vtoa(__VA_ARGS__))) + +/* Returns if a file exists at the given path. A return value of false may also + mean you don’t have the proper file access permissions, which will also set + errno. */ +static bool fexists(const char *); + +/* Compare the modification dates of the two named files. + + A return value >0 means the LHS is newer than the RHS. + A return value <0 means the LHS is older than the RHS. + A return value of 0 means the LHS and RHS have the same modification date. + + The fmdnewer() and fmdolder() functions are wrappers around fmdcmp() that + return true when the LHS is newer or older than the RHS respectively. */ +static int fmdcmp(const char *, const char *); +static bool fmdolder(const char *, const char *); +static bool fmdnewer(const char *, const char *); + +/* Report if any of n files specified by p render the file base outdated. If + the file base does not exist, this function returns true. You will typically + call this with a compiled program as base, and C source files as p. The + macro foutdated() is a wrapper around foutdatedv() that allows you to specify + the sources to base as variadic arguments instead of as an array. */ +static bool foutdatedv(const char *base, const char **p, size_t n); +#define foutdated(s, ...) \ + foutdatedv(s, (const char **)_vtoa(__VA_ARGS__), \ + lengthof(_vtoa(__VA_ARGS__))) + +/* Rebuild the build script if it has been modified, and execute the newly built + script. You should call the rebuild() macro at the very beginning of main(), + but right after cbsinit(). You probably don’t want to call _rebuild() + directly. */ +static void _rebuild(char *); +#define rebuild() _rebuild(__FILE__) + +/* Get the number of available CPUs, or -1 on error. This function also returns + -1 if the _SC_NPROCESSORS_ONLN flag to sysconf(3) is not available. In that + case, errno will not be set. */ +static int nproc(void); + +/* Append the arguments returned by an invokation of pkg-config for the library + lib to the given string vector. The flags argument is one-or-more of the + flags in the pkg_config_flags enum bitwise-ORed together. + + If PKGC_CFLAGS is specified, call pkg-config with ‘--cflags’. + If PKGC_LIBS is specified, call pkg-config with ‘--libs’. + + This function returns true on success and false if pkg-config is not found on + the system. To check for pkg-configs existance, you can use the binexists() + function. */ +static bool pcquery(struct strv *, char *lib, int flags); +enum pkg_config_flags { + PKGC_LIBS = 1 << 0, + PKGC_CFLAGS = 1 << 1, +}; + +#ifdef CBS_PTHREAD + +/* A tfunc_t represents a function to be executed by a threads in a thread pool. + It takes an argument in the form of a void * and returns nothing. */ +typedef void (*tfunc_t)(void *); + +/* A tfunc_free_t represents a function which frees the argument passed to a + tfunc_t function. */ +typedef void (*tfree_func_t)(void *); + +/* A thread pool job queue. Meant for internal-use only. */ +struct _tjob { + void *arg; + tfunc_t fn; + tfree_func_t free; + struct _tjob *next; +}; + +/* A basic thread pool. None of its fields should really be touched. */ +typedef struct { + bool _stop; + size_t _tcnt, _left; + pthread_t *_thrds; + pthread_cond_t _cnd; + pthread_mutex_t _mtx; + struct _tjob *_head, *_tail; +} tpool_t; + +/* Initialize and destroy a thread pool. The tpinit() function initializes the + given thread pool and creates n threads ready to execute work. The tpfree() + function should be called after a thread pool has been used to release all + resources used by the thread pool. */ +static void tpinit(tpool_t *, size_t n); +static void tpfree(tpool_t *); + +/* Wait for all jobs on the given thread pool to be executed. Note that this + function does not destroy the threads or free any resources — those are tasks + for the tpfree() function. */ +static void tpwait(tpool_t *); + +/* Enqueue and dequeue jobs to the thread pools job queue. The tpenq() function + is threadsafe while the _tpdeq() function is not (so don’t use it). When + calling the tpenq() function, the function fn will be queued to be executed + by a thread in the thread pool with the argument arg. If the given argument + needs to be deallocated after the job completes, you can pass the free + argument which will be called with the given argument after use. If free is + NULL, it will be ignored. + + The free() function is a valid argument to the free parameter. */ +static void tpenq(tpool_t *, tfunc_t fn, void *arg, + tfree_func_t _Nullable free); +static struct _tjob *_tpdeq(tpool_t *); + +#endif /* CBS_PTHREAD */ + +/* BEGIN DEFINITIONS */ + +void +strvfree(struct strv *v) +{ + free(v->buf); + *v = (struct strv){0}; +} + +void * +bufalloc(void *p, size_t n, size_t m) +{ + if (n && SIZE_MAX / n < m) { + errno = EOVERFLOW; + die(__func__); + } + + if (!(p = realloc(p, n * m))) + die(__func__); + return p; +} + +void +die(const char *fmt, ...) +{ + int e = errno; + va_list ap; + + va_start(ap, fmt); + flockfile(stderr); + fprintf(stderr, "%s: ", *_cbs_argv); + if (fmt) { + vfprintf(stderr, fmt, ap); + fprintf(stderr, ": "); + } + fprintf(stderr, "%s\n", strerror(e)); + exit(EXIT_FAILURE); +} + +void +diex(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + flockfile(stderr); + fprintf(stderr, "%s: ", *_cbs_argv); + vfprintf(stderr, fmt, ap); + fputc('\n', stderr); + exit(EXIT_FAILURE); +} + +void +cbsinit(int argc, char **argv) +{ + _cbs_argc = argc; + _cbs_argv = bufalloc(NULL, argc, sizeof(char *)); + for (int i = 0; i < argc; i++) { + if (!(_cbs_argv[i] = strdup(argv[i]))) { + /* We might not have set _cbs_argv[0] yet, so we can’t use die() */ + fprintf(stderr, "%s: strdup: %s\n", *argv, strerror(errno)); + exit(EXIT_FAILURE); + } + } +} + +static size_t +_next_powerof2(size_t n) +{ + if (n && !(n & (n - 1))) + return n; + + n--; + for (size_t i = 1; i < sizeof(size_t); i <<= 1) + n |= n >> i; + return n + 1; +} + +bool +binexists(const char *name) +{ + char *p, *path; + + if (!(path = getenv("PATH"))) + diex("PATH environment variable not found"); + + if (!(path = strdup(path))) + die("strdup"); + p = strtok(path, ":"); + while (p) { + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/%s", p, name); + if (fexists(buf)) { + free(path); + return true; + } + + p = strtok(NULL, ":"); + } + + free(path); + return false; +} + +void +cmdaddv(cmd_t *cmd, char **xs, size_t n) +{ + if (cmd->_len + n >= cmd->_cap) { + cmd->_cap = _next_powerof2(cmd->_len + n) + 2; + cmd->_argv = bufalloc(cmd->_argv, cmd->_cap, sizeof(char *)); + } + + memcpy(cmd->_argv + cmd->_len, xs, n * sizeof(*xs)); + cmd->_len += n; + cmd->_argv[cmd->_len] = NULL; +} + +void +cmdclr(cmd_t *c) +{ + c->_len = 0; + *c->_argv = NULL; +} + +int +cmdexec(cmd_t c) +{ + return cmdwait(cmdexeca(c)); +} + +pid_t +cmdexeca(cmd_t c) +{ + pid_t pid; + + switch (pid = fork()) { + case -1: + die("fork"); + case 0: + execvp(*c._argv, c._argv); + die("execvp: %s", *c._argv); + } + + return pid; +} + +int +cmdexecb(cmd_t c, char **p, size_t *n) +{ + enum { + FD_R, + FD_W, + }; + pid_t pid; + int fds[2]; + char *buf; + size_t len, blksize; + struct stat sb; + + if (pipe(fds) == -1) + die("pipe"); + + switch (pid = fork()) { + case -1: + die("fork"); + case 0: + close(fds[FD_R]); + if (dup2(fds[FD_W], STDOUT_FILENO) == -1) + die("dup2"); + execvp(*c._argv, c._argv); + die("execvp: %s", *c._argv); + } + + close(fds[FD_W]); + + buf = NULL; + len = 0; + + blksize = fstat(fds[FD_R], &sb) == -1 ? BUFSIZ : sb.st_blksize; + for (;;) { + /* This can maybe somewhere somehow break some system. I do not care */ + char tmp[blksize]; + ssize_t nr; + + if ((nr = read(fds[FD_R], tmp, blksize)) == -1) + die("read"); + if (!nr) + break; + buf = bufalloc(buf, len + nr + 1, sizeof(char)); + memcpy(buf + len, tmp, nr); + len += nr; + } + + close(fds[FD_R]); + if (buf) + buf[len] = 0; + *p = buf; + *n = len; + return cmdwait(pid); +} + +int +cmdwait(pid_t pid) +{ + for (;;) { + int ws; + if (waitpid(pid, &ws, 0) == -1) + die("waitpid"); + + if (WIFEXITED(ws)) + return WEXITSTATUS(ws); + + if (WIFSIGNALED(ws)) + return 256; + } +} + +/* import shlex + + s = '#define SHELL_SAFE "' + for c in map(chr, range(128)): + if not shlex._find_unsafe(c): + s += c + print(s + '"') */ +#define SHELL_SAFE \ + "%+,-./0123456789:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz" + +void +cmdput(cmd_t c) +{ + cmdputf(stdout, c); +} + +void +cmdputf(FILE *stream, cmd_t cmd) +{ + flockfile(stream); + for (size_t i = 0; i < cmd._len; i++) { + bool safe = true; + char *p, *q; + + p = q = cmd._argv[i]; + for (; *q; q++) { + if (!strchr(SHELL_SAFE, *q)) { + safe = false; + break; + } + } + + if (safe) + fputs(p, stream); + else { + putc('\'', stream); + for (q = p; *q; q++) { + if (*q == '\'') + fputs("'\"'\"'", stream); + else + putc(*q, stream); + } + putc('\'', stream); + } + + putc(i == cmd._len - 1 ? '\n' : ' ', stream); + } + funlockfile(stream); +} + +void +env_or_defaultv(struct strv *sv, const char *s, char **p, size_t n) +{ + wordexp_t we; + const char *ev; + + if ((ev = getenv(s)) && *ev) { + switch (wordexp(ev, &we, WRDE_NOCMD)) { + case WRDE_BADCHAR: + case WRDE_BADVAL: + case WRDE_SYNTAX: + errno = EINVAL; + die("wordexp"); + case WRDE_NOSPACE: + errno = ENOMEM; + die("wordexp"); + } + + p = we.we_wordv; + n = we.we_wordc; + } else if (!p) + return; + + sv->buf = bufalloc(sv->buf, sv->len + n, sizeof(*sv->buf)); + for (size_t i = 0; i < n; i++) { + if (!(sv->buf[sv->len + i] = strdup(p[i]))) + die("strdup"); + } + sv->len += n; + + if (ev && *ev) + wordfree(&we); +} + +bool +fexists(const char *f) +{ + return !access(f, F_OK); +} + +int +fmdcmp(const char *lhs, const char *rhs) +{ + struct stat sbl, sbr; + + if (stat(lhs, &sbl) == -1) + die("%s", lhs); + if (stat(rhs, &sbr) == -1) + die("%s", rhs); + + return sbl.st_mtim.tv_sec == sbr.st_mtim.tv_sec + ? sbl.st_mtim.tv_nsec - sbr.st_mtim.tv_nsec + : sbl.st_mtim.tv_sec - sbr.st_mtim.tv_sec; +} + +bool +fmdnewer(const char *lhs, const char *rhs) +{ + return fmdcmp(lhs, rhs) > 0; +} + +bool +fmdolder(const char *lhs, const char *rhs) +{ + return fmdcmp(lhs, rhs) < 0; +} + +bool +foutdatedv(const char *src, const char **deps, size_t n) +{ + if (!fexists(src)) + return true; + for (size_t i = 0; i < n; i++) { + if (fmdolder(src, deps[i])) + return true; + } + return false; +} + +static char * +_getcwd(void) +{ + char *buf = NULL; + size_t n = 0; + + for (;;) { + n += PATH_MAX; + buf = bufalloc(buf, n, sizeof(char)); + if (getcwd(buf, n)) + break; + if (errno != ERANGE) + die("getcwd"); + } + + return buf; +} + +void +_rebuild(char *src) +{ + char *cwd, *cpy1, *cpy2, *dn, *bn; + cmd_t cmd = {0}; + + cwd = _getcwd(); + if (!(cpy1 = strdup(*_cbs_argv))) + die("strdup"); + if (!(cpy2 = strdup(*_cbs_argv))) + die("strdup"); + dn = dirname(cpy1); + bn = basename(cpy2); + + if (chdir(dn) == -1) + die("chdir: %s", dn); + if (!foutdated(bn, src)) { + if (chdir(cwd) == -1) + die("chdir: %s", cwd); + free(cpy1); + free(cpy2); + free(cwd); + return; + } + + cmdadd(&cmd, "cc"); +#ifdef CBS_PTHREAD + cmdadd(&cmd, "-lpthread"); +#endif + cmdadd(&cmd, "-o", bn, src); + cmdput(cmd); + if (cmdexec(cmd)) + diex("Compilation of build script failed"); + + cmdclr(&cmd); + + if (chdir(cwd) == -1) + die("chdir: %s", cwd); + + cmdaddv(&cmd, _cbs_argv, _cbs_argc); + execvp(*cmd._argv, cmd._argv); + die("execvp: %s", *cmd._argv); +} + +int +nproc(void) +{ +#ifdef _SC_NPROCESSORS_ONLN + return (int)sysconf(_SC_NPROCESSORS_ONLN); +#else + errno = 0; + return -1; +#endif +} + +bool +pcquery(struct strv *vec, char *lib, int flags) +{ + int ec; + char *p; + size_t n; + cmd_t c = {0}; + wordexp_t we; + + p = NULL; + + cmdadd(&c, "pkg-config"); + if (flags & PKGC_LIBS) + cmdadd(&c, "--libs"); + if (flags & PKGC_CFLAGS) + cmdadd(&c, "--cflags"); + cmdadd(&c, lib); + + if ((ec = cmdexecb(c, &p, &n))) { + if (errno == ENOENT) { + free(c._argv); + return false; + } + diex("pkg-config terminated with exit-code %d", ec); + } + + if (!p) + return true; + + /* Remove trailing newline */ + p[n - 1] = 0; + + switch (wordexp(p, &we, WRDE_NOCMD)) { + case WRDE_BADCHAR: + case WRDE_BADVAL: + case WRDE_SYNTAX: + errno = EINVAL; + die("wordexp"); + case WRDE_NOSPACE: + errno = ENOMEM; + die("wordexp"); + } + + vec->buf = bufalloc(vec->buf, vec->len + we.we_wordc, sizeof(char *)); + for (size_t i = 0; i < we.we_wordc; i++) { + char *p = strdup(we.we_wordv[i]); + if (!p) + die(__func__); + vec->buf[vec->len++] = p; + } + + wordfree(&we); + free(p); + return true; +} + +#ifdef CBS_PTHREAD + +static void * +_tpwork(void *arg) +{ + tpool_t *tp = arg; + + while (!tp->_stop) { + struct _tjob *j; + + pthread_mutex_lock(&tp->_mtx); + while (!tp->_stop && !tp->_head) + pthread_cond_wait(&tp->_cnd, &tp->_mtx); + if (tp->_stop) { + pthread_mutex_unlock(&tp->_mtx); + break; + } + + j = _tpdeq(tp); + pthread_mutex_unlock(&tp->_mtx); + + j->fn(j->arg); + if (j->free) + j->free(j->arg); + free(j); + + pthread_mutex_lock(&tp->_mtx); + tp->_left--; + pthread_cond_broadcast(&tp->_cnd); + pthread_mutex_unlock(&tp->_mtx); + } + + return NULL; +} + +void +tpinit(tpool_t *tp, size_t n) +{ + tp->_tcnt = n; + tp->_stop = false; + tp->_left = 0; + tp->_head = tp->_tail = NULL; + tp->_thrds = bufalloc(NULL, n, sizeof(pthread_t)); + pthread_cond_init(&tp->_cnd, NULL); + pthread_mutex_init(&tp->_mtx, NULL); + + for (size_t i = 0; i < n; i++) + pthread_create(tp->_thrds + i, NULL, _tpwork, tp); +} + +void +tpfree(tpool_t *tp) +{ + tp->_stop = true; + + pthread_mutex_lock(&tp->_mtx); + pthread_cond_broadcast(&tp->_cnd); + pthread_mutex_unlock(&tp->_mtx); + + for (size_t i = 0; i < tp->_tcnt; i++) + pthread_join(tp->_thrds[i], NULL); + + free(tp->_thrds); + while (tp->_head) { + struct _tjob *j = _tpdeq(tp); + if (j->free) + j->free(j->arg); + free(j); + } + + pthread_cond_destroy(&tp->_cnd); + pthread_mutex_destroy(&tp->_mtx); +} + +struct _tjob * +_tpdeq(tpool_t *tp) +{ + struct _tjob *j = tp->_head; + + if (j) { + tp->_head = tp->_head->next; + if (!tp->_head) + tp->_tail = NULL; + } + + return j; +} + +void +tpenq(tpool_t *tp, tfunc_t fn, void *arg, tfree_func_t free) +{ + struct _tjob *j = bufalloc(NULL, 1, sizeof(struct _tjob)); + *j = (struct _tjob){ + .fn = fn, + .arg = arg, + .free = free, + }; + + pthread_mutex_lock(&tp->_mtx); + if (tp->_tail) + tp->_tail->next = j; + if (!tp->_head) + tp->_head = j; + tp->_tail = j; + tp->_left++; + pthread_cond_signal(&tp->_cnd); + pthread_mutex_unlock(&tp->_mtx); +} + +void +tpwait(tpool_t *tp) +{ + pthread_mutex_lock(&tp->_mtx); + while (!tp->_stop && tp->_left) + pthread_cond_wait(&tp->_cnd, &tp->_mtx); + pthread_mutex_unlock(&tp->_mtx); +} + +#endif /* CBS_PTHREAD */ + +#ifdef __GNUC__ +# pragma GCC diagnostic pop +#endif + +#ifdef __APPLE__ +# undef st_mtim +#endif + +#endif /* !C_BUILD_SYSTEM_H */ diff --git a/vendor/librune/data/GraphemeBreakTest.txt b/vendor/librune/data/GraphemeBreakTest.txt new file mode 100644 index 0000000..aeaa01a --- /dev/null +++ b/vendor/librune/data/GraphemeBreakTest.txt @@ -0,0 +1,1187 @@ +0020÷0020 +0020×0308÷0020 +0020÷000D +0020×0308÷000D +0020÷000A +0020×0308÷000A +0020÷0001 +0020×0308÷0001 +0020×034F +0020×0308×034F +0020÷1F1E6 +0020×0308÷1F1E6 +0020÷0600 +0020×0308÷0600 +0020×0A03 +0020×0308×0A03 +0020÷1100 +0020×0308÷1100 +0020÷1160 +0020×0308÷1160 +0020÷11A8 +0020×0308÷11A8 +0020÷AC00 +0020×0308÷AC00 +0020÷AC01 +0020×0308÷AC01 +0020×0900 +0020×0308×0900 +0020×0903 +0020×0308×0903 +0020÷0904 +0020×0308÷0904 +0020÷0D4E +0020×0308÷0D4E +0020÷0915 +0020×0308÷0915 +0020÷231A +0020×0308÷231A +0020×0300 +0020×0308×0300 +0020×093C +0020×0308×093C +0020×094D +0020×0308×094D +0020×200D +0020×0308×200D +0020÷0378 +0020×0308÷0378 +000D÷0020 +000D÷0308÷0020 +000D÷000D +000D÷0308÷000D +000D×000A +000D÷0308÷000A +000D÷0001 +000D÷0308÷0001 +000D÷034F +000D÷0308×034F +000D÷1F1E6 +000D÷0308÷1F1E6 +000D÷0600 +000D÷0308÷0600 +000D÷0A03 +000D÷0308×0A03 +000D÷1100 +000D÷0308÷1100 +000D÷1160 +000D÷0308÷1160 +000D÷11A8 +000D÷0308÷11A8 +000D÷AC00 +000D÷0308÷AC00 +000D÷AC01 +000D÷0308÷AC01 +000D÷0900 +000D÷0308×0900 +000D÷0903 +000D÷0308×0903 +000D÷0904 +000D÷0308÷0904 +000D÷0D4E +000D÷0308÷0D4E +000D÷0915 +000D÷0308÷0915 +000D÷231A +000D÷0308÷231A +000D÷0300 +000D÷0308×0300 +000D÷093C +000D÷0308×093C +000D÷094D +000D÷0308×094D +000D÷200D +000D÷0308×200D +000D÷0378 +000D÷0308÷0378 +000A÷0020 +000A÷0308÷0020 +000A÷000D +000A÷0308÷000D +000A÷000A +000A÷0308÷000A +000A÷0001 +000A÷0308÷0001 +000A÷034F +000A÷0308×034F +000A÷1F1E6 +000A÷0308÷1F1E6 +000A÷0600 +000A÷0308÷0600 +000A÷0A03 +000A÷0308×0A03 +000A÷1100 +000A÷0308÷1100 +000A÷1160 +000A÷0308÷1160 +000A÷11A8 +000A÷0308÷11A8 +000A÷AC00 +000A÷0308÷AC00 +000A÷AC01 +000A÷0308÷AC01 +000A÷0900 +000A÷0308×0900 +000A÷0903 +000A÷0308×0903 +000A÷0904 +000A÷0308÷0904 +000A÷0D4E +000A÷0308÷0D4E +000A÷0915 +000A÷0308÷0915 +000A÷231A +000A÷0308÷231A +000A÷0300 +000A÷0308×0300 +000A÷093C +000A÷0308×093C +000A÷094D +000A÷0308×094D +000A÷200D +000A÷0308×200D +000A÷0378 +000A÷0308÷0378 +0001÷0020 +0001÷0308÷0020 +0001÷000D +0001÷0308÷000D +0001÷000A +0001÷0308÷000A +0001÷0001 +0001÷0308÷0001 +0001÷034F +0001÷0308×034F +0001÷1F1E6 +0001÷0308÷1F1E6 +0001÷0600 +0001÷0308÷0600 +0001÷0A03 +0001÷0308×0A03 +0001÷1100 +0001÷0308÷1100 +0001÷1160 +0001÷0308÷1160 +0001÷11A8 +0001÷0308÷11A8 +0001÷AC00 +0001÷0308÷AC00 +0001÷AC01 +0001÷0308÷AC01 +0001÷0900 +0001÷0308×0900 +0001÷0903 +0001÷0308×0903 +0001÷0904 +0001÷0308÷0904 +0001÷0D4E +0001÷0308÷0D4E +0001÷0915 +0001÷0308÷0915 +0001÷231A +0001÷0308÷231A +0001÷0300 +0001÷0308×0300 +0001÷093C +0001÷0308×093C +0001÷094D +0001÷0308×094D +0001÷200D +0001÷0308×200D +0001÷0378 +0001÷0308÷0378 +034F÷0020 +034F×0308÷0020 +034F÷000D +034F×0308÷000D +034F÷000A +034F×0308÷000A +034F÷0001 +034F×0308÷0001 +034F×034F +034F×0308×034F +034F÷1F1E6 +034F×0308÷1F1E6 +034F÷0600 +034F×0308÷0600 +034F×0A03 +034F×0308×0A03 +034F÷1100 +034F×0308÷1100 +034F÷1160 +034F×0308÷1160 +034F÷11A8 +034F×0308÷11A8 +034F÷AC00 +034F×0308÷AC00 +034F÷AC01 +034F×0308÷AC01 +034F×0900 +034F×0308×0900 +034F×0903 +034F×0308×0903 +034F÷0904 +034F×0308÷0904 +034F÷0D4E +034F×0308÷0D4E +034F÷0915 +034F×0308÷0915 +034F÷231A +034F×0308÷231A +034F×0300 +034F×0308×0300 +034F×093C +034F×0308×093C +034F×094D +034F×0308×094D +034F×200D +034F×0308×200D +034F÷0378 +034F×0308÷0378 +1F1E6÷0020 +1F1E6×0308÷0020 +1F1E6÷000D +1F1E6×0308÷000D +1F1E6÷000A +1F1E6×0308÷000A +1F1E6÷0001 +1F1E6×0308÷0001 +1F1E6×034F +1F1E6×0308×034F +1F1E6×1F1E6 +1F1E6×0308÷1F1E6 +1F1E6÷0600 +1F1E6×0308÷0600 +1F1E6×0A03 +1F1E6×0308×0A03 +1F1E6÷1100 +1F1E6×0308÷1100 +1F1E6÷1160 +1F1E6×0308÷1160 +1F1E6÷11A8 +1F1E6×0308÷11A8 +1F1E6÷AC00 +1F1E6×0308÷AC00 +1F1E6÷AC01 +1F1E6×0308÷AC01 +1F1E6×0900 +1F1E6×0308×0900 +1F1E6×0903 +1F1E6×0308×0903 +1F1E6÷0904 +1F1E6×0308÷0904 +1F1E6÷0D4E +1F1E6×0308÷0D4E +1F1E6÷0915 +1F1E6×0308÷0915 +1F1E6÷231A +1F1E6×0308÷231A +1F1E6×0300 +1F1E6×0308×0300 +1F1E6×093C +1F1E6×0308×093C +1F1E6×094D +1F1E6×0308×094D +1F1E6×200D +1F1E6×0308×200D +1F1E6÷0378 +1F1E6×0308÷0378 +0600×0020 +0600×0308÷0020 +0600÷000D +0600×0308÷000D +0600÷000A +0600×0308÷000A +0600÷0001 +0600×0308÷0001 +0600×034F +0600×0308×034F +0600×1F1E6 +0600×0308÷1F1E6 +0600×0600 +0600×0308÷0600 +0600×0A03 +0600×0308×0A03 +0600×1100 +0600×0308÷1100 +0600×1160 +0600×0308÷1160 +0600×11A8 +0600×0308÷11A8 +0600×AC00 +0600×0308÷AC00 +0600×AC01 +0600×0308÷AC01 +0600×0900 +0600×0308×0900 +0600×0903 +0600×0308×0903 +0600×0904 +0600×0308÷0904 +0600×0D4E +0600×0308÷0D4E +0600×0915 +0600×0308÷0915 +0600×231A +0600×0308÷231A +0600×0300 +0600×0308×0300 +0600×093C +0600×0308×093C +0600×094D +0600×0308×094D +0600×200D +0600×0308×200D +0600×0378 +0600×0308÷0378 +0A03÷0020 +0A03×0308÷0020 +0A03÷000D +0A03×0308÷000D +0A03÷000A +0A03×0308÷000A +0A03÷0001 +0A03×0308÷0001 +0A03×034F +0A03×0308×034F +0A03÷1F1E6 +0A03×0308÷1F1E6 +0A03÷0600 +0A03×0308÷0600 +0A03×0A03 +0A03×0308×0A03 +0A03÷1100 +0A03×0308÷1100 +0A03÷1160 +0A03×0308÷1160 +0A03÷11A8 +0A03×0308÷11A8 +0A03÷AC00 +0A03×0308÷AC00 +0A03÷AC01 +0A03×0308÷AC01 +0A03×0900 +0A03×0308×0900 +0A03×0903 +0A03×0308×0903 +0A03÷0904 +0A03×0308÷0904 +0A03÷0D4E +0A03×0308÷0D4E +0A03÷0915 +0A03×0308÷0915 +0A03÷231A +0A03×0308÷231A +0A03×0300 +0A03×0308×0300 +0A03×093C +0A03×0308×093C +0A03×094D +0A03×0308×094D +0A03×200D +0A03×0308×200D +0A03÷0378 +0A03×0308÷0378 +1100÷0020 +1100×0308÷0020 +1100÷000D +1100×0308÷000D +1100÷000A +1100×0308÷000A +1100÷0001 +1100×0308÷0001 +1100×034F +1100×0308×034F +1100÷1F1E6 +1100×0308÷1F1E6 +1100÷0600 +1100×0308÷0600 +1100×0A03 +1100×0308×0A03 +1100×1100 +1100×0308÷1100 +1100×1160 +1100×0308÷1160 +1100÷11A8 +1100×0308÷11A8 +1100×AC00 +1100×0308÷AC00 +1100×AC01 +1100×0308÷AC01 +1100×0900 +1100×0308×0900 +1100×0903 +1100×0308×0903 +1100÷0904 +1100×0308÷0904 +1100÷0D4E +1100×0308÷0D4E +1100÷0915 +1100×0308÷0915 +1100÷231A +1100×0308÷231A +1100×0300 +1100×0308×0300 +1100×093C +1100×0308×093C +1100×094D +1100×0308×094D +1100×200D +1100×0308×200D +1100÷0378 +1100×0308÷0378 +1160÷0020 +1160×0308÷0020 +1160÷000D +1160×0308÷000D +1160÷000A +1160×0308÷000A +1160÷0001 +1160×0308÷0001 +1160×034F +1160×0308×034F +1160÷1F1E6 +1160×0308÷1F1E6 +1160÷0600 +1160×0308÷0600 +1160×0A03 +1160×0308×0A03 +1160÷1100 +1160×0308÷1100 +1160×1160 +1160×0308÷1160 +1160×11A8 +1160×0308÷11A8 +1160÷AC00 +1160×0308÷AC00 +1160÷AC01 +1160×0308÷AC01 +1160×0900 +1160×0308×0900 +1160×0903 +1160×0308×0903 +1160÷0904 +1160×0308÷0904 +1160÷0D4E +1160×0308÷0D4E +1160÷0915 +1160×0308÷0915 +1160÷231A +1160×0308÷231A +1160×0300 +1160×0308×0300 +1160×093C +1160×0308×093C +1160×094D +1160×0308×094D +1160×200D +1160×0308×200D +1160÷0378 +1160×0308÷0378 +11A8÷0020 +11A8×0308÷0020 +11A8÷000D +11A8×0308÷000D +11A8÷000A +11A8×0308÷000A +11A8÷0001 +11A8×0308÷0001 +11A8×034F +11A8×0308×034F +11A8÷1F1E6 +11A8×0308÷1F1E6 +11A8÷0600 +11A8×0308÷0600 +11A8×0A03 +11A8×0308×0A03 +11A8÷1100 +11A8×0308÷1100 +11A8÷1160 +11A8×0308÷1160 +11A8×11A8 +11A8×0308÷11A8 +11A8÷AC00 +11A8×0308÷AC00 +11A8÷AC01 +11A8×0308÷AC01 +11A8×0900 +11A8×0308×0900 +11A8×0903 +11A8×0308×0903 +11A8÷0904 +11A8×0308÷0904 +11A8÷0D4E +11A8×0308÷0D4E +11A8÷0915 +11A8×0308÷0915 +11A8÷231A +11A8×0308÷231A +11A8×0300 +11A8×0308×0300 +11A8×093C +11A8×0308×093C +11A8×094D +11A8×0308×094D +11A8×200D +11A8×0308×200D +11A8÷0378 +11A8×0308÷0378 +AC00÷0020 +AC00×0308÷0020 +AC00÷000D +AC00×0308÷000D +AC00÷000A +AC00×0308÷000A +AC00÷0001 +AC00×0308÷0001 +AC00×034F +AC00×0308×034F +AC00÷1F1E6 +AC00×0308÷1F1E6 +AC00÷0600 +AC00×0308÷0600 +AC00×0A03 +AC00×0308×0A03 +AC00÷1100 +AC00×0308÷1100 +AC00×1160 +AC00×0308÷1160 +AC00×11A8 +AC00×0308÷11A8 +AC00÷AC00 +AC00×0308÷AC00 +AC00÷AC01 +AC00×0308÷AC01 +AC00×0900 +AC00×0308×0900 +AC00×0903 +AC00×0308×0903 +AC00÷0904 +AC00×0308÷0904 +AC00÷0D4E +AC00×0308÷0D4E +AC00÷0915 +AC00×0308÷0915 +AC00÷231A +AC00×0308÷231A +AC00×0300 +AC00×0308×0300 +AC00×093C +AC00×0308×093C +AC00×094D +AC00×0308×094D +AC00×200D +AC00×0308×200D +AC00÷0378 +AC00×0308÷0378 +AC01÷0020 +AC01×0308÷0020 +AC01÷000D +AC01×0308÷000D +AC01÷000A +AC01×0308÷000A +AC01÷0001 +AC01×0308÷0001 +AC01×034F +AC01×0308×034F +AC01÷1F1E6 +AC01×0308÷1F1E6 +AC01÷0600 +AC01×0308÷0600 +AC01×0A03 +AC01×0308×0A03 +AC01÷1100 +AC01×0308÷1100 +AC01÷1160 +AC01×0308÷1160 +AC01×11A8 +AC01×0308÷11A8 +AC01÷AC00 +AC01×0308÷AC00 +AC01÷AC01 +AC01×0308÷AC01 +AC01×0900 +AC01×0308×0900 +AC01×0903 +AC01×0308×0903 +AC01÷0904 +AC01×0308÷0904 +AC01÷0D4E +AC01×0308÷0D4E +AC01÷0915 +AC01×0308÷0915 +AC01÷231A +AC01×0308÷231A +AC01×0300 +AC01×0308×0300 +AC01×093C +AC01×0308×093C +AC01×094D +AC01×0308×094D +AC01×200D +AC01×0308×200D +AC01÷0378 +AC01×0308÷0378 +0900÷0020 +0900×0308÷0020 +0900÷000D +0900×0308÷000D +0900÷000A +0900×0308÷000A +0900÷0001 +0900×0308÷0001 +0900×034F +0900×0308×034F +0900÷1F1E6 +0900×0308÷1F1E6 +0900÷0600 +0900×0308÷0600 +0900×0A03 +0900×0308×0A03 +0900÷1100 +0900×0308÷1100 +0900÷1160 +0900×0308÷1160 +0900÷11A8 +0900×0308÷11A8 +0900÷AC00 +0900×0308÷AC00 +0900÷AC01 +0900×0308÷AC01 +0900×0900 +0900×0308×0900 +0900×0903 +0900×0308×0903 +0900÷0904 +0900×0308÷0904 +0900÷0D4E +0900×0308÷0D4E +0900÷0915 +0900×0308÷0915 +0900÷231A +0900×0308÷231A +0900×0300 +0900×0308×0300 +0900×093C +0900×0308×093C +0900×094D +0900×0308×094D +0900×200D +0900×0308×200D +0900÷0378 +0900×0308÷0378 +0903÷0020 +0903×0308÷0020 +0903÷000D +0903×0308÷000D +0903÷000A +0903×0308÷000A +0903÷0001 +0903×0308÷0001 +0903×034F +0903×0308×034F +0903÷1F1E6 +0903×0308÷1F1E6 +0903÷0600 +0903×0308÷0600 +0903×0A03 +0903×0308×0A03 +0903÷1100 +0903×0308÷1100 +0903÷1160 +0903×0308÷1160 +0903÷11A8 +0903×0308÷11A8 +0903÷AC00 +0903×0308÷AC00 +0903÷AC01 +0903×0308÷AC01 +0903×0900 +0903×0308×0900 +0903×0903 +0903×0308×0903 +0903÷0904 +0903×0308÷0904 +0903÷0D4E +0903×0308÷0D4E +0903÷0915 +0903×0308÷0915 +0903÷231A +0903×0308÷231A +0903×0300 +0903×0308×0300 +0903×093C +0903×0308×093C +0903×094D +0903×0308×094D +0903×200D +0903×0308×200D +0903÷0378 +0903×0308÷0378 +0904÷0020 +0904×0308÷0020 +0904÷000D +0904×0308÷000D +0904÷000A +0904×0308÷000A +0904÷0001 +0904×0308÷0001 +0904×034F +0904×0308×034F +0904÷1F1E6 +0904×0308÷1F1E6 +0904÷0600 +0904×0308÷0600 +0904×0A03 +0904×0308×0A03 +0904÷1100 +0904×0308÷1100 +0904÷1160 +0904×0308÷1160 +0904÷11A8 +0904×0308÷11A8 +0904÷AC00 +0904×0308÷AC00 +0904÷AC01 +0904×0308÷AC01 +0904×0900 +0904×0308×0900 +0904×0903 +0904×0308×0903 +0904÷0904 +0904×0308÷0904 +0904÷0D4E +0904×0308÷0D4E +0904÷0915 +0904×0308÷0915 +0904÷231A +0904×0308÷231A +0904×0300 +0904×0308×0300 +0904×093C +0904×0308×093C +0904×094D +0904×0308×094D +0904×200D +0904×0308×200D +0904÷0378 +0904×0308÷0378 +0D4E×0020 +0D4E×0308÷0020 +0D4E÷000D +0D4E×0308÷000D +0D4E÷000A +0D4E×0308÷000A +0D4E÷0001 +0D4E×0308÷0001 +0D4E×034F +0D4E×0308×034F +0D4E×1F1E6 +0D4E×0308÷1F1E6 +0D4E×0600 +0D4E×0308÷0600 +0D4E×0A03 +0D4E×0308×0A03 +0D4E×1100 +0D4E×0308÷1100 +0D4E×1160 +0D4E×0308÷1160 +0D4E×11A8 +0D4E×0308÷11A8 +0D4E×AC00 +0D4E×0308÷AC00 +0D4E×AC01 +0D4E×0308÷AC01 +0D4E×0900 +0D4E×0308×0900 +0D4E×0903 +0D4E×0308×0903 +0D4E×0904 +0D4E×0308÷0904 +0D4E×0D4E +0D4E×0308÷0D4E +0D4E×0915 +0D4E×0308÷0915 +0D4E×231A +0D4E×0308÷231A +0D4E×0300 +0D4E×0308×0300 +0D4E×093C +0D4E×0308×093C +0D4E×094D +0D4E×0308×094D +0D4E×200D +0D4E×0308×200D +0D4E×0378 +0D4E×0308÷0378 +0915÷0020 +0915×0308÷0020 +0915÷000D +0915×0308÷000D +0915÷000A +0915×0308÷000A +0915÷0001 +0915×0308÷0001 +0915×034F +0915×0308×034F +0915÷1F1E6 +0915×0308÷1F1E6 +0915÷0600 +0915×0308÷0600 +0915×0A03 +0915×0308×0A03 +0915÷1100 +0915×0308÷1100 +0915÷1160 +0915×0308÷1160 +0915÷11A8 +0915×0308÷11A8 +0915÷AC00 +0915×0308÷AC00 +0915÷AC01 +0915×0308÷AC01 +0915×0900 +0915×0308×0900 +0915×0903 +0915×0308×0903 +0915÷0904 +0915×0308÷0904 +0915÷0D4E +0915×0308÷0D4E +0915÷0915 +0915×0308÷0915 +0915÷231A +0915×0308÷231A +0915×0300 +0915×0308×0300 +0915×093C +0915×0308×093C +0915×094D +0915×0308×094D +0915×200D +0915×0308×200D +0915÷0378 +0915×0308÷0378 +231A÷0020 +231A×0308÷0020 +231A÷000D +231A×0308÷000D +231A÷000A +231A×0308÷000A +231A÷0001 +231A×0308÷0001 +231A×034F +231A×0308×034F +231A÷1F1E6 +231A×0308÷1F1E6 +231A÷0600 +231A×0308÷0600 +231A×0A03 +231A×0308×0A03 +231A÷1100 +231A×0308÷1100 +231A÷1160 +231A×0308÷1160 +231A÷11A8 +231A×0308÷11A8 +231A÷AC00 +231A×0308÷AC00 +231A÷AC01 +231A×0308÷AC01 +231A×0900 +231A×0308×0900 +231A×0903 +231A×0308×0903 +231A÷0904 +231A×0308÷0904 +231A÷0D4E +231A×0308÷0D4E +231A÷0915 +231A×0308÷0915 +231A÷231A +231A×0308÷231A +231A×0300 +231A×0308×0300 +231A×093C +231A×0308×093C +231A×094D +231A×0308×094D +231A×200D +231A×0308×200D +231A÷0378 +231A×0308÷0378 +0300÷0020 +0300×0308÷0020 +0300÷000D +0300×0308÷000D +0300÷000A +0300×0308÷000A +0300÷0001 +0300×0308÷0001 +0300×034F +0300×0308×034F +0300÷1F1E6 +0300×0308÷1F1E6 +0300÷0600 +0300×0308÷0600 +0300×0A03 +0300×0308×0A03 +0300÷1100 +0300×0308÷1100 +0300÷1160 +0300×0308÷1160 +0300÷11A8 +0300×0308÷11A8 +0300÷AC00 +0300×0308÷AC00 +0300÷AC01 +0300×0308÷AC01 +0300×0900 +0300×0308×0900 +0300×0903 +0300×0308×0903 +0300÷0904 +0300×0308÷0904 +0300÷0D4E +0300×0308÷0D4E +0300÷0915 +0300×0308÷0915 +0300÷231A +0300×0308÷231A +0300×0300 +0300×0308×0300 +0300×093C +0300×0308×093C +0300×094D +0300×0308×094D +0300×200D +0300×0308×200D +0300÷0378 +0300×0308÷0378 +093C÷0020 +093C×0308÷0020 +093C÷000D +093C×0308÷000D +093C÷000A +093C×0308÷000A +093C÷0001 +093C×0308÷0001 +093C×034F +093C×0308×034F +093C÷1F1E6 +093C×0308÷1F1E6 +093C÷0600 +093C×0308÷0600 +093C×0A03 +093C×0308×0A03 +093C÷1100 +093C×0308÷1100 +093C÷1160 +093C×0308÷1160 +093C÷11A8 +093C×0308÷11A8 +093C÷AC00 +093C×0308÷AC00 +093C÷AC01 +093C×0308÷AC01 +093C×0900 +093C×0308×0900 +093C×0903 +093C×0308×0903 +093C÷0904 +093C×0308÷0904 +093C÷0D4E +093C×0308÷0D4E +093C÷0915 +093C×0308÷0915 +093C÷231A +093C×0308÷231A +093C×0300 +093C×0308×0300 +093C×093C +093C×0308×093C +093C×094D +093C×0308×094D +093C×200D +093C×0308×200D +093C÷0378 +093C×0308÷0378 +094D÷0020 +094D×0308÷0020 +094D÷000D +094D×0308÷000D +094D÷000A +094D×0308÷000A +094D÷0001 +094D×0308÷0001 +094D×034F +094D×0308×034F +094D÷1F1E6 +094D×0308÷1F1E6 +094D÷0600 +094D×0308÷0600 +094D×0A03 +094D×0308×0A03 +094D÷1100 +094D×0308÷1100 +094D÷1160 +094D×0308÷1160 +094D÷11A8 +094D×0308÷11A8 +094D÷AC00 +094D×0308÷AC00 +094D÷AC01 +094D×0308÷AC01 +094D×0900 +094D×0308×0900 +094D×0903 +094D×0308×0903 +094D÷0904 +094D×0308÷0904 +094D÷0D4E +094D×0308÷0D4E +094D÷0915 +094D×0308÷0915 +094D÷231A +094D×0308÷231A +094D×0300 +094D×0308×0300 +094D×093C +094D×0308×093C +094D×094D +094D×0308×094D +094D×200D +094D×0308×200D +094D÷0378 +094D×0308÷0378 +200D÷0020 +200D×0308÷0020 +200D÷000D +200D×0308÷000D +200D÷000A +200D×0308÷000A +200D÷0001 +200D×0308÷0001 +200D×034F +200D×0308×034F +200D÷1F1E6 +200D×0308÷1F1E6 +200D÷0600 +200D×0308÷0600 +200D×0A03 +200D×0308×0A03 +200D÷1100 +200D×0308÷1100 +200D÷1160 +200D×0308÷1160 +200D÷11A8 +200D×0308÷11A8 +200D÷AC00 +200D×0308÷AC00 +200D÷AC01 +200D×0308÷AC01 +200D×0900 +200D×0308×0900 +200D×0903 +200D×0308×0903 +200D÷0904 +200D×0308÷0904 +200D÷0D4E +200D×0308÷0D4E +200D÷0915 +200D×0308÷0915 +200D÷231A +200D×0308÷231A +200D×0300 +200D×0308×0300 +200D×093C +200D×0308×093C +200D×094D +200D×0308×094D +200D×200D +200D×0308×200D +200D÷0378 +200D×0308÷0378 +0378÷0020 +0378×0308÷0020 +0378÷000D +0378×0308÷000D +0378÷000A +0378×0308÷000A +0378÷0001 +0378×0308÷0001 +0378×034F +0378×0308×034F +0378÷1F1E6 +0378×0308÷1F1E6 +0378÷0600 +0378×0308÷0600 +0378×0A03 +0378×0308×0A03 +0378÷1100 +0378×0308÷1100 +0378÷1160 +0378×0308÷1160 +0378÷11A8 +0378×0308÷11A8 +0378÷AC00 +0378×0308÷AC00 +0378÷AC01 +0378×0308÷AC01 +0378×0900 +0378×0308×0900 +0378×0903 +0378×0308×0903 +0378÷0904 +0378×0308÷0904 +0378÷0D4E +0378×0308÷0D4E +0378÷0915 +0378×0308÷0915 +0378÷231A +0378×0308÷231A +0378×0300 +0378×0308×0300 +0378×093C +0378×0308×093C +0378×094D +0378×0308×094D +0378×200D +0378×0308×200D +0378÷0378 +0378×0308÷0378 +000D×000A÷0061÷000A÷0308 +0061×0308 +0020×200D÷0646 +0646×200D÷0020 +1100×1100 +AC00×11A8÷1100 +AC01×11A8÷1100 +1F1E6×1F1E7÷1F1E8÷0062 +0061÷1F1E6×1F1E7÷1F1E8÷0062 +0061÷1F1E6×1F1E7×200D÷1F1E8÷0062 +0061÷1F1E6×200D÷1F1E7×1F1E8÷0062 +0061÷1F1E6×1F1E7÷1F1E8×1F1E9÷0062 +0061×200D +0061×0308÷0062 +0061×0903÷0062 +0061÷0600×0062 +1F476×1F3FF÷1F476 +0061×1F3FF÷1F476 +0061×1F3FF÷1F476×200D×1F6D1 +1F476×1F3FF×0308×200D×1F476×1F3FF +1F6D1×200D×1F6D1 +0061×200D÷1F6D1 +2701×200D×2701 +0061×200D÷2701 +0915÷0924 +0915×094D×0924 +0915×094D×094D×0924 +0915×094D×200D×0924 +0915×093C×200D×094D×0924 +0915×093C×094D×200D×0924 +0915×094D×0924×094D×092F +0915×094D÷0061 +0061×094D÷0924 +003F×094D÷0924 +0915×094D×094D×0924 diff --git a/vendor/librune/data/emoji-data.txt b/vendor/librune/data/emoji-data.txt new file mode 100644 index 0000000..0ba10e9 --- /dev/null +++ b/vendor/librune/data/emoji-data.txt @@ -0,0 +1,1320 @@ +# emoji-data.txt +# Date: 2023-02-01, 02:22:54 GMT +# © 2023 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# Emoji Data for UTS #51 +# Used with Emoji Version 15.1 and subsequent minor revisions (if any) +# +# For documentation and usage, see https://www.unicode.org/reports/tr51 +# +# Format: +# <codepoint(s)> ; <property> # <comments> +# Note: there is no guarantee as to the structure of whitespace or comments +# +# Characters and sequences are listed in code point order. Users should be shown a more natural order. +# See the CLDR collation order for Emoji. + + +# ================================================ + +# All omitted code points have Emoji=No + +0023 ; Emoji # E0.0 [1] (#️) hash sign +002A ; Emoji # E0.0 [1] (*️) asterisk +0030..0039 ; Emoji # E0.0 [10] (0️..9️) digit zero..digit nine +00A9 ; Emoji # E0.6 [1] (©️) copyright +00AE ; Emoji # E0.6 [1] (®️) registered +203C ; Emoji # E0.6 [1] (‼️) double exclamation mark +2049 ; Emoji # E0.6 [1] (⁉️) exclamation question mark +2122 ; Emoji # E0.6 [1] (™️) trade mark +2139 ; Emoji # E0.6 [1] (ℹ️) information +2194..2199 ; Emoji # E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow +21A9..21AA ; Emoji # E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right +231A..231B ; Emoji # E0.6 [2] (⌚..⌛) watch..hourglass done +2328 ; Emoji # E1.0 [1] (⌨️) keyboard +23CF ; Emoji # E1.0 [1] (⏏️) eject button +23E9..23EC ; Emoji # E0.6 [4] (⏩..⏬) fast-forward button..fast down button +23ED..23EE ; Emoji # E0.7 [2] (⏭️..⏮️) next track button..last track button +23EF ; Emoji # E1.0 [1] (⏯️) play or pause button +23F0 ; Emoji # E0.6 [1] (⏰) alarm clock +23F1..23F2 ; Emoji # E1.0 [2] (⏱️..⏲️) stopwatch..timer clock +23F3 ; Emoji # E0.6 [1] (⏳) hourglass not done +23F8..23FA ; Emoji # E0.7 [3] (⏸️..⏺️) pause button..record button +24C2 ; Emoji # E0.6 [1] (Ⓜ️) circled M +25AA..25AB ; Emoji # E0.6 [2] (▪️..▫️) black small square..white small square +25B6 ; Emoji # E0.6 [1] (▶️) play button +25C0 ; Emoji # E0.6 [1] (◀️) reverse button +25FB..25FE ; Emoji # E0.6 [4] (◻️..◾) white medium square..black medium-small square +2600..2601 ; Emoji # E0.6 [2] (☀️..☁️) sun..cloud +2602..2603 ; Emoji # E0.7 [2] (☂️..☃️) umbrella..snowman +2604 ; Emoji # E1.0 [1] (☄️) comet +260E ; Emoji # E0.6 [1] (☎️) telephone +2611 ; Emoji # E0.6 [1] (☑️) check box with check +2614..2615 ; Emoji # E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage +2618 ; Emoji # E1.0 [1] (☘️) shamrock +261D ; Emoji # E0.6 [1] (☝️) index pointing up +2620 ; Emoji # E1.0 [1] (☠️) skull and crossbones +2622..2623 ; Emoji # E1.0 [2] (☢️..☣️) radioactive..biohazard +2626 ; Emoji # E1.0 [1] (☦️) orthodox cross +262A ; Emoji # E0.7 [1] (☪️) star and crescent +262E ; Emoji # E1.0 [1] (☮️) peace symbol +262F ; Emoji # E0.7 [1] (☯️) yin yang +2638..2639 ; Emoji # E0.7 [2] (☸️..☹️) wheel of dharma..frowning face +263A ; Emoji # E0.6 [1] (☺️) smiling face +2640 ; Emoji # E4.0 [1] (♀️) female sign +2642 ; Emoji # E4.0 [1] (♂️) male sign +2648..2653 ; Emoji # E0.6 [12] (♈..♓) Aries..Pisces +265F ; Emoji # E11.0 [1] (♟️) chess pawn +2660 ; Emoji # E0.6 [1] (♠️) spade suit +2663 ; Emoji # E0.6 [1] (♣️) club suit +2665..2666 ; Emoji # E0.6 [2] (♥️..♦️) heart suit..diamond suit +2668 ; Emoji # E0.6 [1] (♨️) hot springs +267B ; Emoji # E0.6 [1] (♻️) recycling symbol +267E ; Emoji # E11.0 [1] (♾️) infinity +267F ; Emoji # E0.6 [1] (♿) wheelchair symbol +2692 ; Emoji # E1.0 [1] (⚒️) hammer and pick +2693 ; Emoji # E0.6 [1] (⚓) anchor +2694 ; Emoji # E1.0 [1] (⚔️) crossed swords +2695 ; Emoji # E4.0 [1] (⚕️) medical symbol +2696..2697 ; Emoji # E1.0 [2] (⚖️..⚗️) balance scale..alembic +2699 ; Emoji # E1.0 [1] (⚙️) gear +269B..269C ; Emoji # E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis +26A0..26A1 ; Emoji # E0.6 [2] (⚠️..⚡) warning..high voltage +26A7 ; Emoji # E13.0 [1] (⚧️) transgender symbol +26AA..26AB ; Emoji # E0.6 [2] (⚪..⚫) white circle..black circle +26B0..26B1 ; Emoji # E1.0 [2] (⚰️..⚱️) coffin..funeral urn +26BD..26BE ; Emoji # E0.6 [2] (⚽..⚾) soccer ball..baseball +26C4..26C5 ; Emoji # E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud +26C8 ; Emoji # E0.7 [1] (⛈️) cloud with lightning and rain +26CE ; Emoji # E0.6 [1] (⛎) Ophiuchus +26CF ; Emoji # E0.7 [1] (⛏️) pick +26D1 ; Emoji # E0.7 [1] (⛑️) rescue worker’s helmet +26D3 ; Emoji # E0.7 [1] (⛓️) chains +26D4 ; Emoji # E0.6 [1] (⛔) no entry +26E9 ; Emoji # E0.7 [1] (⛩️) shinto shrine +26EA ; Emoji # E0.6 [1] (⛪) church +26F0..26F1 ; Emoji # E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground +26F2..26F3 ; Emoji # E0.6 [2] (⛲..⛳) fountain..flag in hole +26F4 ; Emoji # E0.7 [1] (⛴️) ferry +26F5 ; Emoji # E0.6 [1] (⛵) sailboat +26F7..26F9 ; Emoji # E0.7 [3] (⛷️..⛹️) skier..person bouncing ball +26FA ; Emoji # E0.6 [1] (⛺) tent +26FD ; Emoji # E0.6 [1] (⛽) fuel pump +2702 ; Emoji # E0.6 [1] (✂️) scissors +2705 ; Emoji # E0.6 [1] (✅) check mark button +2708..270C ; Emoji # E0.6 [5] (✈️..✌️) airplane..victory hand +270D ; Emoji # E0.7 [1] (✍️) writing hand +270F ; Emoji # E0.6 [1] (✏️) pencil +2712 ; Emoji # E0.6 [1] (✒️) black nib +2714 ; Emoji # E0.6 [1] (✔️) check mark +2716 ; Emoji # E0.6 [1] (✖️) multiply +271D ; Emoji # E0.7 [1] (✝️) latin cross +2721 ; Emoji # E0.7 [1] (✡️) star of David +2728 ; Emoji # E0.6 [1] (✨) sparkles +2733..2734 ; Emoji # E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star +2744 ; Emoji # E0.6 [1] (❄️) snowflake +2747 ; Emoji # E0.6 [1] (❇️) sparkle +274C ; Emoji # E0.6 [1] (❌) cross mark +274E ; Emoji # E0.6 [1] (❎) cross mark button +2753..2755 ; Emoji # E0.6 [3] (❓..❕) red question mark..white exclamation mark +2757 ; Emoji # E0.6 [1] (❗) red exclamation mark +2763 ; Emoji # E1.0 [1] (❣️) heart exclamation +2764 ; Emoji # E0.6 [1] (❤️) red heart +2795..2797 ; Emoji # E0.6 [3] (➕..➗) plus..divide +27A1 ; Emoji # E0.6 [1] (➡️) right arrow +27B0 ; Emoji # E0.6 [1] (➰) curly loop +27BF ; Emoji # E1.0 [1] (➿) double curly loop +2934..2935 ; Emoji # E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down +2B05..2B07 ; Emoji # E0.6 [3] (⬅️..⬇️) left arrow..down arrow +2B1B..2B1C ; Emoji # E0.6 [2] (⬛..⬜) black large square..white large square +2B50 ; Emoji # E0.6 [1] (⭐) star +2B55 ; Emoji # E0.6 [1] (⭕) hollow red circle +3030 ; Emoji # E0.6 [1] (〰️) wavy dash +303D ; Emoji # E0.6 [1] (〽️) part alternation mark +3297 ; Emoji # E0.6 [1] (㊗️) Japanese “congratulations” button +3299 ; Emoji # E0.6 [1] (㊙️) Japanese “secret” button +1F004 ; Emoji # E0.6 [1] (🀄) mahjong red dragon +1F0CF ; Emoji # E0.6 [1] (🃏) joker +1F170..1F171 ; Emoji # E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type) +1F17E..1F17F ; Emoji # E0.6 [2] (🅾️..🅿️) O button (blood type)..P button +1F18E ; Emoji # E0.6 [1] (🆎) AB button (blood type) +1F191..1F19A ; Emoji # E0.6 [10] (🆑..🆚) CL button..VS button +1F1E6..1F1FF ; Emoji # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z +1F201..1F202 ; Emoji # E0.6 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button +1F21A ; Emoji # E0.6 [1] (🈚) Japanese “free of charge” button +1F22F ; Emoji # E0.6 [1] (🈯) Japanese “reserved” button +1F232..1F23A ; Emoji # E0.6 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button +1F250..1F251 ; Emoji # E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button +1F300..1F30C ; Emoji # E0.6 [13] (🌀..🌌) cyclone..milky way +1F30D..1F30E ; Emoji # E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas +1F30F ; Emoji # E0.6 [1] (🌏) globe showing Asia-Australia +1F310 ; Emoji # E1.0 [1] (🌐) globe with meridians +1F311 ; Emoji # E0.6 [1] (🌑) new moon +1F312 ; Emoji # E1.0 [1] (🌒) waxing crescent moon +1F313..1F315 ; Emoji # E0.6 [3] (🌓..🌕) first quarter moon..full moon +1F316..1F318 ; Emoji # E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon +1F319 ; Emoji # E0.6 [1] (🌙) crescent moon +1F31A ; Emoji # E1.0 [1] (🌚) new moon face +1F31B ; Emoji # E0.6 [1] (🌛) first quarter moon face +1F31C ; Emoji # E0.7 [1] (🌜) last quarter moon face +1F31D..1F31E ; Emoji # E1.0 [2] (🌝..🌞) full moon face..sun with face +1F31F..1F320 ; Emoji # E0.6 [2] (🌟..🌠) glowing star..shooting star +1F321 ; Emoji # E0.7 [1] (🌡️) thermometer +1F324..1F32C ; Emoji # E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face +1F32D..1F32F ; Emoji # E1.0 [3] (🌭..🌯) hot dog..burrito +1F330..1F331 ; Emoji # E0.6 [2] (🌰..🌱) chestnut..seedling +1F332..1F333 ; Emoji # E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree +1F334..1F335 ; Emoji # E0.6 [2] (🌴..🌵) palm tree..cactus +1F336 ; Emoji # E0.7 [1] (🌶️) hot pepper +1F337..1F34A ; Emoji # E0.6 [20] (🌷..🍊) tulip..tangerine +1F34B ; Emoji # E1.0 [1] (🍋) lemon +1F34C..1F34F ; Emoji # E0.6 [4] (🍌..🍏) banana..green apple +1F350 ; Emoji # E1.0 [1] (🍐) pear +1F351..1F37B ; Emoji # E0.6 [43] (🍑..🍻) peach..clinking beer mugs +1F37C ; Emoji # E1.0 [1] (🍼) baby bottle +1F37D ; Emoji # E0.7 [1] (🍽️) fork and knife with plate +1F37E..1F37F ; Emoji # E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn +1F380..1F393 ; Emoji # E0.6 [20] (🎀..🎓) ribbon..graduation cap +1F396..1F397 ; Emoji # E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon +1F399..1F39B ; Emoji # E0.7 [3] (🎙️..🎛️) studio microphone..control knobs +1F39E..1F39F ; Emoji # E0.7 [2] (🎞️..🎟️) film frames..admission tickets +1F3A0..1F3C4 ; Emoji # E0.6 [37] (🎠..🏄) carousel horse..person surfing +1F3C5 ; Emoji # E1.0 [1] (🏅) sports medal +1F3C6 ; Emoji # E0.6 [1] (🏆) trophy +1F3C7 ; Emoji # E1.0 [1] (🏇) horse racing +1F3C8 ; Emoji # E0.6 [1] (🏈) american football +1F3C9 ; Emoji # E1.0 [1] (🏉) rugby football +1F3CA ; Emoji # E0.6 [1] (🏊) person swimming +1F3CB..1F3CE ; Emoji # E0.7 [4] (🏋️..🏎️) person lifting weights..racing car +1F3CF..1F3D3 ; Emoji # E1.0 [5] (🏏..🏓) cricket game..ping pong +1F3D4..1F3DF ; Emoji # E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium +1F3E0..1F3E3 ; Emoji # E0.6 [4] (🏠..🏣) house..Japanese post office +1F3E4 ; Emoji # E1.0 [1] (🏤) post office +1F3E5..1F3F0 ; Emoji # E0.6 [12] (🏥..🏰) hospital..castle +1F3F3 ; Emoji # E0.7 [1] (🏳️) white flag +1F3F4 ; Emoji # E1.0 [1] (🏴) black flag +1F3F5 ; Emoji # E0.7 [1] (🏵️) rosette +1F3F7 ; Emoji # E0.7 [1] (🏷️) label +1F3F8..1F407 ; Emoji # E1.0 [16] (🏸..🐇) badminton..rabbit +1F408 ; Emoji # E0.7 [1] (🐈) cat +1F409..1F40B ; Emoji # E1.0 [3] (🐉..🐋) dragon..whale +1F40C..1F40E ; Emoji # E0.6 [3] (🐌..🐎) snail..horse +1F40F..1F410 ; Emoji # E1.0 [2] (🐏..🐐) ram..goat +1F411..1F412 ; Emoji # E0.6 [2] (🐑..🐒) ewe..monkey +1F413 ; Emoji # E1.0 [1] (🐓) rooster +1F414 ; Emoji # E0.6 [1] (🐔) chicken +1F415 ; Emoji # E0.7 [1] (🐕) dog +1F416 ; Emoji # E1.0 [1] (🐖) pig +1F417..1F429 ; Emoji # E0.6 [19] (🐗..🐩) boar..poodle +1F42A ; Emoji # E1.0 [1] (🐪) camel +1F42B..1F43E ; Emoji # E0.6 [20] (🐫..🐾) two-hump camel..paw prints +1F43F ; Emoji # E0.7 [1] (🐿️) chipmunk +1F440 ; Emoji # E0.6 [1] (👀) eyes +1F441 ; Emoji # E0.7 [1] (👁️) eye +1F442..1F464 ; Emoji # E0.6 [35] (👂..👤) ear..bust in silhouette +1F465 ; Emoji # E1.0 [1] (👥) busts in silhouette +1F466..1F46B ; Emoji # E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Emoji # E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F4AC ; Emoji # E0.6 [63] (👮..💬) police officer..speech balloon +1F4AD ; Emoji # E1.0 [1] (💭) thought balloon +1F4AE..1F4B5 ; Emoji # E0.6 [8] (💮..💵) white flower..dollar banknote +1F4B6..1F4B7 ; Emoji # E1.0 [2] (💶..💷) euro banknote..pound banknote +1F4B8..1F4EB ; Emoji # E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag +1F4EC..1F4ED ; Emoji # E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag +1F4EE ; Emoji # E0.6 [1] (📮) postbox +1F4EF ; Emoji # E1.0 [1] (📯) postal horn +1F4F0..1F4F4 ; Emoji # E0.6 [5] (📰..📴) newspaper..mobile phone off +1F4F5 ; Emoji # E1.0 [1] (📵) no mobile phones +1F4F6..1F4F7 ; Emoji # E0.6 [2] (📶..📷) antenna bars..camera +1F4F8 ; Emoji # E1.0 [1] (📸) camera with flash +1F4F9..1F4FC ; Emoji # E0.6 [4] (📹..📼) video camera..videocassette +1F4FD ; Emoji # E0.7 [1] (📽️) film projector +1F4FF..1F502 ; Emoji # E1.0 [4] (📿..🔂) prayer beads..repeat single button +1F503 ; Emoji # E0.6 [1] (🔃) clockwise vertical arrows +1F504..1F507 ; Emoji # E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker +1F508 ; Emoji # E0.7 [1] (🔈) speaker low volume +1F509 ; Emoji # E1.0 [1] (🔉) speaker medium volume +1F50A..1F514 ; Emoji # E0.6 [11] (🔊..🔔) speaker high volume..bell +1F515 ; Emoji # E1.0 [1] (🔕) bell with slash +1F516..1F52B ; Emoji # E0.6 [22] (🔖..🔫) bookmark..water pistol +1F52C..1F52D ; Emoji # E1.0 [2] (🔬..🔭) microscope..telescope +1F52E..1F53D ; Emoji # E0.6 [16] (🔮..🔽) crystal ball..downwards button +1F549..1F54A ; Emoji # E0.7 [2] (🕉️..🕊️) om..dove +1F54B..1F54E ; Emoji # E1.0 [4] (🕋..🕎) kaaba..menorah +1F550..1F55B ; Emoji # E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock +1F55C..1F567 ; Emoji # E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty +1F56F..1F570 ; Emoji # E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock +1F573..1F579 ; Emoji # E0.7 [7] (🕳️..🕹️) hole..joystick +1F57A ; Emoji # E3.0 [1] (🕺) man dancing +1F587 ; Emoji # E0.7 [1] (🖇️) linked paperclips +1F58A..1F58D ; Emoji # E0.7 [4] (🖊️..🖍️) pen..crayon +1F590 ; Emoji # E0.7 [1] (🖐️) hand with fingers splayed +1F595..1F596 ; Emoji # E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F5A4 ; Emoji # E3.0 [1] (🖤) black heart +1F5A5 ; Emoji # E0.7 [1] (🖥️) desktop computer +1F5A8 ; Emoji # E0.7 [1] (🖨️) printer +1F5B1..1F5B2 ; Emoji # E0.7 [2] (🖱️..🖲️) computer mouse..trackball +1F5BC ; Emoji # E0.7 [1] (🖼️) framed picture +1F5C2..1F5C4 ; Emoji # E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet +1F5D1..1F5D3 ; Emoji # E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar +1F5DC..1F5DE ; Emoji # E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper +1F5E1 ; Emoji # E0.7 [1] (🗡️) dagger +1F5E3 ; Emoji # E0.7 [1] (🗣️) speaking head +1F5E8 ; Emoji # E2.0 [1] (🗨️) left speech bubble +1F5EF ; Emoji # E0.7 [1] (🗯️) right anger bubble +1F5F3 ; Emoji # E0.7 [1] (🗳️) ballot box with ballot +1F5FA ; Emoji # E0.7 [1] (🗺️) world map +1F5FB..1F5FF ; Emoji # E0.6 [5] (🗻..🗿) mount fuji..moai +1F600 ; Emoji # E1.0 [1] (😀) grinning face +1F601..1F606 ; Emoji # E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face +1F607..1F608 ; Emoji # E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns +1F609..1F60D ; Emoji # E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes +1F60E ; Emoji # E1.0 [1] (😎) smiling face with sunglasses +1F60F ; Emoji # E0.6 [1] (😏) smirking face +1F610 ; Emoji # E0.7 [1] (😐) neutral face +1F611 ; Emoji # E1.0 [1] (😑) expressionless face +1F612..1F614 ; Emoji # E0.6 [3] (😒..😔) unamused face..pensive face +1F615 ; Emoji # E1.0 [1] (😕) confused face +1F616 ; Emoji # E0.6 [1] (😖) confounded face +1F617 ; Emoji # E1.0 [1] (😗) kissing face +1F618 ; Emoji # E0.6 [1] (😘) face blowing a kiss +1F619 ; Emoji # E1.0 [1] (😙) kissing face with smiling eyes +1F61A ; Emoji # E0.6 [1] (😚) kissing face with closed eyes +1F61B ; Emoji # E1.0 [1] (😛) face with tongue +1F61C..1F61E ; Emoji # E0.6 [3] (😜..😞) winking face with tongue..disappointed face +1F61F ; Emoji # E1.0 [1] (😟) worried face +1F620..1F625 ; Emoji # E0.6 [6] (😠..😥) angry face..sad but relieved face +1F626..1F627 ; Emoji # E1.0 [2] (😦..😧) frowning face with open mouth..anguished face +1F628..1F62B ; Emoji # E0.6 [4] (😨..😫) fearful face..tired face +1F62C ; Emoji # E1.0 [1] (😬) grimacing face +1F62D ; Emoji # E0.6 [1] (😭) loudly crying face +1F62E..1F62F ; Emoji # E1.0 [2] (😮..😯) face with open mouth..hushed face +1F630..1F633 ; Emoji # E0.6 [4] (😰..😳) anxious face with sweat..flushed face +1F634 ; Emoji # E1.0 [1] (😴) sleeping face +1F635 ; Emoji # E0.6 [1] (😵) face with crossed-out eyes +1F636 ; Emoji # E1.0 [1] (😶) face without mouth +1F637..1F640 ; Emoji # E0.6 [10] (😷..🙀) face with medical mask..weary cat +1F641..1F644 ; Emoji # E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes +1F645..1F64F ; Emoji # E0.6 [11] (🙅..🙏) person gesturing NO..folded hands +1F680 ; Emoji # E0.6 [1] (🚀) rocket +1F681..1F682 ; Emoji # E1.0 [2] (🚁..🚂) helicopter..locomotive +1F683..1F685 ; Emoji # E0.6 [3] (🚃..🚅) railway car..bullet train +1F686 ; Emoji # E1.0 [1] (🚆) train +1F687 ; Emoji # E0.6 [1] (🚇) metro +1F688 ; Emoji # E1.0 [1] (🚈) light rail +1F689 ; Emoji # E0.6 [1] (🚉) station +1F68A..1F68B ; Emoji # E1.0 [2] (🚊..🚋) tram..tram car +1F68C ; Emoji # E0.6 [1] (🚌) bus +1F68D ; Emoji # E0.7 [1] (🚍) oncoming bus +1F68E ; Emoji # E1.0 [1] (🚎) trolleybus +1F68F ; Emoji # E0.6 [1] (🚏) bus stop +1F690 ; Emoji # E1.0 [1] (🚐) minibus +1F691..1F693 ; Emoji # E0.6 [3] (🚑..🚓) ambulance..police car +1F694 ; Emoji # E0.7 [1] (🚔) oncoming police car +1F695 ; Emoji # E0.6 [1] (🚕) taxi +1F696 ; Emoji # E1.0 [1] (🚖) oncoming taxi +1F697 ; Emoji # E0.6 [1] (🚗) automobile +1F698 ; Emoji # E0.7 [1] (🚘) oncoming automobile +1F699..1F69A ; Emoji # E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck +1F69B..1F6A1 ; Emoji # E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway +1F6A2 ; Emoji # E0.6 [1] (🚢) ship +1F6A3 ; Emoji # E1.0 [1] (🚣) person rowing boat +1F6A4..1F6A5 ; Emoji # E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light +1F6A6 ; Emoji # E1.0 [1] (🚦) vertical traffic light +1F6A7..1F6AD ; Emoji # E0.6 [7] (🚧..🚭) construction..no smoking +1F6AE..1F6B1 ; Emoji # E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water +1F6B2 ; Emoji # E0.6 [1] (🚲) bicycle +1F6B3..1F6B5 ; Emoji # E1.0 [3] (🚳..🚵) no bicycles..person mountain biking +1F6B6 ; Emoji # E0.6 [1] (🚶) person walking +1F6B7..1F6B8 ; Emoji # E1.0 [2] (🚷..🚸) no pedestrians..children crossing +1F6B9..1F6BE ; Emoji # E0.6 [6] (🚹..🚾) men’s room..water closet +1F6BF ; Emoji # E1.0 [1] (🚿) shower +1F6C0 ; Emoji # E0.6 [1] (🛀) person taking bath +1F6C1..1F6C5 ; Emoji # E1.0 [5] (🛁..🛅) bathtub..left luggage +1F6CB ; Emoji # E0.7 [1] (🛋️) couch and lamp +1F6CC ; Emoji # E1.0 [1] (🛌) person in bed +1F6CD..1F6CF ; Emoji # E0.7 [3] (🛍️..🛏️) shopping bags..bed +1F6D0 ; Emoji # E1.0 [1] (🛐) place of worship +1F6D1..1F6D2 ; Emoji # E3.0 [2] (🛑..🛒) stop sign..shopping cart +1F6D5 ; Emoji # E12.0 [1] (🛕) hindu temple +1F6D6..1F6D7 ; Emoji # E13.0 [2] (🛖..🛗) hut..elevator +1F6DC ; Emoji # E15.0 [1] (🛜) wireless +1F6DD..1F6DF ; Emoji # E14.0 [3] (🛝..🛟) playground slide..ring buoy +1F6E0..1F6E5 ; Emoji # E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat +1F6E9 ; Emoji # E0.7 [1] (🛩️) small airplane +1F6EB..1F6EC ; Emoji # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival +1F6F0 ; Emoji # E0.7 [1] (🛰️) satellite +1F6F3 ; Emoji # E0.7 [1] (🛳️) passenger ship +1F6F4..1F6F6 ; Emoji # E3.0 [3] (🛴..🛶) kick scooter..canoe +1F6F7..1F6F8 ; Emoji # E5.0 [2] (🛷..🛸) sled..flying saucer +1F6F9 ; Emoji # E11.0 [1] (🛹) skateboard +1F6FA ; Emoji # E12.0 [1] (🛺) auto rickshaw +1F6FB..1F6FC ; Emoji # E13.0 [2] (🛻..🛼) pickup truck..roller skate +1F7E0..1F7EB ; Emoji # E12.0 [12] (🟠..🟫) orange circle..brown square +1F7F0 ; Emoji # E14.0 [1] (🟰) heavy equals sign +1F90C ; Emoji # E13.0 [1] (🤌) pinched fingers +1F90D..1F90F ; Emoji # E12.0 [3] (🤍..🤏) white heart..pinching hand +1F910..1F918 ; Emoji # E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns +1F919..1F91E ; Emoji # E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Emoji # E5.0 [1] (🤟) love-you gesture +1F920..1F927 ; Emoji # E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face +1F928..1F92F ; Emoji # E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head +1F930 ; Emoji # E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Emoji # E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F93A ; Emoji # E3.0 [8] (🤳..🤺) selfie..person fencing +1F93C..1F93E ; Emoji # E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F93F ; Emoji # E12.0 [1] (🤿) diving mask +1F940..1F945 ; Emoji # E3.0 [6] (🥀..🥅) wilted flower..goal net +1F947..1F94B ; Emoji # E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform +1F94C ; Emoji # E5.0 [1] (🥌) curling stone +1F94D..1F94F ; Emoji # E11.0 [3] (🥍..🥏) lacrosse..flying disc +1F950..1F95E ; Emoji # E3.0 [15] (🥐..🥞) croissant..pancakes +1F95F..1F96B ; Emoji # E5.0 [13] (🥟..🥫) dumpling..canned food +1F96C..1F970 ; Emoji # E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts +1F971 ; Emoji # E12.0 [1] (🥱) yawning face +1F972 ; Emoji # E13.0 [1] (🥲) smiling face with tear +1F973..1F976 ; Emoji # E11.0 [4] (🥳..🥶) partying face..cold face +1F977..1F978 ; Emoji # E13.0 [2] (🥷..🥸) ninja..disguised face +1F979 ; Emoji # E14.0 [1] (🥹) face holding back tears +1F97A ; Emoji # E11.0 [1] (🥺) pleading face +1F97B ; Emoji # E12.0 [1] (🥻) sari +1F97C..1F97F ; Emoji # E11.0 [4] (🥼..🥿) lab coat..flat shoe +1F980..1F984 ; Emoji # E1.0 [5] (🦀..🦄) crab..unicorn +1F985..1F991 ; Emoji # E3.0 [13] (🦅..🦑) eagle..squid +1F992..1F997 ; Emoji # E5.0 [6] (🦒..🦗) giraffe..cricket +1F998..1F9A2 ; Emoji # E11.0 [11] (🦘..🦢) kangaroo..swan +1F9A3..1F9A4 ; Emoji # E13.0 [2] (🦣..🦤) mammoth..dodo +1F9A5..1F9AA ; Emoji # E12.0 [6] (🦥..🦪) sloth..oyster +1F9AB..1F9AD ; Emoji # E13.0 [3] (🦫..🦭) beaver..seal +1F9AE..1F9AF ; Emoji # E12.0 [2] (🦮..🦯) guide dog..white cane +1F9B0..1F9B9 ; Emoji # E11.0 [10] (🦰..🦹) red hair..supervillain +1F9BA..1F9BF ; Emoji # E12.0 [6] (🦺..🦿) safety vest..mechanical leg +1F9C0 ; Emoji # E1.0 [1] (🧀) cheese wedge +1F9C1..1F9C2 ; Emoji # E11.0 [2] (🧁..🧂) cupcake..salt +1F9C3..1F9CA ; Emoji # E12.0 [8] (🧃..🧊) beverage box..ice +1F9CB ; Emoji # E13.0 [1] (🧋) bubble tea +1F9CC ; Emoji # E14.0 [1] (🧌) troll +1F9CD..1F9CF ; Emoji # E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D0..1F9E6 ; Emoji # E5.0 [23] (🧐..🧦) face with monocle..socks +1F9E7..1F9FF ; Emoji # E11.0 [25] (🧧..🧿) red envelope..nazar amulet +1FA70..1FA73 ; Emoji # E12.0 [4] (🩰..🩳) ballet shoes..shorts +1FA74 ; Emoji # E13.0 [1] (🩴) thong sandal +1FA75..1FA77 ; Emoji # E15.0 [3] (🩵..🩷) light blue heart..pink heart +1FA78..1FA7A ; Emoji # E12.0 [3] (🩸..🩺) drop of blood..stethoscope +1FA7B..1FA7C ; Emoji # E14.0 [2] (🩻..🩼) x-ray..crutch +1FA80..1FA82 ; Emoji # E12.0 [3] (🪀..🪂) yo-yo..parachute +1FA83..1FA86 ; Emoji # E13.0 [4] (🪃..🪆) boomerang..nesting dolls +1FA87..1FA88 ; Emoji # E15.0 [2] (🪇..🪈) maracas..flute +1FA90..1FA95 ; Emoji # E12.0 [6] (🪐..🪕) ringed planet..banjo +1FA96..1FAA8 ; Emoji # E13.0 [19] (🪖..🪨) military helmet..rock +1FAA9..1FAAC ; Emoji # E14.0 [4] (🪩..🪬) mirror ball..hamsa +1FAAD..1FAAF ; Emoji # E15.0 [3] (🪭..🪯) folding hand fan..khanda +1FAB0..1FAB6 ; Emoji # E13.0 [7] (🪰..🪶) fly..feather +1FAB7..1FABA ; Emoji # E14.0 [4] (🪷..🪺) lotus..nest with eggs +1FABB..1FABD ; Emoji # E15.0 [3] (🪻..🪽) hyacinth..wing +1FABF ; Emoji # E15.0 [1] (🪿) goose +1FAC0..1FAC2 ; Emoji # E13.0 [3] (🫀..🫂) anatomical heart..people hugging +1FAC3..1FAC5 ; Emoji # E14.0 [3] (🫃..🫅) pregnant man..person with crown +1FACE..1FACF ; Emoji # E15.0 [2] (🫎..🫏) moose..donkey +1FAD0..1FAD6 ; Emoji # E13.0 [7] (🫐..🫖) blueberries..teapot +1FAD7..1FAD9 ; Emoji # E14.0 [3] (🫗..🫙) pouring liquid..jar +1FADA..1FADB ; Emoji # E15.0 [2] (🫚..🫛) ginger root..pea pod +1FAE0..1FAE7 ; Emoji # E14.0 [8] (🫠..🫧) melting face..bubbles +1FAE8 ; Emoji # E15.0 [1] (🫨) shaking face +1FAF0..1FAF6 ; Emoji # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands +1FAF7..1FAF8 ; Emoji # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand + +# Total elements: 1424 + +# ================================================ + +# All omitted code points have Emoji_Presentation=No + +231A..231B ; Emoji_Presentation # E0.6 [2] (⌚..⌛) watch..hourglass done +23E9..23EC ; Emoji_Presentation # E0.6 [4] (⏩..⏬) fast-forward button..fast down button +23F0 ; Emoji_Presentation # E0.6 [1] (⏰) alarm clock +23F3 ; Emoji_Presentation # E0.6 [1] (⏳) hourglass not done +25FD..25FE ; Emoji_Presentation # E0.6 [2] (◽..◾) white medium-small square..black medium-small square +2614..2615 ; Emoji_Presentation # E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage +2648..2653 ; Emoji_Presentation # E0.6 [12] (♈..♓) Aries..Pisces +267F ; Emoji_Presentation # E0.6 [1] (♿) wheelchair symbol +2693 ; Emoji_Presentation # E0.6 [1] (⚓) anchor +26A1 ; Emoji_Presentation # E0.6 [1] (⚡) high voltage +26AA..26AB ; Emoji_Presentation # E0.6 [2] (⚪..⚫) white circle..black circle +26BD..26BE ; Emoji_Presentation # E0.6 [2] (⚽..⚾) soccer ball..baseball +26C4..26C5 ; Emoji_Presentation # E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud +26CE ; Emoji_Presentation # E0.6 [1] (⛎) Ophiuchus +26D4 ; Emoji_Presentation # E0.6 [1] (⛔) no entry +26EA ; Emoji_Presentation # E0.6 [1] (⛪) church +26F2..26F3 ; Emoji_Presentation # E0.6 [2] (⛲..⛳) fountain..flag in hole +26F5 ; Emoji_Presentation # E0.6 [1] (⛵) sailboat +26FA ; Emoji_Presentation # E0.6 [1] (⛺) tent +26FD ; Emoji_Presentation # E0.6 [1] (⛽) fuel pump +2705 ; Emoji_Presentation # E0.6 [1] (✅) check mark button +270A..270B ; Emoji_Presentation # E0.6 [2] (✊..✋) raised fist..raised hand +2728 ; Emoji_Presentation # E0.6 [1] (✨) sparkles +274C ; Emoji_Presentation # E0.6 [1] (❌) cross mark +274E ; Emoji_Presentation # E0.6 [1] (❎) cross mark button +2753..2755 ; Emoji_Presentation # E0.6 [3] (❓..❕) red question mark..white exclamation mark +2757 ; Emoji_Presentation # E0.6 [1] (❗) red exclamation mark +2795..2797 ; Emoji_Presentation # E0.6 [3] (➕..➗) plus..divide +27B0 ; Emoji_Presentation # E0.6 [1] (➰) curly loop +27BF ; Emoji_Presentation # E1.0 [1] (➿) double curly loop +2B1B..2B1C ; Emoji_Presentation # E0.6 [2] (⬛..⬜) black large square..white large square +2B50 ; Emoji_Presentation # E0.6 [1] (⭐) star +2B55 ; Emoji_Presentation # E0.6 [1] (⭕) hollow red circle +1F004 ; Emoji_Presentation # E0.6 [1] (🀄) mahjong red dragon +1F0CF ; Emoji_Presentation # E0.6 [1] (🃏) joker +1F18E ; Emoji_Presentation # E0.6 [1] (🆎) AB button (blood type) +1F191..1F19A ; Emoji_Presentation # E0.6 [10] (🆑..🆚) CL button..VS button +1F1E6..1F1FF ; Emoji_Presentation # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z +1F201 ; Emoji_Presentation # E0.6 [1] (🈁) Japanese “here” button +1F21A ; Emoji_Presentation # E0.6 [1] (🈚) Japanese “free of charge” button +1F22F ; Emoji_Presentation # E0.6 [1] (🈯) Japanese “reserved” button +1F232..1F236 ; Emoji_Presentation # E0.6 [5] (🈲..🈶) Japanese “prohibited” button..Japanese “not free of charge” button +1F238..1F23A ; Emoji_Presentation # E0.6 [3] (🈸..🈺) Japanese “application” button..Japanese “open for business” button +1F250..1F251 ; Emoji_Presentation # E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button +1F300..1F30C ; Emoji_Presentation # E0.6 [13] (🌀..🌌) cyclone..milky way +1F30D..1F30E ; Emoji_Presentation # E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas +1F30F ; Emoji_Presentation # E0.6 [1] (🌏) globe showing Asia-Australia +1F310 ; Emoji_Presentation # E1.0 [1] (🌐) globe with meridians +1F311 ; Emoji_Presentation # E0.6 [1] (🌑) new moon +1F312 ; Emoji_Presentation # E1.0 [1] (🌒) waxing crescent moon +1F313..1F315 ; Emoji_Presentation # E0.6 [3] (🌓..🌕) first quarter moon..full moon +1F316..1F318 ; Emoji_Presentation # E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon +1F319 ; Emoji_Presentation # E0.6 [1] (🌙) crescent moon +1F31A ; Emoji_Presentation # E1.0 [1] (🌚) new moon face +1F31B ; Emoji_Presentation # E0.6 [1] (🌛) first quarter moon face +1F31C ; Emoji_Presentation # E0.7 [1] (🌜) last quarter moon face +1F31D..1F31E ; Emoji_Presentation # E1.0 [2] (🌝..🌞) full moon face..sun with face +1F31F..1F320 ; Emoji_Presentation # E0.6 [2] (🌟..🌠) glowing star..shooting star +1F32D..1F32F ; Emoji_Presentation # E1.0 [3] (🌭..🌯) hot dog..burrito +1F330..1F331 ; Emoji_Presentation # E0.6 [2] (🌰..🌱) chestnut..seedling +1F332..1F333 ; Emoji_Presentation # E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree +1F334..1F335 ; Emoji_Presentation # E0.6 [2] (🌴..🌵) palm tree..cactus +1F337..1F34A ; Emoji_Presentation # E0.6 [20] (🌷..🍊) tulip..tangerine +1F34B ; Emoji_Presentation # E1.0 [1] (🍋) lemon +1F34C..1F34F ; Emoji_Presentation # E0.6 [4] (🍌..🍏) banana..green apple +1F350 ; Emoji_Presentation # E1.0 [1] (🍐) pear +1F351..1F37B ; Emoji_Presentation # E0.6 [43] (🍑..🍻) peach..clinking beer mugs +1F37C ; Emoji_Presentation # E1.0 [1] (🍼) baby bottle +1F37E..1F37F ; Emoji_Presentation # E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn +1F380..1F393 ; Emoji_Presentation # E0.6 [20] (🎀..🎓) ribbon..graduation cap +1F3A0..1F3C4 ; Emoji_Presentation # E0.6 [37] (🎠..🏄) carousel horse..person surfing +1F3C5 ; Emoji_Presentation # E1.0 [1] (🏅) sports medal +1F3C6 ; Emoji_Presentation # E0.6 [1] (🏆) trophy +1F3C7 ; Emoji_Presentation # E1.0 [1] (🏇) horse racing +1F3C8 ; Emoji_Presentation # E0.6 [1] (🏈) american football +1F3C9 ; Emoji_Presentation # E1.0 [1] (🏉) rugby football +1F3CA ; Emoji_Presentation # E0.6 [1] (🏊) person swimming +1F3CF..1F3D3 ; Emoji_Presentation # E1.0 [5] (🏏..🏓) cricket game..ping pong +1F3E0..1F3E3 ; Emoji_Presentation # E0.6 [4] (🏠..🏣) house..Japanese post office +1F3E4 ; Emoji_Presentation # E1.0 [1] (🏤) post office +1F3E5..1F3F0 ; Emoji_Presentation # E0.6 [12] (🏥..🏰) hospital..castle +1F3F4 ; Emoji_Presentation # E1.0 [1] (🏴) black flag +1F3F8..1F407 ; Emoji_Presentation # E1.0 [16] (🏸..🐇) badminton..rabbit +1F408 ; Emoji_Presentation # E0.7 [1] (🐈) cat +1F409..1F40B ; Emoji_Presentation # E1.0 [3] (🐉..🐋) dragon..whale +1F40C..1F40E ; Emoji_Presentation # E0.6 [3] (🐌..🐎) snail..horse +1F40F..1F410 ; Emoji_Presentation # E1.0 [2] (🐏..🐐) ram..goat +1F411..1F412 ; Emoji_Presentation # E0.6 [2] (🐑..🐒) ewe..monkey +1F413 ; Emoji_Presentation # E1.0 [1] (🐓) rooster +1F414 ; Emoji_Presentation # E0.6 [1] (🐔) chicken +1F415 ; Emoji_Presentation # E0.7 [1] (🐕) dog +1F416 ; Emoji_Presentation # E1.0 [1] (🐖) pig +1F417..1F429 ; Emoji_Presentation # E0.6 [19] (🐗..🐩) boar..poodle +1F42A ; Emoji_Presentation # E1.0 [1] (🐪) camel +1F42B..1F43E ; Emoji_Presentation # E0.6 [20] (🐫..🐾) two-hump camel..paw prints +1F440 ; Emoji_Presentation # E0.6 [1] (👀) eyes +1F442..1F464 ; Emoji_Presentation # E0.6 [35] (👂..👤) ear..bust in silhouette +1F465 ; Emoji_Presentation # E1.0 [1] (👥) busts in silhouette +1F466..1F46B ; Emoji_Presentation # E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Emoji_Presentation # E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F4AC ; Emoji_Presentation # E0.6 [63] (👮..💬) police officer..speech balloon +1F4AD ; Emoji_Presentation # E1.0 [1] (💭) thought balloon +1F4AE..1F4B5 ; Emoji_Presentation # E0.6 [8] (💮..💵) white flower..dollar banknote +1F4B6..1F4B7 ; Emoji_Presentation # E1.0 [2] (💶..💷) euro banknote..pound banknote +1F4B8..1F4EB ; Emoji_Presentation # E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag +1F4EC..1F4ED ; Emoji_Presentation # E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag +1F4EE ; Emoji_Presentation # E0.6 [1] (📮) postbox +1F4EF ; Emoji_Presentation # E1.0 [1] (📯) postal horn +1F4F0..1F4F4 ; Emoji_Presentation # E0.6 [5] (📰..📴) newspaper..mobile phone off +1F4F5 ; Emoji_Presentation # E1.0 [1] (📵) no mobile phones +1F4F6..1F4F7 ; Emoji_Presentation # E0.6 [2] (📶..📷) antenna bars..camera +1F4F8 ; Emoji_Presentation # E1.0 [1] (📸) camera with flash +1F4F9..1F4FC ; Emoji_Presentation # E0.6 [4] (📹..📼) video camera..videocassette +1F4FF..1F502 ; Emoji_Presentation # E1.0 [4] (📿..🔂) prayer beads..repeat single button +1F503 ; Emoji_Presentation # E0.6 [1] (🔃) clockwise vertical arrows +1F504..1F507 ; Emoji_Presentation # E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker +1F508 ; Emoji_Presentation # E0.7 [1] (🔈) speaker low volume +1F509 ; Emoji_Presentation # E1.0 [1] (🔉) speaker medium volume +1F50A..1F514 ; Emoji_Presentation # E0.6 [11] (🔊..🔔) speaker high volume..bell +1F515 ; Emoji_Presentation # E1.0 [1] (🔕) bell with slash +1F516..1F52B ; Emoji_Presentation # E0.6 [22] (🔖..🔫) bookmark..water pistol +1F52C..1F52D ; Emoji_Presentation # E1.0 [2] (🔬..🔭) microscope..telescope +1F52E..1F53D ; Emoji_Presentation # E0.6 [16] (🔮..🔽) crystal ball..downwards button +1F54B..1F54E ; Emoji_Presentation # E1.0 [4] (🕋..🕎) kaaba..menorah +1F550..1F55B ; Emoji_Presentation # E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock +1F55C..1F567 ; Emoji_Presentation # E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty +1F57A ; Emoji_Presentation # E3.0 [1] (🕺) man dancing +1F595..1F596 ; Emoji_Presentation # E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F5A4 ; Emoji_Presentation # E3.0 [1] (🖤) black heart +1F5FB..1F5FF ; Emoji_Presentation # E0.6 [5] (🗻..🗿) mount fuji..moai +1F600 ; Emoji_Presentation # E1.0 [1] (😀) grinning face +1F601..1F606 ; Emoji_Presentation # E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face +1F607..1F608 ; Emoji_Presentation # E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns +1F609..1F60D ; Emoji_Presentation # E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes +1F60E ; Emoji_Presentation # E1.0 [1] (😎) smiling face with sunglasses +1F60F ; Emoji_Presentation # E0.6 [1] (😏) smirking face +1F610 ; Emoji_Presentation # E0.7 [1] (😐) neutral face +1F611 ; Emoji_Presentation # E1.0 [1] (😑) expressionless face +1F612..1F614 ; Emoji_Presentation # E0.6 [3] (😒..😔) unamused face..pensive face +1F615 ; Emoji_Presentation # E1.0 [1] (😕) confused face +1F616 ; Emoji_Presentation # E0.6 [1] (😖) confounded face +1F617 ; Emoji_Presentation # E1.0 [1] (😗) kissing face +1F618 ; Emoji_Presentation # E0.6 [1] (😘) face blowing a kiss +1F619 ; Emoji_Presentation # E1.0 [1] (😙) kissing face with smiling eyes +1F61A ; Emoji_Presentation # E0.6 [1] (😚) kissing face with closed eyes +1F61B ; Emoji_Presentation # E1.0 [1] (😛) face with tongue +1F61C..1F61E ; Emoji_Presentation # E0.6 [3] (😜..😞) winking face with tongue..disappointed face +1F61F ; Emoji_Presentation # E1.0 [1] (😟) worried face +1F620..1F625 ; Emoji_Presentation # E0.6 [6] (😠..😥) angry face..sad but relieved face +1F626..1F627 ; Emoji_Presentation # E1.0 [2] (😦..😧) frowning face with open mouth..anguished face +1F628..1F62B ; Emoji_Presentation # E0.6 [4] (😨..😫) fearful face..tired face +1F62C ; Emoji_Presentation # E1.0 [1] (😬) grimacing face +1F62D ; Emoji_Presentation # E0.6 [1] (😭) loudly crying face +1F62E..1F62F ; Emoji_Presentation # E1.0 [2] (😮..😯) face with open mouth..hushed face +1F630..1F633 ; Emoji_Presentation # E0.6 [4] (😰..😳) anxious face with sweat..flushed face +1F634 ; Emoji_Presentation # E1.0 [1] (😴) sleeping face +1F635 ; Emoji_Presentation # E0.6 [1] (😵) face with crossed-out eyes +1F636 ; Emoji_Presentation # E1.0 [1] (😶) face without mouth +1F637..1F640 ; Emoji_Presentation # E0.6 [10] (😷..🙀) face with medical mask..weary cat +1F641..1F644 ; Emoji_Presentation # E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes +1F645..1F64F ; Emoji_Presentation # E0.6 [11] (🙅..🙏) person gesturing NO..folded hands +1F680 ; Emoji_Presentation # E0.6 [1] (🚀) rocket +1F681..1F682 ; Emoji_Presentation # E1.0 [2] (🚁..🚂) helicopter..locomotive +1F683..1F685 ; Emoji_Presentation # E0.6 [3] (🚃..🚅) railway car..bullet train +1F686 ; Emoji_Presentation # E1.0 [1] (🚆) train +1F687 ; Emoji_Presentation # E0.6 [1] (🚇) metro +1F688 ; Emoji_Presentation # E1.0 [1] (🚈) light rail +1F689 ; Emoji_Presentation # E0.6 [1] (🚉) station +1F68A..1F68B ; Emoji_Presentation # E1.0 [2] (🚊..🚋) tram..tram car +1F68C ; Emoji_Presentation # E0.6 [1] (🚌) bus +1F68D ; Emoji_Presentation # E0.7 [1] (🚍) oncoming bus +1F68E ; Emoji_Presentation # E1.0 [1] (🚎) trolleybus +1F68F ; Emoji_Presentation # E0.6 [1] (🚏) bus stop +1F690 ; Emoji_Presentation # E1.0 [1] (🚐) minibus +1F691..1F693 ; Emoji_Presentation # E0.6 [3] (🚑..🚓) ambulance..police car +1F694 ; Emoji_Presentation # E0.7 [1] (🚔) oncoming police car +1F695 ; Emoji_Presentation # E0.6 [1] (🚕) taxi +1F696 ; Emoji_Presentation # E1.0 [1] (🚖) oncoming taxi +1F697 ; Emoji_Presentation # E0.6 [1] (🚗) automobile +1F698 ; Emoji_Presentation # E0.7 [1] (🚘) oncoming automobile +1F699..1F69A ; Emoji_Presentation # E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck +1F69B..1F6A1 ; Emoji_Presentation # E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway +1F6A2 ; Emoji_Presentation # E0.6 [1] (🚢) ship +1F6A3 ; Emoji_Presentation # E1.0 [1] (🚣) person rowing boat +1F6A4..1F6A5 ; Emoji_Presentation # E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light +1F6A6 ; Emoji_Presentation # E1.0 [1] (🚦) vertical traffic light +1F6A7..1F6AD ; Emoji_Presentation # E0.6 [7] (🚧..🚭) construction..no smoking +1F6AE..1F6B1 ; Emoji_Presentation # E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water +1F6B2 ; Emoji_Presentation # E0.6 [1] (🚲) bicycle +1F6B3..1F6B5 ; Emoji_Presentation # E1.0 [3] (🚳..🚵) no bicycles..person mountain biking +1F6B6 ; Emoji_Presentation # E0.6 [1] (🚶) person walking +1F6B7..1F6B8 ; Emoji_Presentation # E1.0 [2] (🚷..🚸) no pedestrians..children crossing +1F6B9..1F6BE ; Emoji_Presentation # E0.6 [6] (🚹..🚾) men’s room..water closet +1F6BF ; Emoji_Presentation # E1.0 [1] (🚿) shower +1F6C0 ; Emoji_Presentation # E0.6 [1] (🛀) person taking bath +1F6C1..1F6C5 ; Emoji_Presentation # E1.0 [5] (🛁..🛅) bathtub..left luggage +1F6CC ; Emoji_Presentation # E1.0 [1] (🛌) person in bed +1F6D0 ; Emoji_Presentation # E1.0 [1] (🛐) place of worship +1F6D1..1F6D2 ; Emoji_Presentation # E3.0 [2] (🛑..🛒) stop sign..shopping cart +1F6D5 ; Emoji_Presentation # E12.0 [1] (🛕) hindu temple +1F6D6..1F6D7 ; Emoji_Presentation # E13.0 [2] (🛖..🛗) hut..elevator +1F6DC ; Emoji_Presentation # E15.0 [1] (🛜) wireless +1F6DD..1F6DF ; Emoji_Presentation # E14.0 [3] (🛝..🛟) playground slide..ring buoy +1F6EB..1F6EC ; Emoji_Presentation # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival +1F6F4..1F6F6 ; Emoji_Presentation # E3.0 [3] (🛴..🛶) kick scooter..canoe +1F6F7..1F6F8 ; Emoji_Presentation # E5.0 [2] (🛷..🛸) sled..flying saucer +1F6F9 ; Emoji_Presentation # E11.0 [1] (🛹) skateboard +1F6FA ; Emoji_Presentation # E12.0 [1] (🛺) auto rickshaw +1F6FB..1F6FC ; Emoji_Presentation # E13.0 [2] (🛻..🛼) pickup truck..roller skate +1F7E0..1F7EB ; Emoji_Presentation # E12.0 [12] (🟠..🟫) orange circle..brown square +1F7F0 ; Emoji_Presentation # E14.0 [1] (🟰) heavy equals sign +1F90C ; Emoji_Presentation # E13.0 [1] (🤌) pinched fingers +1F90D..1F90F ; Emoji_Presentation # E12.0 [3] (🤍..🤏) white heart..pinching hand +1F910..1F918 ; Emoji_Presentation # E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns +1F919..1F91E ; Emoji_Presentation # E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Emoji_Presentation # E5.0 [1] (🤟) love-you gesture +1F920..1F927 ; Emoji_Presentation # E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face +1F928..1F92F ; Emoji_Presentation # E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head +1F930 ; Emoji_Presentation # E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Emoji_Presentation # E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F93A ; Emoji_Presentation # E3.0 [8] (🤳..🤺) selfie..person fencing +1F93C..1F93E ; Emoji_Presentation # E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F93F ; Emoji_Presentation # E12.0 [1] (🤿) diving mask +1F940..1F945 ; Emoji_Presentation # E3.0 [6] (🥀..🥅) wilted flower..goal net +1F947..1F94B ; Emoji_Presentation # E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform +1F94C ; Emoji_Presentation # E5.0 [1] (🥌) curling stone +1F94D..1F94F ; Emoji_Presentation # E11.0 [3] (🥍..🥏) lacrosse..flying disc +1F950..1F95E ; Emoji_Presentation # E3.0 [15] (🥐..🥞) croissant..pancakes +1F95F..1F96B ; Emoji_Presentation # E5.0 [13] (🥟..🥫) dumpling..canned food +1F96C..1F970 ; Emoji_Presentation # E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts +1F971 ; Emoji_Presentation # E12.0 [1] (🥱) yawning face +1F972 ; Emoji_Presentation # E13.0 [1] (🥲) smiling face with tear +1F973..1F976 ; Emoji_Presentation # E11.0 [4] (🥳..🥶) partying face..cold face +1F977..1F978 ; Emoji_Presentation # E13.0 [2] (🥷..🥸) ninja..disguised face +1F979 ; Emoji_Presentation # E14.0 [1] (🥹) face holding back tears +1F97A ; Emoji_Presentation # E11.0 [1] (🥺) pleading face +1F97B ; Emoji_Presentation # E12.0 [1] (🥻) sari +1F97C..1F97F ; Emoji_Presentation # E11.0 [4] (🥼..🥿) lab coat..flat shoe +1F980..1F984 ; Emoji_Presentation # E1.0 [5] (🦀..🦄) crab..unicorn +1F985..1F991 ; Emoji_Presentation # E3.0 [13] (🦅..🦑) eagle..squid +1F992..1F997 ; Emoji_Presentation # E5.0 [6] (🦒..🦗) giraffe..cricket +1F998..1F9A2 ; Emoji_Presentation # E11.0 [11] (🦘..🦢) kangaroo..swan +1F9A3..1F9A4 ; Emoji_Presentation # E13.0 [2] (🦣..🦤) mammoth..dodo +1F9A5..1F9AA ; Emoji_Presentation # E12.0 [6] (🦥..🦪) sloth..oyster +1F9AB..1F9AD ; Emoji_Presentation # E13.0 [3] (🦫..🦭) beaver..seal +1F9AE..1F9AF ; Emoji_Presentation # E12.0 [2] (🦮..🦯) guide dog..white cane +1F9B0..1F9B9 ; Emoji_Presentation # E11.0 [10] (🦰..🦹) red hair..supervillain +1F9BA..1F9BF ; Emoji_Presentation # E12.0 [6] (🦺..🦿) safety vest..mechanical leg +1F9C0 ; Emoji_Presentation # E1.0 [1] (🧀) cheese wedge +1F9C1..1F9C2 ; Emoji_Presentation # E11.0 [2] (🧁..🧂) cupcake..salt +1F9C3..1F9CA ; Emoji_Presentation # E12.0 [8] (🧃..🧊) beverage box..ice +1F9CB ; Emoji_Presentation # E13.0 [1] (🧋) bubble tea +1F9CC ; Emoji_Presentation # E14.0 [1] (🧌) troll +1F9CD..1F9CF ; Emoji_Presentation # E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D0..1F9E6 ; Emoji_Presentation # E5.0 [23] (🧐..🧦) face with monocle..socks +1F9E7..1F9FF ; Emoji_Presentation # E11.0 [25] (🧧..🧿) red envelope..nazar amulet +1FA70..1FA73 ; Emoji_Presentation # E12.0 [4] (🩰..🩳) ballet shoes..shorts +1FA74 ; Emoji_Presentation # E13.0 [1] (🩴) thong sandal +1FA75..1FA77 ; Emoji_Presentation # E15.0 [3] (🩵..🩷) light blue heart..pink heart +1FA78..1FA7A ; Emoji_Presentation # E12.0 [3] (🩸..🩺) drop of blood..stethoscope +1FA7B..1FA7C ; Emoji_Presentation # E14.0 [2] (🩻..🩼) x-ray..crutch +1FA80..1FA82 ; Emoji_Presentation # E12.0 [3] (🪀..🪂) yo-yo..parachute +1FA83..1FA86 ; Emoji_Presentation # E13.0 [4] (🪃..🪆) boomerang..nesting dolls +1FA87..1FA88 ; Emoji_Presentation # E15.0 [2] (🪇..🪈) maracas..flute +1FA90..1FA95 ; Emoji_Presentation # E12.0 [6] (🪐..🪕) ringed planet..banjo +1FA96..1FAA8 ; Emoji_Presentation # E13.0 [19] (🪖..🪨) military helmet..rock +1FAA9..1FAAC ; Emoji_Presentation # E14.0 [4] (🪩..🪬) mirror ball..hamsa +1FAAD..1FAAF ; Emoji_Presentation # E15.0 [3] (🪭..🪯) folding hand fan..khanda +1FAB0..1FAB6 ; Emoji_Presentation # E13.0 [7] (🪰..🪶) fly..feather +1FAB7..1FABA ; Emoji_Presentation # E14.0 [4] (🪷..🪺) lotus..nest with eggs +1FABB..1FABD ; Emoji_Presentation # E15.0 [3] (🪻..🪽) hyacinth..wing +1FABF ; Emoji_Presentation # E15.0 [1] (🪿) goose +1FAC0..1FAC2 ; Emoji_Presentation # E13.0 [3] (🫀..🫂) anatomical heart..people hugging +1FAC3..1FAC5 ; Emoji_Presentation # E14.0 [3] (🫃..🫅) pregnant man..person with crown +1FACE..1FACF ; Emoji_Presentation # E15.0 [2] (🫎..🫏) moose..donkey +1FAD0..1FAD6 ; Emoji_Presentation # E13.0 [7] (🫐..🫖) blueberries..teapot +1FAD7..1FAD9 ; Emoji_Presentation # E14.0 [3] (🫗..🫙) pouring liquid..jar +1FADA..1FADB ; Emoji_Presentation # E15.0 [2] (🫚..🫛) ginger root..pea pod +1FAE0..1FAE7 ; Emoji_Presentation # E14.0 [8] (🫠..🫧) melting face..bubbles +1FAE8 ; Emoji_Presentation # E15.0 [1] (🫨) shaking face +1FAF0..1FAF6 ; Emoji_Presentation # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands +1FAF7..1FAF8 ; Emoji_Presentation # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand + +# Total elements: 1205 + +# ================================================ + +# All omitted code points have Emoji_Modifier=No + +1F3FB..1F3FF ; Emoji_Modifier # E1.0 [5] (🏻..🏿) light skin tone..dark skin tone + +# Total elements: 5 + +# ================================================ + +# All omitted code points have Emoji_Modifier_Base=No + +261D ; Emoji_Modifier_Base # E0.6 [1] (☝️) index pointing up +26F9 ; Emoji_Modifier_Base # E0.7 [1] (⛹️) person bouncing ball +270A..270C ; Emoji_Modifier_Base # E0.6 [3] (✊..✌️) raised fist..victory hand +270D ; Emoji_Modifier_Base # E0.7 [1] (✍️) writing hand +1F385 ; Emoji_Modifier_Base # E0.6 [1] (🎅) Santa Claus +1F3C2..1F3C4 ; Emoji_Modifier_Base # E0.6 [3] (🏂..🏄) snowboarder..person surfing +1F3C7 ; Emoji_Modifier_Base # E1.0 [1] (🏇) horse racing +1F3CA ; Emoji_Modifier_Base # E0.6 [1] (🏊) person swimming +1F3CB..1F3CC ; Emoji_Modifier_Base # E0.7 [2] (🏋️..🏌️) person lifting weights..person golfing +1F442..1F443 ; Emoji_Modifier_Base # E0.6 [2] (👂..👃) ear..nose +1F446..1F450 ; Emoji_Modifier_Base # E0.6 [11] (👆..👐) backhand index pointing up..open hands +1F466..1F46B ; Emoji_Modifier_Base # E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Emoji_Modifier_Base # E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F478 ; Emoji_Modifier_Base # E0.6 [11] (👮..👸) police officer..princess +1F47C ; Emoji_Modifier_Base # E0.6 [1] (👼) baby angel +1F481..1F483 ; Emoji_Modifier_Base # E0.6 [3] (💁..💃) person tipping hand..woman dancing +1F485..1F487 ; Emoji_Modifier_Base # E0.6 [3] (💅..💇) nail polish..person getting haircut +1F48F ; Emoji_Modifier_Base # E0.6 [1] (💏) kiss +1F491 ; Emoji_Modifier_Base # E0.6 [1] (💑) couple with heart +1F4AA ; Emoji_Modifier_Base # E0.6 [1] (💪) flexed biceps +1F574..1F575 ; Emoji_Modifier_Base # E0.7 [2] (🕴️..🕵️) person in suit levitating..detective +1F57A ; Emoji_Modifier_Base # E3.0 [1] (🕺) man dancing +1F590 ; Emoji_Modifier_Base # E0.7 [1] (🖐️) hand with fingers splayed +1F595..1F596 ; Emoji_Modifier_Base # E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F645..1F647 ; Emoji_Modifier_Base # E0.6 [3] (🙅..🙇) person gesturing NO..person bowing +1F64B..1F64F ; Emoji_Modifier_Base # E0.6 [5] (🙋..🙏) person raising hand..folded hands +1F6A3 ; Emoji_Modifier_Base # E1.0 [1] (🚣) person rowing boat +1F6B4..1F6B5 ; Emoji_Modifier_Base # E1.0 [2] (🚴..🚵) person biking..person mountain biking +1F6B6 ; Emoji_Modifier_Base # E0.6 [1] (🚶) person walking +1F6C0 ; Emoji_Modifier_Base # E0.6 [1] (🛀) person taking bath +1F6CC ; Emoji_Modifier_Base # E1.0 [1] (🛌) person in bed +1F90C ; Emoji_Modifier_Base # E13.0 [1] (🤌) pinched fingers +1F90F ; Emoji_Modifier_Base # E12.0 [1] (🤏) pinching hand +1F918 ; Emoji_Modifier_Base # E1.0 [1] (🤘) sign of the horns +1F919..1F91E ; Emoji_Modifier_Base # E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Emoji_Modifier_Base # E5.0 [1] (🤟) love-you gesture +1F926 ; Emoji_Modifier_Base # E3.0 [1] (🤦) person facepalming +1F930 ; Emoji_Modifier_Base # E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Emoji_Modifier_Base # E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F939 ; Emoji_Modifier_Base # E3.0 [7] (🤳..🤹) selfie..person juggling +1F93C..1F93E ; Emoji_Modifier_Base # E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F977 ; Emoji_Modifier_Base # E13.0 [1] (🥷) ninja +1F9B5..1F9B6 ; Emoji_Modifier_Base # E11.0 [2] (🦵..🦶) leg..foot +1F9B8..1F9B9 ; Emoji_Modifier_Base # E11.0 [2] (🦸..🦹) superhero..supervillain +1F9BB ; Emoji_Modifier_Base # E12.0 [1] (🦻) ear with hearing aid +1F9CD..1F9CF ; Emoji_Modifier_Base # E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D1..1F9DD ; Emoji_Modifier_Base # E5.0 [13] (🧑..🧝) person..elf +1FAC3..1FAC5 ; Emoji_Modifier_Base # E14.0 [3] (🫃..🫅) pregnant man..person with crown +1FAF0..1FAF6 ; Emoji_Modifier_Base # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands +1FAF7..1FAF8 ; Emoji_Modifier_Base # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand + +# Total elements: 134 + +# ================================================ + +# All omitted code points have Emoji_Component=No + +0023 ; Emoji_Component # E0.0 [1] (#️) hash sign +002A ; Emoji_Component # E0.0 [1] (*️) asterisk +0030..0039 ; Emoji_Component # E0.0 [10] (0️..9️) digit zero..digit nine +200D ; Emoji_Component # E0.0 [1] () zero width joiner +20E3 ; Emoji_Component # E0.0 [1] (⃣) combining enclosing keycap +FE0F ; Emoji_Component # E0.0 [1] () VARIATION SELECTOR-16 +1F1E6..1F1FF ; Emoji_Component # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z +1F3FB..1F3FF ; Emoji_Component # E1.0 [5] (🏻..🏿) light skin tone..dark skin tone +1F9B0..1F9B3 ; Emoji_Component # E11.0 [4] (🦰..🦳) red hair..white hair +E0020..E007F ; Emoji_Component # E0.0 [96] (..) tag space..cancel tag + +# Total elements: 146 + +# ================================================ + +# All omitted code points have Extended_Pictographic=No + +00A9 ; Extended_Pictographic# E0.6 [1] (©️) copyright +00AE ; Extended_Pictographic# E0.6 [1] (®️) registered +203C ; Extended_Pictographic# E0.6 [1] (‼️) double exclamation mark +2049 ; Extended_Pictographic# E0.6 [1] (⁉️) exclamation question mark +2122 ; Extended_Pictographic# E0.6 [1] (™️) trade mark +2139 ; Extended_Pictographic# E0.6 [1] (ℹ️) information +2194..2199 ; Extended_Pictographic# E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow +21A9..21AA ; Extended_Pictographic# E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right +231A..231B ; Extended_Pictographic# E0.6 [2] (⌚..⌛) watch..hourglass done +2328 ; Extended_Pictographic# E1.0 [1] (⌨️) keyboard +2388 ; Extended_Pictographic# E0.0 [1] (⎈) HELM SYMBOL +23CF ; Extended_Pictographic# E1.0 [1] (⏏️) eject button +23E9..23EC ; Extended_Pictographic# E0.6 [4] (⏩..⏬) fast-forward button..fast down button +23ED..23EE ; Extended_Pictographic# E0.7 [2] (⏭️..⏮️) next track button..last track button +23EF ; Extended_Pictographic# E1.0 [1] (⏯️) play or pause button +23F0 ; Extended_Pictographic# E0.6 [1] (⏰) alarm clock +23F1..23F2 ; Extended_Pictographic# E1.0 [2] (⏱️..⏲️) stopwatch..timer clock +23F3 ; Extended_Pictographic# E0.6 [1] (⏳) hourglass not done +23F8..23FA ; Extended_Pictographic# E0.7 [3] (⏸️..⏺️) pause button..record button +24C2 ; Extended_Pictographic# E0.6 [1] (Ⓜ️) circled M +25AA..25AB ; Extended_Pictographic# E0.6 [2] (▪️..▫️) black small square..white small square +25B6 ; Extended_Pictographic# E0.6 [1] (▶️) play button +25C0 ; Extended_Pictographic# E0.6 [1] (◀️) reverse button +25FB..25FE ; Extended_Pictographic# E0.6 [4] (◻️..◾) white medium square..black medium-small square +2600..2601 ; Extended_Pictographic# E0.6 [2] (☀️..☁️) sun..cloud +2602..2603 ; Extended_Pictographic# E0.7 [2] (☂️..☃️) umbrella..snowman +2604 ; Extended_Pictographic# E1.0 [1] (☄️) comet +2605 ; Extended_Pictographic# E0.0 [1] (★) BLACK STAR +2607..260D ; Extended_Pictographic# E0.0 [7] (☇..☍) LIGHTNING..OPPOSITION +260E ; Extended_Pictographic# E0.6 [1] (☎️) telephone +260F..2610 ; Extended_Pictographic# E0.0 [2] (☏..☐) WHITE TELEPHONE..BALLOT BOX +2611 ; Extended_Pictographic# E0.6 [1] (☑️) check box with check +2612 ; Extended_Pictographic# E0.0 [1] (☒) BALLOT BOX WITH X +2614..2615 ; Extended_Pictographic# E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage +2616..2617 ; Extended_Pictographic# E0.0 [2] (☖..☗) WHITE SHOGI PIECE..BLACK SHOGI PIECE +2618 ; Extended_Pictographic# E1.0 [1] (☘️) shamrock +2619..261C ; Extended_Pictographic# E0.0 [4] (☙..☜) REVERSED ROTATED FLORAL HEART BULLET..WHITE LEFT POINTING INDEX +261D ; Extended_Pictographic# E0.6 [1] (☝️) index pointing up +261E..261F ; Extended_Pictographic# E0.0 [2] (☞..☟) WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX +2620 ; Extended_Pictographic# E1.0 [1] (☠️) skull and crossbones +2621 ; Extended_Pictographic# E0.0 [1] (☡) CAUTION SIGN +2622..2623 ; Extended_Pictographic# E1.0 [2] (☢️..☣️) radioactive..biohazard +2624..2625 ; Extended_Pictographic# E0.0 [2] (☤..☥) CADUCEUS..ANKH +2626 ; Extended_Pictographic# E1.0 [1] (☦️) orthodox cross +2627..2629 ; Extended_Pictographic# E0.0 [3] (☧..☩) CHI RHO..CROSS OF JERUSALEM +262A ; Extended_Pictographic# E0.7 [1] (☪️) star and crescent +262B..262D ; Extended_Pictographic# E0.0 [3] (☫..☭) FARSI SYMBOL..HAMMER AND SICKLE +262E ; Extended_Pictographic# E1.0 [1] (☮️) peace symbol +262F ; Extended_Pictographic# E0.7 [1] (☯️) yin yang +2630..2637 ; Extended_Pictographic# E0.0 [8] (☰..☷) TRIGRAM FOR HEAVEN..TRIGRAM FOR EARTH +2638..2639 ; Extended_Pictographic# E0.7 [2] (☸️..☹️) wheel of dharma..frowning face +263A ; Extended_Pictographic# E0.6 [1] (☺️) smiling face +263B..263F ; Extended_Pictographic# E0.0 [5] (☻..☿) BLACK SMILING FACE..MERCURY +2640 ; Extended_Pictographic# E4.0 [1] (♀️) female sign +2641 ; Extended_Pictographic# E0.0 [1] (♁) EARTH +2642 ; Extended_Pictographic# E4.0 [1] (♂️) male sign +2643..2647 ; Extended_Pictographic# E0.0 [5] (♃..♇) JUPITER..PLUTO +2648..2653 ; Extended_Pictographic# E0.6 [12] (♈..♓) Aries..Pisces +2654..265E ; Extended_Pictographic# E0.0 [11] (♔..♞) WHITE CHESS KING..BLACK CHESS KNIGHT +265F ; Extended_Pictographic# E11.0 [1] (♟️) chess pawn +2660 ; Extended_Pictographic# E0.6 [1] (♠️) spade suit +2661..2662 ; Extended_Pictographic# E0.0 [2] (♡..♢) WHITE HEART SUIT..WHITE DIAMOND SUIT +2663 ; Extended_Pictographic# E0.6 [1] (♣️) club suit +2664 ; Extended_Pictographic# E0.0 [1] (♤) WHITE SPADE SUIT +2665..2666 ; Extended_Pictographic# E0.6 [2] (♥️..♦️) heart suit..diamond suit +2667 ; Extended_Pictographic# E0.0 [1] (♧) WHITE CLUB SUIT +2668 ; Extended_Pictographic# E0.6 [1] (♨️) hot springs +2669..267A ; Extended_Pictographic# E0.0 [18] (♩..♺) QUARTER NOTE..RECYCLING SYMBOL FOR GENERIC MATERIALS +267B ; Extended_Pictographic# E0.6 [1] (♻️) recycling symbol +267C..267D ; Extended_Pictographic# E0.0 [2] (♼..♽) RECYCLED PAPER SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL +267E ; Extended_Pictographic# E11.0 [1] (♾️) infinity +267F ; Extended_Pictographic# E0.6 [1] (♿) wheelchair symbol +2680..2685 ; Extended_Pictographic# E0.0 [6] (⚀..⚅) DIE FACE-1..DIE FACE-6 +2690..2691 ; Extended_Pictographic# E0.0 [2] (⚐..⚑) WHITE FLAG..BLACK FLAG +2692 ; Extended_Pictographic# E1.0 [1] (⚒️) hammer and pick +2693 ; Extended_Pictographic# E0.6 [1] (⚓) anchor +2694 ; Extended_Pictographic# E1.0 [1] (⚔️) crossed swords +2695 ; Extended_Pictographic# E4.0 [1] (⚕️) medical symbol +2696..2697 ; Extended_Pictographic# E1.0 [2] (⚖️..⚗️) balance scale..alembic +2698 ; Extended_Pictographic# E0.0 [1] (⚘) FLOWER +2699 ; Extended_Pictographic# E1.0 [1] (⚙️) gear +269A ; Extended_Pictographic# E0.0 [1] (⚚) STAFF OF HERMES +269B..269C ; Extended_Pictographic# E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis +269D..269F ; Extended_Pictographic# E0.0 [3] (⚝..⚟) OUTLINED WHITE STAR..THREE LINES CONVERGING LEFT +26A0..26A1 ; Extended_Pictographic# E0.6 [2] (⚠️..⚡) warning..high voltage +26A2..26A6 ; Extended_Pictographic# E0.0 [5] (⚢..⚦) DOUBLED FEMALE SIGN..MALE WITH STROKE SIGN +26A7 ; Extended_Pictographic# E13.0 [1] (⚧️) transgender symbol +26A8..26A9 ; Extended_Pictographic# E0.0 [2] (⚨..⚩) VERTICAL MALE WITH STROKE SIGN..HORIZONTAL MALE WITH STROKE SIGN +26AA..26AB ; Extended_Pictographic# E0.6 [2] (⚪..⚫) white circle..black circle +26AC..26AF ; Extended_Pictographic# E0.0 [4] (⚬..⚯) MEDIUM SMALL WHITE CIRCLE..UNMARRIED PARTNERSHIP SYMBOL +26B0..26B1 ; Extended_Pictographic# E1.0 [2] (⚰️..⚱️) coffin..funeral urn +26B2..26BC ; Extended_Pictographic# E0.0 [11] (⚲..⚼) NEUTER..SESQUIQUADRATE +26BD..26BE ; Extended_Pictographic# E0.6 [2] (⚽..⚾) soccer ball..baseball +26BF..26C3 ; Extended_Pictographic# E0.0 [5] (⚿..⛃) SQUARED KEY..BLACK DRAUGHTS KING +26C4..26C5 ; Extended_Pictographic# E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud +26C6..26C7 ; Extended_Pictographic# E0.0 [2] (⛆..⛇) RAIN..BLACK SNOWMAN +26C8 ; Extended_Pictographic# E0.7 [1] (⛈️) cloud with lightning and rain +26C9..26CD ; Extended_Pictographic# E0.0 [5] (⛉..⛍) TURNED WHITE SHOGI PIECE..DISABLED CAR +26CE ; Extended_Pictographic# E0.6 [1] (⛎) Ophiuchus +26CF ; Extended_Pictographic# E0.7 [1] (⛏️) pick +26D0 ; Extended_Pictographic# E0.0 [1] (⛐) CAR SLIDING +26D1 ; Extended_Pictographic# E0.7 [1] (⛑️) rescue worker’s helmet +26D2 ; Extended_Pictographic# E0.0 [1] (⛒) CIRCLED CROSSING LANES +26D3 ; Extended_Pictographic# E0.7 [1] (⛓️) chains +26D4 ; Extended_Pictographic# E0.6 [1] (⛔) no entry +26D5..26E8 ; Extended_Pictographic# E0.0 [20] (⛕..⛨) ALTERNATE ONE-WAY LEFT WAY TRAFFIC..BLACK CROSS ON SHIELD +26E9 ; Extended_Pictographic# E0.7 [1] (⛩️) shinto shrine +26EA ; Extended_Pictographic# E0.6 [1] (⛪) church +26EB..26EF ; Extended_Pictographic# E0.0 [5] (⛫..⛯) CASTLE..MAP SYMBOL FOR LIGHTHOUSE +26F0..26F1 ; Extended_Pictographic# E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground +26F2..26F3 ; Extended_Pictographic# E0.6 [2] (⛲..⛳) fountain..flag in hole +26F4 ; Extended_Pictographic# E0.7 [1] (⛴️) ferry +26F5 ; Extended_Pictographic# E0.6 [1] (⛵) sailboat +26F6 ; Extended_Pictographic# E0.0 [1] (⛶) SQUARE FOUR CORNERS +26F7..26F9 ; Extended_Pictographic# E0.7 [3] (⛷️..⛹️) skier..person bouncing ball +26FA ; Extended_Pictographic# E0.6 [1] (⛺) tent +26FB..26FC ; Extended_Pictographic# E0.0 [2] (⛻..⛼) JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL +26FD ; Extended_Pictographic# E0.6 [1] (⛽) fuel pump +26FE..2701 ; Extended_Pictographic# E0.0 [4] (⛾..✁) CUP ON BLACK SQUARE..UPPER BLADE SCISSORS +2702 ; Extended_Pictographic# E0.6 [1] (✂️) scissors +2703..2704 ; Extended_Pictographic# E0.0 [2] (✃..✄) LOWER BLADE SCISSORS..WHITE SCISSORS +2705 ; Extended_Pictographic# E0.6 [1] (✅) check mark button +2708..270C ; Extended_Pictographic# E0.6 [5] (✈️..✌️) airplane..victory hand +270D ; Extended_Pictographic# E0.7 [1] (✍️) writing hand +270E ; Extended_Pictographic# E0.0 [1] (✎) LOWER RIGHT PENCIL +270F ; Extended_Pictographic# E0.6 [1] (✏️) pencil +2710..2711 ; Extended_Pictographic# E0.0 [2] (✐..✑) UPPER RIGHT PENCIL..WHITE NIB +2712 ; Extended_Pictographic# E0.6 [1] (✒️) black nib +2714 ; Extended_Pictographic# E0.6 [1] (✔️) check mark +2716 ; Extended_Pictographic# E0.6 [1] (✖️) multiply +271D ; Extended_Pictographic# E0.7 [1] (✝️) latin cross +2721 ; Extended_Pictographic# E0.7 [1] (✡️) star of David +2728 ; Extended_Pictographic# E0.6 [1] (✨) sparkles +2733..2734 ; Extended_Pictographic# E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star +2744 ; Extended_Pictographic# E0.6 [1] (❄️) snowflake +2747 ; Extended_Pictographic# E0.6 [1] (❇️) sparkle +274C ; Extended_Pictographic# E0.6 [1] (❌) cross mark +274E ; Extended_Pictographic# E0.6 [1] (❎) cross mark button +2753..2755 ; Extended_Pictographic# E0.6 [3] (❓..❕) red question mark..white exclamation mark +2757 ; Extended_Pictographic# E0.6 [1] (❗) red exclamation mark +2763 ; Extended_Pictographic# E1.0 [1] (❣️) heart exclamation +2764 ; Extended_Pictographic# E0.6 [1] (❤️) red heart +2765..2767 ; Extended_Pictographic# E0.0 [3] (❥..❧) ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET +2795..2797 ; Extended_Pictographic# E0.6 [3] (➕..➗) plus..divide +27A1 ; Extended_Pictographic# E0.6 [1] (➡️) right arrow +27B0 ; Extended_Pictographic# E0.6 [1] (➰) curly loop +27BF ; Extended_Pictographic# E1.0 [1] (➿) double curly loop +2934..2935 ; Extended_Pictographic# E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down +2B05..2B07 ; Extended_Pictographic# E0.6 [3] (⬅️..⬇️) left arrow..down arrow +2B1B..2B1C ; Extended_Pictographic# E0.6 [2] (⬛..⬜) black large square..white large square +2B50 ; Extended_Pictographic# E0.6 [1] (⭐) star +2B55 ; Extended_Pictographic# E0.6 [1] (⭕) hollow red circle +3030 ; Extended_Pictographic# E0.6 [1] (〰️) wavy dash +303D ; Extended_Pictographic# E0.6 [1] (〽️) part alternation mark +3297 ; Extended_Pictographic# E0.6 [1] (㊗️) Japanese “congratulations” button +3299 ; Extended_Pictographic# E0.6 [1] (㊙️) Japanese “secret” button +1F000..1F003 ; Extended_Pictographic# E0.0 [4] (🀀..🀃) MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND +1F004 ; Extended_Pictographic# E0.6 [1] (🀄) mahjong red dragon +1F005..1F0CE ; Extended_Pictographic# E0.0 [202] (🀅..🃎) MAHJONG TILE GREEN DRAGON..PLAYING CARD KING OF DIAMONDS +1F0CF ; Extended_Pictographic# E0.6 [1] (🃏) joker +1F0D0..1F0FF ; Extended_Pictographic# E0.0 [48] (..) <reserved-1F0D0>..<reserved-1F0FF> +1F10D..1F10F ; Extended_Pictographic# E0.0 [3] (🄍..🄏) CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH +1F12F ; Extended_Pictographic# E0.0 [1] (🄯) COPYLEFT SYMBOL +1F16C..1F16F ; Extended_Pictographic# E0.0 [4] (🅬..🅯) RAISED MR SIGN..CIRCLED HUMAN FIGURE +1F170..1F171 ; Extended_Pictographic# E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type) +1F17E..1F17F ; Extended_Pictographic# E0.6 [2] (🅾️..🅿️) O button (blood type)..P button +1F18E ; Extended_Pictographic# E0.6 [1] (🆎) AB button (blood type) +1F191..1F19A ; Extended_Pictographic# E0.6 [10] (🆑..🆚) CL button..VS button +1F1AD..1F1E5 ; Extended_Pictographic# E0.0 [57] (🆭..) MASK WORK SYMBOL..<reserved-1F1E5> +1F201..1F202 ; Extended_Pictographic# E0.6 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button +1F203..1F20F ; Extended_Pictographic# E0.0 [13] (..) <reserved-1F203>..<reserved-1F20F> +1F21A ; Extended_Pictographic# E0.6 [1] (🈚) Japanese “free of charge” button +1F22F ; Extended_Pictographic# E0.6 [1] (🈯) Japanese “reserved” button +1F232..1F23A ; Extended_Pictographic# E0.6 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button +1F23C..1F23F ; Extended_Pictographic# E0.0 [4] (..) <reserved-1F23C>..<reserved-1F23F> +1F249..1F24F ; Extended_Pictographic# E0.0 [7] (..) <reserved-1F249>..<reserved-1F24F> +1F250..1F251 ; Extended_Pictographic# E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button +1F252..1F2FF ; Extended_Pictographic# E0.0 [174] (..) <reserved-1F252>..<reserved-1F2FF> +1F300..1F30C ; Extended_Pictographic# E0.6 [13] (🌀..🌌) cyclone..milky way +1F30D..1F30E ; Extended_Pictographic# E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas +1F30F ; Extended_Pictographic# E0.6 [1] (🌏) globe showing Asia-Australia +1F310 ; Extended_Pictographic# E1.0 [1] (🌐) globe with meridians +1F311 ; Extended_Pictographic# E0.6 [1] (🌑) new moon +1F312 ; Extended_Pictographic# E1.0 [1] (🌒) waxing crescent moon +1F313..1F315 ; Extended_Pictographic# E0.6 [3] (🌓..🌕) first quarter moon..full moon +1F316..1F318 ; Extended_Pictographic# E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon +1F319 ; Extended_Pictographic# E0.6 [1] (🌙) crescent moon +1F31A ; Extended_Pictographic# E1.0 [1] (🌚) new moon face +1F31B ; Extended_Pictographic# E0.6 [1] (🌛) first quarter moon face +1F31C ; Extended_Pictographic# E0.7 [1] (🌜) last quarter moon face +1F31D..1F31E ; Extended_Pictographic# E1.0 [2] (🌝..🌞) full moon face..sun with face +1F31F..1F320 ; Extended_Pictographic# E0.6 [2] (🌟..🌠) glowing star..shooting star +1F321 ; Extended_Pictographic# E0.7 [1] (🌡️) thermometer +1F322..1F323 ; Extended_Pictographic# E0.0 [2] (🌢..🌣) BLACK DROPLET..WHITE SUN +1F324..1F32C ; Extended_Pictographic# E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face +1F32D..1F32F ; Extended_Pictographic# E1.0 [3] (🌭..🌯) hot dog..burrito +1F330..1F331 ; Extended_Pictographic# E0.6 [2] (🌰..🌱) chestnut..seedling +1F332..1F333 ; Extended_Pictographic# E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree +1F334..1F335 ; Extended_Pictographic# E0.6 [2] (🌴..🌵) palm tree..cactus +1F336 ; Extended_Pictographic# E0.7 [1] (🌶️) hot pepper +1F337..1F34A ; Extended_Pictographic# E0.6 [20] (🌷..🍊) tulip..tangerine +1F34B ; Extended_Pictographic# E1.0 [1] (🍋) lemon +1F34C..1F34F ; Extended_Pictographic# E0.6 [4] (🍌..🍏) banana..green apple +1F350 ; Extended_Pictographic# E1.0 [1] (🍐) pear +1F351..1F37B ; Extended_Pictographic# E0.6 [43] (🍑..🍻) peach..clinking beer mugs +1F37C ; Extended_Pictographic# E1.0 [1] (🍼) baby bottle +1F37D ; Extended_Pictographic# E0.7 [1] (🍽️) fork and knife with plate +1F37E..1F37F ; Extended_Pictographic# E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn +1F380..1F393 ; Extended_Pictographic# E0.6 [20] (🎀..🎓) ribbon..graduation cap +1F394..1F395 ; Extended_Pictographic# E0.0 [2] (🎔..🎕) HEART WITH TIP ON THE LEFT..BOUQUET OF FLOWERS +1F396..1F397 ; Extended_Pictographic# E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon +1F398 ; Extended_Pictographic# E0.0 [1] (🎘) MUSICAL KEYBOARD WITH JACKS +1F399..1F39B ; Extended_Pictographic# E0.7 [3] (🎙️..🎛️) studio microphone..control knobs +1F39C..1F39D ; Extended_Pictographic# E0.0 [2] (🎜..🎝) BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES +1F39E..1F39F ; Extended_Pictographic# E0.7 [2] (🎞️..🎟️) film frames..admission tickets +1F3A0..1F3C4 ; Extended_Pictographic# E0.6 [37] (🎠..🏄) carousel horse..person surfing +1F3C5 ; Extended_Pictographic# E1.0 [1] (🏅) sports medal +1F3C6 ; Extended_Pictographic# E0.6 [1] (🏆) trophy +1F3C7 ; Extended_Pictographic# E1.0 [1] (🏇) horse racing +1F3C8 ; Extended_Pictographic# E0.6 [1] (🏈) american football +1F3C9 ; Extended_Pictographic# E1.0 [1] (🏉) rugby football +1F3CA ; Extended_Pictographic# E0.6 [1] (🏊) person swimming +1F3CB..1F3CE ; Extended_Pictographic# E0.7 [4] (🏋️..🏎️) person lifting weights..racing car +1F3CF..1F3D3 ; Extended_Pictographic# E1.0 [5] (🏏..🏓) cricket game..ping pong +1F3D4..1F3DF ; Extended_Pictographic# E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium +1F3E0..1F3E3 ; Extended_Pictographic# E0.6 [4] (🏠..🏣) house..Japanese post office +1F3E4 ; Extended_Pictographic# E1.0 [1] (🏤) post office +1F3E5..1F3F0 ; Extended_Pictographic# E0.6 [12] (🏥..🏰) hospital..castle +1F3F1..1F3F2 ; Extended_Pictographic# E0.0 [2] (🏱..🏲) WHITE PENNANT..BLACK PENNANT +1F3F3 ; Extended_Pictographic# E0.7 [1] (🏳️) white flag +1F3F4 ; Extended_Pictographic# E1.0 [1] (🏴) black flag +1F3F5 ; Extended_Pictographic# E0.7 [1] (🏵️) rosette +1F3F6 ; Extended_Pictographic# E0.0 [1] (🏶) BLACK ROSETTE +1F3F7 ; Extended_Pictographic# E0.7 [1] (🏷️) label +1F3F8..1F3FA ; Extended_Pictographic# E1.0 [3] (🏸..🏺) badminton..amphora +1F400..1F407 ; Extended_Pictographic# E1.0 [8] (🐀..🐇) rat..rabbit +1F408 ; Extended_Pictographic# E0.7 [1] (🐈) cat +1F409..1F40B ; Extended_Pictographic# E1.0 [3] (🐉..🐋) dragon..whale +1F40C..1F40E ; Extended_Pictographic# E0.6 [3] (🐌..🐎) snail..horse +1F40F..1F410 ; Extended_Pictographic# E1.0 [2] (🐏..🐐) ram..goat +1F411..1F412 ; Extended_Pictographic# E0.6 [2] (🐑..🐒) ewe..monkey +1F413 ; Extended_Pictographic# E1.0 [1] (🐓) rooster +1F414 ; Extended_Pictographic# E0.6 [1] (🐔) chicken +1F415 ; Extended_Pictographic# E0.7 [1] (🐕) dog +1F416 ; Extended_Pictographic# E1.0 [1] (🐖) pig +1F417..1F429 ; Extended_Pictographic# E0.6 [19] (🐗..🐩) boar..poodle +1F42A ; Extended_Pictographic# E1.0 [1] (🐪) camel +1F42B..1F43E ; Extended_Pictographic# E0.6 [20] (🐫..🐾) two-hump camel..paw prints +1F43F ; Extended_Pictographic# E0.7 [1] (🐿️) chipmunk +1F440 ; Extended_Pictographic# E0.6 [1] (👀) eyes +1F441 ; Extended_Pictographic# E0.7 [1] (👁️) eye +1F442..1F464 ; Extended_Pictographic# E0.6 [35] (👂..👤) ear..bust in silhouette +1F465 ; Extended_Pictographic# E1.0 [1] (👥) busts in silhouette +1F466..1F46B ; Extended_Pictographic# E0.6 [6] (👦..👫) boy..woman and man holding hands +1F46C..1F46D ; Extended_Pictographic# E1.0 [2] (👬..👭) men holding hands..women holding hands +1F46E..1F4AC ; Extended_Pictographic# E0.6 [63] (👮..💬) police officer..speech balloon +1F4AD ; Extended_Pictographic# E1.0 [1] (💭) thought balloon +1F4AE..1F4B5 ; Extended_Pictographic# E0.6 [8] (💮..💵) white flower..dollar banknote +1F4B6..1F4B7 ; Extended_Pictographic# E1.0 [2] (💶..💷) euro banknote..pound banknote +1F4B8..1F4EB ; Extended_Pictographic# E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag +1F4EC..1F4ED ; Extended_Pictographic# E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag +1F4EE ; Extended_Pictographic# E0.6 [1] (📮) postbox +1F4EF ; Extended_Pictographic# E1.0 [1] (📯) postal horn +1F4F0..1F4F4 ; Extended_Pictographic# E0.6 [5] (📰..📴) newspaper..mobile phone off +1F4F5 ; Extended_Pictographic# E1.0 [1] (📵) no mobile phones +1F4F6..1F4F7 ; Extended_Pictographic# E0.6 [2] (📶..📷) antenna bars..camera +1F4F8 ; Extended_Pictographic# E1.0 [1] (📸) camera with flash +1F4F9..1F4FC ; Extended_Pictographic# E0.6 [4] (📹..📼) video camera..videocassette +1F4FD ; Extended_Pictographic# E0.7 [1] (📽️) film projector +1F4FE ; Extended_Pictographic# E0.0 [1] (📾) PORTABLE STEREO +1F4FF..1F502 ; Extended_Pictographic# E1.0 [4] (📿..🔂) prayer beads..repeat single button +1F503 ; Extended_Pictographic# E0.6 [1] (🔃) clockwise vertical arrows +1F504..1F507 ; Extended_Pictographic# E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker +1F508 ; Extended_Pictographic# E0.7 [1] (🔈) speaker low volume +1F509 ; Extended_Pictographic# E1.0 [1] (🔉) speaker medium volume +1F50A..1F514 ; Extended_Pictographic# E0.6 [11] (🔊..🔔) speaker high volume..bell +1F515 ; Extended_Pictographic# E1.0 [1] (🔕) bell with slash +1F516..1F52B ; Extended_Pictographic# E0.6 [22] (🔖..🔫) bookmark..water pistol +1F52C..1F52D ; Extended_Pictographic# E1.0 [2] (🔬..🔭) microscope..telescope +1F52E..1F53D ; Extended_Pictographic# E0.6 [16] (🔮..🔽) crystal ball..downwards button +1F546..1F548 ; Extended_Pictographic# E0.0 [3] (🕆..🕈) WHITE LATIN CROSS..CELTIC CROSS +1F549..1F54A ; Extended_Pictographic# E0.7 [2] (🕉️..🕊️) om..dove +1F54B..1F54E ; Extended_Pictographic# E1.0 [4] (🕋..🕎) kaaba..menorah +1F54F ; Extended_Pictographic# E0.0 [1] (🕏) BOWL OF HYGIEIA +1F550..1F55B ; Extended_Pictographic# E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock +1F55C..1F567 ; Extended_Pictographic# E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty +1F568..1F56E ; Extended_Pictographic# E0.0 [7] (🕨..🕮) RIGHT SPEAKER..BOOK +1F56F..1F570 ; Extended_Pictographic# E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock +1F571..1F572 ; Extended_Pictographic# E0.0 [2] (🕱..🕲) BLACK SKULL AND CROSSBONES..NO PIRACY +1F573..1F579 ; Extended_Pictographic# E0.7 [7] (🕳️..🕹️) hole..joystick +1F57A ; Extended_Pictographic# E3.0 [1] (🕺) man dancing +1F57B..1F586 ; Extended_Pictographic# E0.0 [12] (🕻..🖆) LEFT HAND TELEPHONE RECEIVER..PEN OVER STAMPED ENVELOPE +1F587 ; Extended_Pictographic# E0.7 [1] (🖇️) linked paperclips +1F588..1F589 ; Extended_Pictographic# E0.0 [2] (🖈..🖉) BLACK PUSHPIN..LOWER LEFT PENCIL +1F58A..1F58D ; Extended_Pictographic# E0.7 [4] (🖊️..🖍️) pen..crayon +1F58E..1F58F ; Extended_Pictographic# E0.0 [2] (🖎..🖏) LEFT WRITING HAND..TURNED OK HAND SIGN +1F590 ; Extended_Pictographic# E0.7 [1] (🖐️) hand with fingers splayed +1F591..1F594 ; Extended_Pictographic# E0.0 [4] (🖑..🖔) REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND +1F595..1F596 ; Extended_Pictographic# E1.0 [2] (🖕..🖖) middle finger..vulcan salute +1F597..1F5A3 ; Extended_Pictographic# E0.0 [13] (🖗..🖣) WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX +1F5A4 ; Extended_Pictographic# E3.0 [1] (🖤) black heart +1F5A5 ; Extended_Pictographic# E0.7 [1] (🖥️) desktop computer +1F5A6..1F5A7 ; Extended_Pictographic# E0.0 [2] (🖦..🖧) KEYBOARD AND MOUSE..THREE NETWORKED COMPUTERS +1F5A8 ; Extended_Pictographic# E0.7 [1] (🖨️) printer +1F5A9..1F5B0 ; Extended_Pictographic# E0.0 [8] (🖩..🖰) POCKET CALCULATOR..TWO BUTTON MOUSE +1F5B1..1F5B2 ; Extended_Pictographic# E0.7 [2] (🖱️..🖲️) computer mouse..trackball +1F5B3..1F5BB ; Extended_Pictographic# E0.0 [9] (🖳..🖻) OLD PERSONAL COMPUTER..DOCUMENT WITH PICTURE +1F5BC ; Extended_Pictographic# E0.7 [1] (🖼️) framed picture +1F5BD..1F5C1 ; Extended_Pictographic# E0.0 [5] (🖽..🗁) FRAME WITH TILES..OPEN FOLDER +1F5C2..1F5C4 ; Extended_Pictographic# E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet +1F5C5..1F5D0 ; Extended_Pictographic# E0.0 [12] (🗅..🗐) EMPTY NOTE..PAGES +1F5D1..1F5D3 ; Extended_Pictographic# E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar +1F5D4..1F5DB ; Extended_Pictographic# E0.0 [8] (🗔..🗛) DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL +1F5DC..1F5DE ; Extended_Pictographic# E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper +1F5DF..1F5E0 ; Extended_Pictographic# E0.0 [2] (🗟..🗠) PAGE WITH CIRCLED TEXT..STOCK CHART +1F5E1 ; Extended_Pictographic# E0.7 [1] (🗡️) dagger +1F5E2 ; Extended_Pictographic# E0.0 [1] (🗢) LIPS +1F5E3 ; Extended_Pictographic# E0.7 [1] (🗣️) speaking head +1F5E4..1F5E7 ; Extended_Pictographic# E0.0 [4] (🗤..🗧) THREE RAYS ABOVE..THREE RAYS RIGHT +1F5E8 ; Extended_Pictographic# E2.0 [1] (🗨️) left speech bubble +1F5E9..1F5EE ; Extended_Pictographic# E0.0 [6] (🗩..🗮) RIGHT SPEECH BUBBLE..LEFT ANGER BUBBLE +1F5EF ; Extended_Pictographic# E0.7 [1] (🗯️) right anger bubble +1F5F0..1F5F2 ; Extended_Pictographic# E0.0 [3] (🗰..🗲) MOOD BUBBLE..LIGHTNING MOOD +1F5F3 ; Extended_Pictographic# E0.7 [1] (🗳️) ballot box with ballot +1F5F4..1F5F9 ; Extended_Pictographic# E0.0 [6] (🗴..🗹) BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK +1F5FA ; Extended_Pictographic# E0.7 [1] (🗺️) world map +1F5FB..1F5FF ; Extended_Pictographic# E0.6 [5] (🗻..🗿) mount fuji..moai +1F600 ; Extended_Pictographic# E1.0 [1] (😀) grinning face +1F601..1F606 ; Extended_Pictographic# E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face +1F607..1F608 ; Extended_Pictographic# E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns +1F609..1F60D ; Extended_Pictographic# E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes +1F60E ; Extended_Pictographic# E1.0 [1] (😎) smiling face with sunglasses +1F60F ; Extended_Pictographic# E0.6 [1] (😏) smirking face +1F610 ; Extended_Pictographic# E0.7 [1] (😐) neutral face +1F611 ; Extended_Pictographic# E1.0 [1] (😑) expressionless face +1F612..1F614 ; Extended_Pictographic# E0.6 [3] (😒..😔) unamused face..pensive face +1F615 ; Extended_Pictographic# E1.0 [1] (😕) confused face +1F616 ; Extended_Pictographic# E0.6 [1] (😖) confounded face +1F617 ; Extended_Pictographic# E1.0 [1] (😗) kissing face +1F618 ; Extended_Pictographic# E0.6 [1] (😘) face blowing a kiss +1F619 ; Extended_Pictographic# E1.0 [1] (😙) kissing face with smiling eyes +1F61A ; Extended_Pictographic# E0.6 [1] (😚) kissing face with closed eyes +1F61B ; Extended_Pictographic# E1.0 [1] (😛) face with tongue +1F61C..1F61E ; Extended_Pictographic# E0.6 [3] (😜..😞) winking face with tongue..disappointed face +1F61F ; Extended_Pictographic# E1.0 [1] (😟) worried face +1F620..1F625 ; Extended_Pictographic# E0.6 [6] (😠..😥) angry face..sad but relieved face +1F626..1F627 ; Extended_Pictographic# E1.0 [2] (😦..😧) frowning face with open mouth..anguished face +1F628..1F62B ; Extended_Pictographic# E0.6 [4] (😨..😫) fearful face..tired face +1F62C ; Extended_Pictographic# E1.0 [1] (😬) grimacing face +1F62D ; Extended_Pictographic# E0.6 [1] (😭) loudly crying face +1F62E..1F62F ; Extended_Pictographic# E1.0 [2] (😮..😯) face with open mouth..hushed face +1F630..1F633 ; Extended_Pictographic# E0.6 [4] (😰..😳) anxious face with sweat..flushed face +1F634 ; Extended_Pictographic# E1.0 [1] (😴) sleeping face +1F635 ; Extended_Pictographic# E0.6 [1] (😵) face with crossed-out eyes +1F636 ; Extended_Pictographic# E1.0 [1] (😶) face without mouth +1F637..1F640 ; Extended_Pictographic# E0.6 [10] (😷..🙀) face with medical mask..weary cat +1F641..1F644 ; Extended_Pictographic# E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes +1F645..1F64F ; Extended_Pictographic# E0.6 [11] (🙅..🙏) person gesturing NO..folded hands +1F680 ; Extended_Pictographic# E0.6 [1] (🚀) rocket +1F681..1F682 ; Extended_Pictographic# E1.0 [2] (🚁..🚂) helicopter..locomotive +1F683..1F685 ; Extended_Pictographic# E0.6 [3] (🚃..🚅) railway car..bullet train +1F686 ; Extended_Pictographic# E1.0 [1] (🚆) train +1F687 ; Extended_Pictographic# E0.6 [1] (🚇) metro +1F688 ; Extended_Pictographic# E1.0 [1] (🚈) light rail +1F689 ; Extended_Pictographic# E0.6 [1] (🚉) station +1F68A..1F68B ; Extended_Pictographic# E1.0 [2] (🚊..🚋) tram..tram car +1F68C ; Extended_Pictographic# E0.6 [1] (🚌) bus +1F68D ; Extended_Pictographic# E0.7 [1] (🚍) oncoming bus +1F68E ; Extended_Pictographic# E1.0 [1] (🚎) trolleybus +1F68F ; Extended_Pictographic# E0.6 [1] (🚏) bus stop +1F690 ; Extended_Pictographic# E1.0 [1] (🚐) minibus +1F691..1F693 ; Extended_Pictographic# E0.6 [3] (🚑..🚓) ambulance..police car +1F694 ; Extended_Pictographic# E0.7 [1] (🚔) oncoming police car +1F695 ; Extended_Pictographic# E0.6 [1] (🚕) taxi +1F696 ; Extended_Pictographic# E1.0 [1] (🚖) oncoming taxi +1F697 ; Extended_Pictographic# E0.6 [1] (🚗) automobile +1F698 ; Extended_Pictographic# E0.7 [1] (🚘) oncoming automobile +1F699..1F69A ; Extended_Pictographic# E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck +1F69B..1F6A1 ; Extended_Pictographic# E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway +1F6A2 ; Extended_Pictographic# E0.6 [1] (🚢) ship +1F6A3 ; Extended_Pictographic# E1.0 [1] (🚣) person rowing boat +1F6A4..1F6A5 ; Extended_Pictographic# E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light +1F6A6 ; Extended_Pictographic# E1.0 [1] (🚦) vertical traffic light +1F6A7..1F6AD ; Extended_Pictographic# E0.6 [7] (🚧..🚭) construction..no smoking +1F6AE..1F6B1 ; Extended_Pictographic# E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water +1F6B2 ; Extended_Pictographic# E0.6 [1] (🚲) bicycle +1F6B3..1F6B5 ; Extended_Pictographic# E1.0 [3] (🚳..🚵) no bicycles..person mountain biking +1F6B6 ; Extended_Pictographic# E0.6 [1] (🚶) person walking +1F6B7..1F6B8 ; Extended_Pictographic# E1.0 [2] (🚷..🚸) no pedestrians..children crossing +1F6B9..1F6BE ; Extended_Pictographic# E0.6 [6] (🚹..🚾) men’s room..water closet +1F6BF ; Extended_Pictographic# E1.0 [1] (🚿) shower +1F6C0 ; Extended_Pictographic# E0.6 [1] (🛀) person taking bath +1F6C1..1F6C5 ; Extended_Pictographic# E1.0 [5] (🛁..🛅) bathtub..left luggage +1F6C6..1F6CA ; Extended_Pictographic# E0.0 [5] (🛆..🛊) TRIANGLE WITH ROUNDED CORNERS..GIRLS SYMBOL +1F6CB ; Extended_Pictographic# E0.7 [1] (🛋️) couch and lamp +1F6CC ; Extended_Pictographic# E1.0 [1] (🛌) person in bed +1F6CD..1F6CF ; Extended_Pictographic# E0.7 [3] (🛍️..🛏️) shopping bags..bed +1F6D0 ; Extended_Pictographic# E1.0 [1] (🛐) place of worship +1F6D1..1F6D2 ; Extended_Pictographic# E3.0 [2] (🛑..🛒) stop sign..shopping cart +1F6D3..1F6D4 ; Extended_Pictographic# E0.0 [2] (🛓..🛔) STUPA..PAGODA +1F6D5 ; Extended_Pictographic# E12.0 [1] (🛕) hindu temple +1F6D6..1F6D7 ; Extended_Pictographic# E13.0 [2] (🛖..🛗) hut..elevator +1F6D8..1F6DB ; Extended_Pictographic# E0.0 [4] (..) <reserved-1F6D8>..<reserved-1F6DB> +1F6DC ; Extended_Pictographic# E15.0 [1] (🛜) wireless +1F6DD..1F6DF ; Extended_Pictographic# E14.0 [3] (🛝..🛟) playground slide..ring buoy +1F6E0..1F6E5 ; Extended_Pictographic# E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat +1F6E6..1F6E8 ; Extended_Pictographic# E0.0 [3] (🛦..🛨) UP-POINTING MILITARY AIRPLANE..UP-POINTING SMALL AIRPLANE +1F6E9 ; Extended_Pictographic# E0.7 [1] (🛩️) small airplane +1F6EA ; Extended_Pictographic# E0.0 [1] (🛪) NORTHEAST-POINTING AIRPLANE +1F6EB..1F6EC ; Extended_Pictographic# E1.0 [2] (🛫..🛬) airplane departure..airplane arrival +1F6ED..1F6EF ; Extended_Pictographic# E0.0 [3] (..) <reserved-1F6ED>..<reserved-1F6EF> +1F6F0 ; Extended_Pictographic# E0.7 [1] (🛰️) satellite +1F6F1..1F6F2 ; Extended_Pictographic# E0.0 [2] (🛱..🛲) ONCOMING FIRE ENGINE..DIESEL LOCOMOTIVE +1F6F3 ; Extended_Pictographic# E0.7 [1] (🛳️) passenger ship +1F6F4..1F6F6 ; Extended_Pictographic# E3.0 [3] (🛴..🛶) kick scooter..canoe +1F6F7..1F6F8 ; Extended_Pictographic# E5.0 [2] (🛷..🛸) sled..flying saucer +1F6F9 ; Extended_Pictographic# E11.0 [1] (🛹) skateboard +1F6FA ; Extended_Pictographic# E12.0 [1] (🛺) auto rickshaw +1F6FB..1F6FC ; Extended_Pictographic# E13.0 [2] (🛻..🛼) pickup truck..roller skate +1F6FD..1F6FF ; Extended_Pictographic# E0.0 [3] (..) <reserved-1F6FD>..<reserved-1F6FF> +1F774..1F77F ; Extended_Pictographic# E0.0 [12] (🝴..🝿) LOT OF FORTUNE..ORCUS +1F7D5..1F7DF ; Extended_Pictographic# E0.0 [11] (🟕..) CIRCLED TRIANGLE..<reserved-1F7DF> +1F7E0..1F7EB ; Extended_Pictographic# E12.0 [12] (🟠..🟫) orange circle..brown square +1F7EC..1F7EF ; Extended_Pictographic# E0.0 [4] (..) <reserved-1F7EC>..<reserved-1F7EF> +1F7F0 ; Extended_Pictographic# E14.0 [1] (🟰) heavy equals sign +1F7F1..1F7FF ; Extended_Pictographic# E0.0 [15] (..) <reserved-1F7F1>..<reserved-1F7FF> +1F80C..1F80F ; Extended_Pictographic# E0.0 [4] (..) <reserved-1F80C>..<reserved-1F80F> +1F848..1F84F ; Extended_Pictographic# E0.0 [8] (..) <reserved-1F848>..<reserved-1F84F> +1F85A..1F85F ; Extended_Pictographic# E0.0 [6] (..) <reserved-1F85A>..<reserved-1F85F> +1F888..1F88F ; Extended_Pictographic# E0.0 [8] (..) <reserved-1F888>..<reserved-1F88F> +1F8AE..1F8FF ; Extended_Pictographic# E0.0 [82] (..) <reserved-1F8AE>..<reserved-1F8FF> +1F90C ; Extended_Pictographic# E13.0 [1] (🤌) pinched fingers +1F90D..1F90F ; Extended_Pictographic# E12.0 [3] (🤍..🤏) white heart..pinching hand +1F910..1F918 ; Extended_Pictographic# E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns +1F919..1F91E ; Extended_Pictographic# E3.0 [6] (🤙..🤞) call me hand..crossed fingers +1F91F ; Extended_Pictographic# E5.0 [1] (🤟) love-you gesture +1F920..1F927 ; Extended_Pictographic# E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face +1F928..1F92F ; Extended_Pictographic# E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head +1F930 ; Extended_Pictographic# E3.0 [1] (🤰) pregnant woman +1F931..1F932 ; Extended_Pictographic# E5.0 [2] (🤱..🤲) breast-feeding..palms up together +1F933..1F93A ; Extended_Pictographic# E3.0 [8] (🤳..🤺) selfie..person fencing +1F93C..1F93E ; Extended_Pictographic# E3.0 [3] (🤼..🤾) people wrestling..person playing handball +1F93F ; Extended_Pictographic# E12.0 [1] (🤿) diving mask +1F940..1F945 ; Extended_Pictographic# E3.0 [6] (🥀..🥅) wilted flower..goal net +1F947..1F94B ; Extended_Pictographic# E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform +1F94C ; Extended_Pictographic# E5.0 [1] (🥌) curling stone +1F94D..1F94F ; Extended_Pictographic# E11.0 [3] (🥍..🥏) lacrosse..flying disc +1F950..1F95E ; Extended_Pictographic# E3.0 [15] (🥐..🥞) croissant..pancakes +1F95F..1F96B ; Extended_Pictographic# E5.0 [13] (🥟..🥫) dumpling..canned food +1F96C..1F970 ; Extended_Pictographic# E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts +1F971 ; Extended_Pictographic# E12.0 [1] (🥱) yawning face +1F972 ; Extended_Pictographic# E13.0 [1] (🥲) smiling face with tear +1F973..1F976 ; Extended_Pictographic# E11.0 [4] (🥳..🥶) partying face..cold face +1F977..1F978 ; Extended_Pictographic# E13.0 [2] (🥷..🥸) ninja..disguised face +1F979 ; Extended_Pictographic# E14.0 [1] (🥹) face holding back tears +1F97A ; Extended_Pictographic# E11.0 [1] (🥺) pleading face +1F97B ; Extended_Pictographic# E12.0 [1] (🥻) sari +1F97C..1F97F ; Extended_Pictographic# E11.0 [4] (🥼..🥿) lab coat..flat shoe +1F980..1F984 ; Extended_Pictographic# E1.0 [5] (🦀..🦄) crab..unicorn +1F985..1F991 ; Extended_Pictographic# E3.0 [13] (🦅..🦑) eagle..squid +1F992..1F997 ; Extended_Pictographic# E5.0 [6] (🦒..🦗) giraffe..cricket +1F998..1F9A2 ; Extended_Pictographic# E11.0 [11] (🦘..🦢) kangaroo..swan +1F9A3..1F9A4 ; Extended_Pictographic# E13.0 [2] (🦣..🦤) mammoth..dodo +1F9A5..1F9AA ; Extended_Pictographic# E12.0 [6] (🦥..🦪) sloth..oyster +1F9AB..1F9AD ; Extended_Pictographic# E13.0 [3] (🦫..🦭) beaver..seal +1F9AE..1F9AF ; Extended_Pictographic# E12.0 [2] (🦮..🦯) guide dog..white cane +1F9B0..1F9B9 ; Extended_Pictographic# E11.0 [10] (🦰..🦹) red hair..supervillain +1F9BA..1F9BF ; Extended_Pictographic# E12.0 [6] (🦺..🦿) safety vest..mechanical leg +1F9C0 ; Extended_Pictographic# E1.0 [1] (🧀) cheese wedge +1F9C1..1F9C2 ; Extended_Pictographic# E11.0 [2] (🧁..🧂) cupcake..salt +1F9C3..1F9CA ; Extended_Pictographic# E12.0 [8] (🧃..🧊) beverage box..ice +1F9CB ; Extended_Pictographic# E13.0 [1] (🧋) bubble tea +1F9CC ; Extended_Pictographic# E14.0 [1] (🧌) troll +1F9CD..1F9CF ; Extended_Pictographic# E12.0 [3] (🧍..🧏) person standing..deaf person +1F9D0..1F9E6 ; Extended_Pictographic# E5.0 [23] (🧐..🧦) face with monocle..socks +1F9E7..1F9FF ; Extended_Pictographic# E11.0 [25] (🧧..🧿) red envelope..nazar amulet +1FA00..1FA6F ; Extended_Pictographic# E0.0 [112] (🨀..) NEUTRAL CHESS KING..<reserved-1FA6F> +1FA70..1FA73 ; Extended_Pictographic# E12.0 [4] (🩰..🩳) ballet shoes..shorts +1FA74 ; Extended_Pictographic# E13.0 [1] (🩴) thong sandal +1FA75..1FA77 ; Extended_Pictographic# E15.0 [3] (🩵..🩷) light blue heart..pink heart +1FA78..1FA7A ; Extended_Pictographic# E12.0 [3] (🩸..🩺) drop of blood..stethoscope +1FA7B..1FA7C ; Extended_Pictographic# E14.0 [2] (🩻..🩼) x-ray..crutch +1FA7D..1FA7F ; Extended_Pictographic# E0.0 [3] (..) <reserved-1FA7D>..<reserved-1FA7F> +1FA80..1FA82 ; Extended_Pictographic# E12.0 [3] (🪀..🪂) yo-yo..parachute +1FA83..1FA86 ; Extended_Pictographic# E13.0 [4] (🪃..🪆) boomerang..nesting dolls +1FA87..1FA88 ; Extended_Pictographic# E15.0 [2] (🪇..🪈) maracas..flute +1FA89..1FA8F ; Extended_Pictographic# E0.0 [7] (..) <reserved-1FA89>..<reserved-1FA8F> +1FA90..1FA95 ; Extended_Pictographic# E12.0 [6] (🪐..🪕) ringed planet..banjo +1FA96..1FAA8 ; Extended_Pictographic# E13.0 [19] (🪖..🪨) military helmet..rock +1FAA9..1FAAC ; Extended_Pictographic# E14.0 [4] (🪩..🪬) mirror ball..hamsa +1FAAD..1FAAF ; Extended_Pictographic# E15.0 [3] (🪭..🪯) folding hand fan..khanda +1FAB0..1FAB6 ; Extended_Pictographic# E13.0 [7] (🪰..🪶) fly..feather +1FAB7..1FABA ; Extended_Pictographic# E14.0 [4] (🪷..🪺) lotus..nest with eggs +1FABB..1FABD ; Extended_Pictographic# E15.0 [3] (🪻..🪽) hyacinth..wing +1FABE ; Extended_Pictographic# E0.0 [1] () <reserved-1FABE> +1FABF ; Extended_Pictographic# E15.0 [1] (🪿) goose +1FAC0..1FAC2 ; Extended_Pictographic# E13.0 [3] (🫀..🫂) anatomical heart..people hugging +1FAC3..1FAC5 ; Extended_Pictographic# E14.0 [3] (🫃..🫅) pregnant man..person with crown +1FAC6..1FACD ; Extended_Pictographic# E0.0 [8] (..) <reserved-1FAC6>..<reserved-1FACD> +1FACE..1FACF ; Extended_Pictographic# E15.0 [2] (🫎..🫏) moose..donkey +1FAD0..1FAD6 ; Extended_Pictographic# E13.0 [7] (🫐..🫖) blueberries..teapot +1FAD7..1FAD9 ; Extended_Pictographic# E14.0 [3] (🫗..🫙) pouring liquid..jar +1FADA..1FADB ; Extended_Pictographic# E15.0 [2] (🫚..🫛) ginger root..pea pod +1FADC..1FADF ; Extended_Pictographic# E0.0 [4] (..) <reserved-1FADC>..<reserved-1FADF> +1FAE0..1FAE7 ; Extended_Pictographic# E14.0 [8] (🫠..🫧) melting face..bubbles +1FAE8 ; Extended_Pictographic# E15.0 [1] (🫨) shaking face +1FAE9..1FAEF ; Extended_Pictographic# E0.0 [7] (..) <reserved-1FAE9>..<reserved-1FAEF> +1FAF0..1FAF6 ; Extended_Pictographic# E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands +1FAF7..1FAF8 ; Extended_Pictographic# E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand +1FAF9..1FAFF ; Extended_Pictographic# E0.0 [7] (..) <reserved-1FAF9>..<reserved-1FAFF> +1FC00..1FFFD ; Extended_Pictographic# E0.0[1022] (..) <reserved-1FC00>..<reserved-1FFFD> + +# Total elements: 3537 + +#EOF diff --git a/vendor/librune/gen/gbrk b/vendor/librune/gen/gbrk new file mode 100755 index 0000000..5cbd87f --- /dev/null +++ b/vendor/librune/gen/gbrk @@ -0,0 +1,115 @@ +#!/bin/sh + +cache() +{ + name="/tmp/librune/$(basename "$1")" + if test ! -f "$name" + then + mkdir -p /tmp/librune + wget -q "$1" -O "$name" + fi +} + +set -e +cd "${0%/*}/.." +exec >lib/internal/gbrk_lookup.h + +readonly URL1='https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt' +readonly URL2='https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt' +readonly URL3='https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt' + +cache "$URL1" & +cache "$URL2" & +cache "$URL3" & +wait + +cat <<C +/* This file is autogenerated by gen/gbrk; DO NOT EDIT. */ + +/* TODO: Change tables to constexpr from const when Clangd gets better */ + +#ifndef RUNE_INTERNAL_GBRK_LOOKUP_H +#define RUNE_INTERNAL_GBRK_LOOKUP_H + +/* clang-format off */ + +#include "types.h" + +typedef enum { + GBP_OTHER = 0, + + GBP_CTRL = 1 << 0, /* Control */ + GBP_EXT = 1 << 1, /* Extend */ + GBP_PIC = 1 << 2, /* Extended_Pictographic */ + GBP_PREP = 1 << 3, /* Prepend */ + GBP_RI = 1 << 4, /* Regional_Indicator */ + GBP_SM = 1 << 5, /* SpacingMark */ + GBP_ZWJ = 1 << 6, /* ZWJ */ + + GBP_HNGL_L = 1 << 7, /* Hangul L */ + GBP_HNGL_LV = 1 << 8, /* Hangul LV */ + GBP_HNGL_LVT = 1 << 9, /* Hangul LVT */ + GBP_HNGL_T = 1 << 10, /* Hangul T */ + GBP_HNGL_V = 1 << 11, /* Hangul V */ + + GBP_INDC_CNSNT = 1 << 12, /* Indic Consonant */ + GBP_INDC_EXT = 1 << 13, /* Indic Extend */ + GBP_INDC_LNK = 1 << 14, /* Indic Linker */ +} gbrk_prop; + +static const struct { + rune lo, hi; + gbrk_prop prop; +} gbrk_prop_tbl[] = { +C + +gawk ' +BEGIN { + FS = "( *#.*| +; +)" + map["Control"] = "CTRL" + map["Extend"] = "EXT" + map["Extended_Pictographic"] = "PIC" + map["Prepend"] = "PREP" + map["Regional_Indicator"] = "RI" + map["SpacingMark"] = "SM" + map["ZWJ"] = "ZWJ" + + map["L"] = "HNGL_L" + map["LV"] = "HNGL_LV" + map["LVT"] = "HNGL_LVT" + map["T"] = "HNGL_T" + map["V"] = "HNGL_V" + + map["InCB; Consonant"] = "INDC_CNSNT" + map["InCB; Extend"] = "INDC_EXT" + map["InCB; Linker"] = "INDC_LNK" +} + +map[$2] { + n = split($1, a, /\.\./) + lo = strtonum("0X" a[1]) + hi = strtonum("0X" a[n]) + + for (i = lo; i <= hi; i++) { + s = "GBP_" map[$2] + props[i] = props[i] ? props[i] " | " s : s + } +} + +END { + for (i = 0; i <= 0x10FFFF; i++) { + if (!props[i]) + continue + lo = i + while (props[lo] == props[i + 1]) + i++ + printf "\t{0x%05X, 0x%05X, %s},\n", lo, i, props[lo] + } +} +' /tmp/librune/* | sort + +cat <<C +}; + +#endif /* !RUNE_INTERNAL_GBRK_LOOKUP_H */ +C diff --git a/vendor/librune/gen/mkfile b/vendor/librune/gen/mkfile new file mode 100755 index 0000000..a55b08a --- /dev/null +++ b/vendor/librune/gen/mkfile @@ -0,0 +1,37 @@ +#!/bin/sh + +set -e +cd "${0%/*}/.." +exec >Makefile + +cat <<make +.POSIX: + +CC = cc +CFLAGS = -Wall -Wextra -Wpedantic -g -ggdb3 -fanalyzer -Iinclude + +make + +printf 'objs = \\\n' +find lib -name '*.c' | sort | sed ' + s/c$/o/ + s/.*/\t& \\/ + $s/ \\$// +' + +cat <<make + +all: \$(objs) + +make + +find lib -name '*.c' | sort | sed -E 's/(.*)c$/\1o: \1c/' + +cat <<make + +clean: + find lib -name '*.o' -delete + +ls: + @echo "alias ls='ls --color=auto -I \"*.o\" -I \"compile_commands.json\"'" >&2 +make diff --git a/vendor/librune/include/gbrk.h b/vendor/librune/include/gbrk.h new file mode 100644 index 0000000..5eef882 --- /dev/null +++ b/vendor/librune/include/gbrk.h @@ -0,0 +1,10 @@ +#ifndef RUNE_GBRK_H +#define RUNE_GBRK_H + +#define _RUNE_NEEDS_U8VIEW 1 +#include "internal/types.h" /* IWYU pragma: export */ + +size_t u8glen(const char8_t *, size_t); +const char8_t *u8gnext(struct u8view *, const char8_t **, size_t *); + +#endif /* !RUNE_GBRK_H */ diff --git a/vendor/librune/include/internal/common.h b/vendor/librune/include/internal/common.h new file mode 100644 index 0000000..7107528 --- /dev/null +++ b/vendor/librune/include/internal/common.h @@ -0,0 +1,39 @@ +#ifndef RUNE_INTERNAL_COMMON_H +#define RUNE_INTERNAL_COMMON_H + +#if __STDC_VERSION__ >= 202311L +# define RUNE_IS_23 1 +#endif + +#if !RUNE_IS_23 +# include <stddef.h> /* IWYU pragma: export */ +# define nullptr NULL +#endif + +#ifndef unreachable +# if RUNE_IS_23 +# include <stddef.h> /* IWYU pragma: export */ +# elif defined(__GNUC__) || defined(__clang__) +# define unreachable() __builtin_unreachable() +# else +# define unreachable() \ + do \ + *(int *)0 = 0; \ + while (0) +# endif +#endif + +#define U1(x) (((x)&0x80) == 0x00) +#define U2(x) (((x)&0xE0) == 0xC0) +#define U3(x) (((x)&0xF0) == 0xE0) +#define U4(x) (((x)&0xF8) == 0xF0) +#define UC(x) (((x)&0xC0) == 0x80) + +/* Maximum value of a 1–4-byte long UTF-8 sequence */ +#include "rune.h" +#define _1B_MAX RUNE_C(0x00007F) +#define _2B_MAX RUNE_C(0x0007FF) +#define _3B_MAX RUNE_C(0x00FFFF) +#define _4B_MAX RUNE_C(0x10FFFF) + +#endif /* !RUNE_INTERNAL_COMMON_H */ diff --git a/vendor/librune/include/internal/gbrk_lookup.h b/vendor/librune/include/internal/gbrk_lookup.h new file mode 100644 index 0000000..39dfa8e --- /dev/null +++ b/vendor/librune/include/internal/gbrk_lookup.h @@ -0,0 +1,1569 @@ +/* This file is autogenerated by gen/gbrk; DO NOT EDIT. */ + +/* TODO: Change tables to constexpr from const when Clangd gets better */ + +#ifndef RUNE_INTERNAL_GBRK_LOOKUP_H +#define RUNE_INTERNAL_GBRK_LOOKUP_H + +/* clang-format off */ + +#include "types.h" + +typedef enum { + GBP_OTHER = 0, + + GBP_CTRL = 1 << 0, /* Control */ + GBP_EXT = 1 << 1, /* Extend */ + GBP_PIC = 1 << 2, /* Extended_Pictographic */ + GBP_PREP = 1 << 3, /* Prepend */ + GBP_RI = 1 << 4, /* Regional_Indicator */ + GBP_SM = 1 << 5, /* SpacingMark */ + GBP_ZWJ = 1 << 6, /* ZWJ */ + + GBP_HNGL_L = 1 << 7, /* Hangul L */ + GBP_HNGL_LV = 1 << 8, /* Hangul LV */ + GBP_HNGL_LVT = 1 << 9, /* Hangul LVT */ + GBP_HNGL_T = 1 << 10, /* Hangul T */ + GBP_HNGL_V = 1 << 11, /* Hangul V */ + + GBP_INDC_CNSNT = 1 << 12, /* Indic Consonant */ + GBP_INDC_EXT = 1 << 13, /* Indic Extend */ + GBP_INDC_LNK = 1 << 14, /* Indic Linker */ +} gbrk_prop; + +static const struct { + rune lo, hi; + gbrk_prop prop; +} gbrk_prop_tbl[] = { + {0x00000, 0x00009, GBP_CTRL}, + {0x0000B, 0x0000C, GBP_CTRL}, + {0x0000E, 0x0001F, GBP_CTRL}, + {0x0007F, 0x0009F, GBP_CTRL}, + {0x000A9, 0x000A9, GBP_PIC}, + {0x000AD, 0x000AD, GBP_CTRL}, + {0x000AE, 0x000AE, GBP_PIC}, + {0x00300, 0x0034E, GBP_INDC_EXT | GBP_EXT}, + {0x0034F, 0x0034F, GBP_EXT}, + {0x00350, 0x0036F, GBP_INDC_EXT | GBP_EXT}, + {0x00483, 0x00487, GBP_INDC_EXT | GBP_EXT}, + {0x00488, 0x00489, GBP_EXT}, + {0x00591, 0x005BD, GBP_INDC_EXT | GBP_EXT}, + {0x005BF, 0x005BF, GBP_INDC_EXT | GBP_EXT}, + {0x005C1, 0x005C2, GBP_INDC_EXT | GBP_EXT}, + {0x005C4, 0x005C5, GBP_INDC_EXT | GBP_EXT}, + {0x005C7, 0x005C7, GBP_INDC_EXT | GBP_EXT}, + {0x00600, 0x00605, GBP_PREP}, + {0x00610, 0x0061A, GBP_INDC_EXT | GBP_EXT}, + {0x0061C, 0x0061C, GBP_CTRL}, + {0x0064B, 0x0065F, GBP_INDC_EXT | GBP_EXT}, + {0x00670, 0x00670, GBP_INDC_EXT | GBP_EXT}, + {0x006D6, 0x006DC, GBP_INDC_EXT | GBP_EXT}, + {0x006DD, 0x006DD, GBP_PREP}, + {0x006DF, 0x006E4, GBP_INDC_EXT | GBP_EXT}, + {0x006E7, 0x006E8, GBP_INDC_EXT | GBP_EXT}, + {0x006EA, 0x006ED, GBP_INDC_EXT | GBP_EXT}, + {0x0070F, 0x0070F, GBP_PREP}, + {0x00711, 0x00711, GBP_INDC_EXT | GBP_EXT}, + {0x00730, 0x0074A, GBP_INDC_EXT | GBP_EXT}, + {0x007A6, 0x007B0, GBP_EXT}, + {0x007EB, 0x007F3, GBP_INDC_EXT | GBP_EXT}, + {0x007FD, 0x007FD, GBP_INDC_EXT | GBP_EXT}, + {0x00816, 0x00819, GBP_INDC_EXT | GBP_EXT}, + {0x0081B, 0x00823, GBP_INDC_EXT | GBP_EXT}, + {0x00825, 0x00827, GBP_INDC_EXT | GBP_EXT}, + {0x00829, 0x0082D, GBP_INDC_EXT | GBP_EXT}, + {0x00859, 0x0085B, GBP_INDC_EXT | GBP_EXT}, + {0x00890, 0x00891, GBP_PREP}, + {0x00898, 0x0089F, GBP_INDC_EXT | GBP_EXT}, + {0x008CA, 0x008E1, GBP_INDC_EXT | GBP_EXT}, + {0x008E2, 0x008E2, GBP_PREP}, + {0x008E3, 0x008FF, GBP_INDC_EXT | GBP_EXT}, + {0x00900, 0x00902, GBP_EXT}, + {0x00903, 0x00903, GBP_SM}, + {0x00915, 0x00939, GBP_INDC_CNSNT}, + {0x0093A, 0x0093A, GBP_EXT}, + {0x0093B, 0x0093B, GBP_SM}, + {0x0093C, 0x0093C, GBP_INDC_EXT | GBP_EXT}, + {0x0093E, 0x00940, GBP_SM}, + {0x00941, 0x00948, GBP_EXT}, + {0x00949, 0x0094C, GBP_SM}, + {0x0094D, 0x0094D, GBP_INDC_LNK | GBP_EXT}, + {0x0094E, 0x0094F, GBP_SM}, + {0x00951, 0x00954, GBP_INDC_EXT | GBP_EXT}, + {0x00955, 0x00957, GBP_EXT}, + {0x00958, 0x0095F, GBP_INDC_CNSNT}, + {0x00962, 0x00963, GBP_EXT}, + {0x00978, 0x0097F, GBP_INDC_CNSNT}, + {0x00981, 0x00981, GBP_EXT}, + {0x00982, 0x00983, GBP_SM}, + {0x00995, 0x009A8, GBP_INDC_CNSNT}, + {0x009AA, 0x009B0, GBP_INDC_CNSNT}, + {0x009B2, 0x009B2, GBP_INDC_CNSNT}, + {0x009B6, 0x009B9, GBP_INDC_CNSNT}, + {0x009BC, 0x009BC, GBP_INDC_EXT | GBP_EXT}, + {0x009BE, 0x009BE, GBP_EXT}, + {0x009BF, 0x009C0, GBP_SM}, + {0x009C1, 0x009C4, GBP_EXT}, + {0x009C7, 0x009C8, GBP_SM}, + {0x009CB, 0x009CC, GBP_SM}, + {0x009CD, 0x009CD, GBP_INDC_LNK | GBP_EXT}, + {0x009D7, 0x009D7, GBP_EXT}, + {0x009DC, 0x009DD, GBP_INDC_CNSNT}, + {0x009DF, 0x009DF, GBP_INDC_CNSNT}, + {0x009E2, 0x009E3, GBP_EXT}, + {0x009F0, 0x009F1, GBP_INDC_CNSNT}, + {0x009FE, 0x009FE, GBP_INDC_EXT | GBP_EXT}, + {0x00A01, 0x00A02, GBP_EXT}, + {0x00A03, 0x00A03, GBP_SM}, + {0x00A3C, 0x00A3C, GBP_INDC_EXT | GBP_EXT}, + {0x00A3E, 0x00A40, GBP_SM}, + {0x00A41, 0x00A42, GBP_EXT}, + {0x00A47, 0x00A48, GBP_EXT}, + {0x00A4B, 0x00A4D, GBP_EXT}, + {0x00A51, 0x00A51, GBP_EXT}, + {0x00A70, 0x00A71, GBP_EXT}, + {0x00A75, 0x00A75, GBP_EXT}, + {0x00A81, 0x00A82, GBP_EXT}, + {0x00A83, 0x00A83, GBP_SM}, + {0x00A95, 0x00AA8, GBP_INDC_CNSNT}, + {0x00AAA, 0x00AB0, GBP_INDC_CNSNT}, + {0x00AB2, 0x00AB3, GBP_INDC_CNSNT}, + {0x00AB5, 0x00AB9, GBP_INDC_CNSNT}, + {0x00ABC, 0x00ABC, GBP_INDC_EXT | GBP_EXT}, + {0x00ABE, 0x00AC0, GBP_SM}, + {0x00AC1, 0x00AC5, GBP_EXT}, + {0x00AC7, 0x00AC8, GBP_EXT}, + {0x00AC9, 0x00AC9, GBP_SM}, + {0x00ACB, 0x00ACC, GBP_SM}, + {0x00ACD, 0x00ACD, GBP_INDC_LNK | GBP_EXT}, + {0x00AE2, 0x00AE3, GBP_EXT}, + {0x00AF9, 0x00AF9, GBP_INDC_CNSNT}, + {0x00AFA, 0x00AFF, GBP_EXT}, + {0x00B01, 0x00B01, GBP_EXT}, + {0x00B02, 0x00B03, GBP_SM}, + {0x00B15, 0x00B28, GBP_INDC_CNSNT}, + {0x00B2A, 0x00B30, GBP_INDC_CNSNT}, + {0x00B32, 0x00B33, GBP_INDC_CNSNT}, + {0x00B35, 0x00B39, GBP_INDC_CNSNT}, + {0x00B3C, 0x00B3C, GBP_INDC_EXT | GBP_EXT}, + {0x00B3E, 0x00B3F, GBP_EXT}, + {0x00B40, 0x00B40, GBP_SM}, + {0x00B41, 0x00B44, GBP_EXT}, + {0x00B47, 0x00B48, GBP_SM}, + {0x00B4B, 0x00B4C, GBP_SM}, + {0x00B4D, 0x00B4D, GBP_INDC_LNK | GBP_EXT}, + {0x00B55, 0x00B57, GBP_EXT}, + {0x00B5C, 0x00B5D, GBP_INDC_CNSNT}, + {0x00B5F, 0x00B5F, GBP_INDC_CNSNT}, + {0x00B62, 0x00B63, GBP_EXT}, + {0x00B71, 0x00B71, GBP_INDC_CNSNT}, + {0x00B82, 0x00B82, GBP_EXT}, + {0x00BBE, 0x00BBE, GBP_EXT}, + {0x00BBF, 0x00BBF, GBP_SM}, + {0x00BC0, 0x00BC0, GBP_EXT}, + {0x00BC1, 0x00BC2, GBP_SM}, + {0x00BC6, 0x00BC8, GBP_SM}, + {0x00BCA, 0x00BCC, GBP_SM}, + {0x00BCD, 0x00BCD, GBP_EXT}, + {0x00BD7, 0x00BD7, GBP_EXT}, + {0x00C00, 0x00C00, GBP_EXT}, + {0x00C01, 0x00C03, GBP_SM}, + {0x00C04, 0x00C04, GBP_EXT}, + {0x00C15, 0x00C28, GBP_INDC_CNSNT}, + {0x00C2A, 0x00C39, GBP_INDC_CNSNT}, + {0x00C3C, 0x00C3C, GBP_INDC_EXT | GBP_EXT}, + {0x00C3E, 0x00C40, GBP_EXT}, + {0x00C41, 0x00C44, GBP_SM}, + {0x00C46, 0x00C48, GBP_EXT}, + {0x00C4A, 0x00C4C, GBP_EXT}, + {0x00C4D, 0x00C4D, GBP_INDC_LNK | GBP_EXT}, + {0x00C55, 0x00C56, GBP_INDC_EXT | GBP_EXT}, + {0x00C58, 0x00C5A, GBP_INDC_CNSNT}, + {0x00C62, 0x00C63, GBP_EXT}, + {0x00C81, 0x00C81, GBP_EXT}, + {0x00C82, 0x00C83, GBP_SM}, + {0x00CBC, 0x00CBC, GBP_INDC_EXT | GBP_EXT}, + {0x00CBE, 0x00CBE, GBP_SM}, + {0x00CBF, 0x00CBF, GBP_EXT}, + {0x00CC0, 0x00CC1, GBP_SM}, + {0x00CC2, 0x00CC2, GBP_EXT}, + {0x00CC3, 0x00CC4, GBP_SM}, + {0x00CC6, 0x00CC6, GBP_EXT}, + {0x00CC7, 0x00CC8, GBP_SM}, + {0x00CCA, 0x00CCB, GBP_SM}, + {0x00CCC, 0x00CCD, GBP_EXT}, + {0x00CD5, 0x00CD6, GBP_EXT}, + {0x00CE2, 0x00CE3, GBP_EXT}, + {0x00CF3, 0x00CF3, GBP_SM}, + {0x00D00, 0x00D01, GBP_EXT}, + {0x00D02, 0x00D03, GBP_SM}, + {0x00D15, 0x00D3A, GBP_INDC_CNSNT}, + {0x00D3B, 0x00D3C, GBP_INDC_EXT | GBP_EXT}, + {0x00D3E, 0x00D3E, GBP_EXT}, + {0x00D3F, 0x00D40, GBP_SM}, + {0x00D41, 0x00D44, GBP_EXT}, + {0x00D46, 0x00D48, GBP_SM}, + {0x00D4A, 0x00D4C, GBP_SM}, + {0x00D4D, 0x00D4D, GBP_INDC_LNK | GBP_EXT}, + {0x00D4E, 0x00D4E, GBP_PREP}, + {0x00D57, 0x00D57, GBP_EXT}, + {0x00D62, 0x00D63, GBP_EXT}, + {0x00D81, 0x00D81, GBP_EXT}, + {0x00D82, 0x00D83, GBP_SM}, + {0x00DCA, 0x00DCA, GBP_EXT}, + {0x00DCF, 0x00DCF, GBP_EXT}, + {0x00DD0, 0x00DD1, GBP_SM}, + {0x00DD2, 0x00DD4, GBP_EXT}, + {0x00DD6, 0x00DD6, GBP_EXT}, + {0x00DD8, 0x00DDE, GBP_SM}, + {0x00DDF, 0x00DDF, GBP_EXT}, + {0x00DF2, 0x00DF3, GBP_SM}, + {0x00E31, 0x00E31, GBP_EXT}, + {0x00E33, 0x00E33, GBP_SM}, + {0x00E34, 0x00E37, GBP_EXT}, + {0x00E38, 0x00E3A, GBP_INDC_EXT | GBP_EXT}, + {0x00E47, 0x00E47, GBP_EXT}, + {0x00E48, 0x00E4B, GBP_INDC_EXT | GBP_EXT}, + {0x00E4C, 0x00E4E, GBP_EXT}, + {0x00EB1, 0x00EB1, GBP_EXT}, + {0x00EB3, 0x00EB3, GBP_SM}, + {0x00EB4, 0x00EB7, GBP_EXT}, + {0x00EB8, 0x00EBA, GBP_INDC_EXT | GBP_EXT}, + {0x00EBB, 0x00EBC, GBP_EXT}, + {0x00EC8, 0x00ECB, GBP_INDC_EXT | GBP_EXT}, + {0x00ECC, 0x00ECE, GBP_EXT}, + {0x00F18, 0x00F19, GBP_INDC_EXT | GBP_EXT}, + {0x00F35, 0x00F35, GBP_INDC_EXT | GBP_EXT}, + {0x00F37, 0x00F37, GBP_INDC_EXT | GBP_EXT}, + {0x00F39, 0x00F39, GBP_INDC_EXT | GBP_EXT}, + {0x00F3E, 0x00F3F, GBP_SM}, + {0x00F71, 0x00F72, GBP_INDC_EXT | GBP_EXT}, + {0x00F73, 0x00F73, GBP_EXT}, + {0x00F74, 0x00F74, GBP_INDC_EXT | GBP_EXT}, + {0x00F75, 0x00F79, GBP_EXT}, + {0x00F7A, 0x00F7D, GBP_INDC_EXT | GBP_EXT}, + {0x00F7E, 0x00F7E, GBP_EXT}, + {0x00F7F, 0x00F7F, GBP_SM}, + {0x00F80, 0x00F80, GBP_INDC_EXT | GBP_EXT}, + {0x00F81, 0x00F81, GBP_EXT}, + {0x00F82, 0x00F84, GBP_INDC_EXT | GBP_EXT}, + {0x00F86, 0x00F87, GBP_INDC_EXT | GBP_EXT}, + {0x00F8D, 0x00F97, GBP_EXT}, + {0x00F99, 0x00FBC, GBP_EXT}, + {0x00FC6, 0x00FC6, GBP_INDC_EXT | GBP_EXT}, + {0x0102D, 0x01030, GBP_EXT}, + {0x01031, 0x01031, GBP_SM}, + {0x01032, 0x01036, GBP_EXT}, + {0x01037, 0x01037, GBP_INDC_EXT | GBP_EXT}, + {0x01039, 0x0103A, GBP_INDC_EXT | GBP_EXT}, + {0x0103B, 0x0103C, GBP_SM}, + {0x0103D, 0x0103E, GBP_EXT}, + {0x01056, 0x01057, GBP_SM}, + {0x01058, 0x01059, GBP_EXT}, + {0x0105E, 0x01060, GBP_EXT}, + {0x01071, 0x01074, GBP_EXT}, + {0x01082, 0x01082, GBP_EXT}, + {0x01084, 0x01084, GBP_SM}, + {0x01085, 0x01086, GBP_EXT}, + {0x0108D, 0x0108D, GBP_INDC_EXT | GBP_EXT}, + {0x0109D, 0x0109D, GBP_EXT}, + {0x01100, 0x0115F, GBP_HNGL_L}, + {0x01160, 0x011A7, GBP_HNGL_V}, + {0x011A8, 0x011FF, GBP_HNGL_T}, + {0x0135D, 0x0135F, GBP_INDC_EXT | GBP_EXT}, + {0x01712, 0x01713, GBP_EXT}, + {0x01714, 0x01714, GBP_INDC_EXT | GBP_EXT}, + {0x01715, 0x01715, GBP_SM}, + {0x01732, 0x01733, GBP_EXT}, + {0x01734, 0x01734, GBP_SM}, + {0x01752, 0x01753, GBP_EXT}, + {0x01772, 0x01773, GBP_EXT}, + {0x017B4, 0x017B5, GBP_EXT}, + {0x017B6, 0x017B6, GBP_SM}, + {0x017B7, 0x017BD, GBP_EXT}, + {0x017BE, 0x017C5, GBP_SM}, + {0x017C6, 0x017C6, GBP_EXT}, + {0x017C7, 0x017C8, GBP_SM}, + {0x017C9, 0x017D1, GBP_EXT}, + {0x017D2, 0x017D2, GBP_INDC_EXT | GBP_EXT}, + {0x017D3, 0x017D3, GBP_EXT}, + {0x017DD, 0x017DD, GBP_INDC_EXT | GBP_EXT}, + {0x0180B, 0x0180D, GBP_EXT}, + {0x0180E, 0x0180E, GBP_CTRL}, + {0x0180F, 0x0180F, GBP_EXT}, + {0x01885, 0x01886, GBP_EXT}, + {0x018A9, 0x018A9, GBP_INDC_EXT | GBP_EXT}, + {0x01920, 0x01922, GBP_EXT}, + {0x01923, 0x01926, GBP_SM}, + {0x01927, 0x01928, GBP_EXT}, + {0x01929, 0x0192B, GBP_SM}, + {0x01930, 0x01931, GBP_SM}, + {0x01932, 0x01932, GBP_EXT}, + {0x01933, 0x01938, GBP_SM}, + {0x01939, 0x0193B, GBP_INDC_EXT | GBP_EXT}, + {0x01A17, 0x01A18, GBP_INDC_EXT | GBP_EXT}, + {0x01A19, 0x01A1A, GBP_SM}, + {0x01A1B, 0x01A1B, GBP_EXT}, + {0x01A55, 0x01A55, GBP_SM}, + {0x01A56, 0x01A56, GBP_EXT}, + {0x01A57, 0x01A57, GBP_SM}, + {0x01A58, 0x01A5E, GBP_EXT}, + {0x01A60, 0x01A60, GBP_INDC_EXT | GBP_EXT}, + {0x01A62, 0x01A62, GBP_EXT}, + {0x01A65, 0x01A6C, GBP_EXT}, + {0x01A6D, 0x01A72, GBP_SM}, + {0x01A73, 0x01A74, GBP_EXT}, + {0x01A75, 0x01A7C, GBP_INDC_EXT | GBP_EXT}, + {0x01A7F, 0x01A7F, GBP_INDC_EXT | GBP_EXT}, + {0x01AB0, 0x01ABD, GBP_INDC_EXT | GBP_EXT}, + {0x01ABE, 0x01ABE, GBP_EXT}, + {0x01ABF, 0x01ACE, GBP_INDC_EXT | GBP_EXT}, + {0x01B00, 0x01B03, GBP_EXT}, + {0x01B04, 0x01B04, GBP_SM}, + {0x01B34, 0x01B34, GBP_INDC_EXT | GBP_EXT}, + {0x01B35, 0x01B3A, GBP_EXT}, + {0x01B3B, 0x01B3B, GBP_SM}, + {0x01B3C, 0x01B3C, GBP_EXT}, + {0x01B3D, 0x01B41, GBP_SM}, + {0x01B42, 0x01B42, GBP_EXT}, + {0x01B43, 0x01B44, GBP_SM}, + {0x01B6B, 0x01B73, GBP_INDC_EXT | GBP_EXT}, + {0x01B80, 0x01B81, GBP_EXT}, + {0x01B82, 0x01B82, GBP_SM}, + {0x01BA1, 0x01BA1, GBP_SM}, + {0x01BA2, 0x01BA5, GBP_EXT}, + {0x01BA6, 0x01BA7, GBP_SM}, + {0x01BA8, 0x01BA9, GBP_EXT}, + {0x01BAA, 0x01BAA, GBP_SM}, + {0x01BAB, 0x01BAB, GBP_INDC_EXT | GBP_EXT}, + {0x01BAC, 0x01BAD, GBP_EXT}, + {0x01BE6, 0x01BE6, GBP_INDC_EXT | GBP_EXT}, + {0x01BE7, 0x01BE7, GBP_SM}, + {0x01BE8, 0x01BE9, GBP_EXT}, + {0x01BEA, 0x01BEC, GBP_SM}, + {0x01BED, 0x01BED, GBP_EXT}, + {0x01BEE, 0x01BEE, GBP_SM}, + {0x01BEF, 0x01BF1, GBP_EXT}, + {0x01BF2, 0x01BF3, GBP_SM}, + {0x01C24, 0x01C2B, GBP_SM}, + {0x01C2C, 0x01C33, GBP_EXT}, + {0x01C34, 0x01C35, GBP_SM}, + {0x01C36, 0x01C36, GBP_EXT}, + {0x01C37, 0x01C37, GBP_INDC_EXT | GBP_EXT}, + {0x01CD0, 0x01CD2, GBP_INDC_EXT | GBP_EXT}, + {0x01CD4, 0x01CE0, GBP_INDC_EXT | GBP_EXT}, + {0x01CE1, 0x01CE1, GBP_SM}, + {0x01CE2, 0x01CE8, GBP_INDC_EXT | GBP_EXT}, + {0x01CED, 0x01CED, GBP_INDC_EXT | GBP_EXT}, + {0x01CF4, 0x01CF4, GBP_INDC_EXT | GBP_EXT}, + {0x01CF7, 0x01CF7, GBP_SM}, + {0x01CF8, 0x01CF9, GBP_INDC_EXT | GBP_EXT}, + {0x01DC0, 0x01DFF, GBP_INDC_EXT | GBP_EXT}, + {0x0200B, 0x0200B, GBP_CTRL}, + {0x0200C, 0x0200C, GBP_EXT}, + {0x0200D, 0x0200D, GBP_INDC_EXT | GBP_ZWJ}, + {0x0200E, 0x0200F, GBP_CTRL}, + {0x02028, 0x0202E, GBP_CTRL}, + {0x0203C, 0x0203C, GBP_PIC}, + {0x02049, 0x02049, GBP_PIC}, + {0x02060, 0x0206F, GBP_CTRL}, + {0x020D0, 0x020DC, GBP_INDC_EXT | GBP_EXT}, + {0x020DD, 0x020E0, GBP_EXT}, + {0x020E1, 0x020E1, GBP_INDC_EXT | GBP_EXT}, + {0x020E2, 0x020E4, GBP_EXT}, + {0x020E5, 0x020F0, GBP_INDC_EXT | GBP_EXT}, + {0x02122, 0x02122, GBP_PIC}, + {0x02139, 0x02139, GBP_PIC}, + {0x02194, 0x02199, GBP_PIC}, + {0x021A9, 0x021AA, GBP_PIC}, + {0x0231A, 0x0231B, GBP_PIC}, + {0x02328, 0x02328, GBP_PIC}, + {0x02388, 0x02388, GBP_PIC}, + {0x023CF, 0x023CF, GBP_PIC}, + {0x023E9, 0x023F3, GBP_PIC}, + {0x023F8, 0x023FA, GBP_PIC}, + {0x024C2, 0x024C2, GBP_PIC}, + {0x025AA, 0x025AB, GBP_PIC}, + {0x025B6, 0x025B6, GBP_PIC}, + {0x025C0, 0x025C0, GBP_PIC}, + {0x025FB, 0x025FE, GBP_PIC}, + {0x02600, 0x02605, GBP_PIC}, + {0x02607, 0x02612, GBP_PIC}, + {0x02614, 0x02685, GBP_PIC}, + {0x02690, 0x02705, GBP_PIC}, + {0x02708, 0x02712, GBP_PIC}, + {0x02714, 0x02714, GBP_PIC}, + {0x02716, 0x02716, GBP_PIC}, + {0x0271D, 0x0271D, GBP_PIC}, + {0x02721, 0x02721, GBP_PIC}, + {0x02728, 0x02728, GBP_PIC}, + {0x02733, 0x02734, GBP_PIC}, + {0x02744, 0x02744, GBP_PIC}, + {0x02747, 0x02747, GBP_PIC}, + {0x0274C, 0x0274C, GBP_PIC}, + {0x0274E, 0x0274E, GBP_PIC}, + {0x02753, 0x02755, GBP_PIC}, + {0x02757, 0x02757, GBP_PIC}, + {0x02763, 0x02767, GBP_PIC}, + {0x02795, 0x02797, GBP_PIC}, + {0x027A1, 0x027A1, GBP_PIC}, + {0x027B0, 0x027B0, GBP_PIC}, + {0x027BF, 0x027BF, GBP_PIC}, + {0x02934, 0x02935, GBP_PIC}, + {0x02B05, 0x02B07, GBP_PIC}, + {0x02B1B, 0x02B1C, GBP_PIC}, + {0x02B50, 0x02B50, GBP_PIC}, + {0x02B55, 0x02B55, GBP_PIC}, + {0x02CEF, 0x02CF1, GBP_INDC_EXT | GBP_EXT}, + {0x02D7F, 0x02D7F, GBP_INDC_EXT | GBP_EXT}, + {0x02DE0, 0x02DFF, GBP_INDC_EXT | GBP_EXT}, + {0x0302A, 0x0302F, GBP_INDC_EXT | GBP_EXT}, + {0x03030, 0x03030, GBP_PIC}, + {0x0303D, 0x0303D, GBP_PIC}, + {0x03099, 0x0309A, GBP_INDC_EXT | GBP_EXT}, + {0x03297, 0x03297, GBP_PIC}, + {0x03299, 0x03299, GBP_PIC}, + {0x0A66F, 0x0A66F, GBP_INDC_EXT | GBP_EXT}, + {0x0A670, 0x0A672, GBP_EXT}, + {0x0A674, 0x0A67D, GBP_INDC_EXT | GBP_EXT}, + {0x0A69E, 0x0A69F, GBP_INDC_EXT | GBP_EXT}, + {0x0A6F0, 0x0A6F1, GBP_INDC_EXT | GBP_EXT}, + {0x0A802, 0x0A802, GBP_EXT}, + {0x0A806, 0x0A806, GBP_EXT}, + {0x0A80B, 0x0A80B, GBP_EXT}, + {0x0A823, 0x0A824, GBP_SM}, + {0x0A825, 0x0A826, GBP_EXT}, + {0x0A827, 0x0A827, GBP_SM}, + {0x0A82C, 0x0A82C, GBP_INDC_EXT | GBP_EXT}, + {0x0A880, 0x0A881, GBP_SM}, + {0x0A8B4, 0x0A8C3, GBP_SM}, + {0x0A8C4, 0x0A8C5, GBP_EXT}, + {0x0A8E0, 0x0A8F1, GBP_INDC_EXT | GBP_EXT}, + {0x0A8FF, 0x0A8FF, GBP_EXT}, + {0x0A926, 0x0A92A, GBP_EXT}, + {0x0A92B, 0x0A92D, GBP_INDC_EXT | GBP_EXT}, + {0x0A947, 0x0A951, GBP_EXT}, + {0x0A952, 0x0A953, GBP_SM}, + {0x0A960, 0x0A97C, GBP_HNGL_L}, + {0x0A980, 0x0A982, GBP_EXT}, + {0x0A983, 0x0A983, GBP_SM}, + {0x0A9B3, 0x0A9B3, GBP_INDC_EXT | GBP_EXT}, + {0x0A9B4, 0x0A9B5, GBP_SM}, + {0x0A9B6, 0x0A9B9, GBP_EXT}, + {0x0A9BA, 0x0A9BB, GBP_SM}, + {0x0A9BC, 0x0A9BD, GBP_EXT}, + {0x0A9BE, 0x0A9C0, GBP_SM}, + {0x0A9E5, 0x0A9E5, GBP_EXT}, + {0x0AA29, 0x0AA2E, GBP_EXT}, + {0x0AA2F, 0x0AA30, GBP_SM}, + {0x0AA31, 0x0AA32, GBP_EXT}, + {0x0AA33, 0x0AA34, GBP_SM}, + {0x0AA35, 0x0AA36, GBP_EXT}, + {0x0AA43, 0x0AA43, GBP_EXT}, + {0x0AA4C, 0x0AA4C, GBP_EXT}, + {0x0AA4D, 0x0AA4D, GBP_SM}, + {0x0AA7C, 0x0AA7C, GBP_EXT}, + {0x0AAB0, 0x0AAB0, GBP_INDC_EXT | GBP_EXT}, + {0x0AAB2, 0x0AAB4, GBP_INDC_EXT | GBP_EXT}, + {0x0AAB7, 0x0AAB8, GBP_INDC_EXT | GBP_EXT}, + {0x0AABE, 0x0AABF, GBP_INDC_EXT | GBP_EXT}, + {0x0AAC1, 0x0AAC1, GBP_INDC_EXT | GBP_EXT}, + {0x0AAEB, 0x0AAEB, GBP_SM}, + {0x0AAEC, 0x0AAED, GBP_EXT}, + {0x0AAEE, 0x0AAEF, GBP_SM}, + {0x0AAF5, 0x0AAF5, GBP_SM}, + {0x0AAF6, 0x0AAF6, GBP_INDC_EXT | GBP_EXT}, + {0x0ABE3, 0x0ABE4, GBP_SM}, + {0x0ABE5, 0x0ABE5, GBP_EXT}, + {0x0ABE6, 0x0ABE7, GBP_SM}, + {0x0ABE8, 0x0ABE8, GBP_EXT}, + {0x0ABE9, 0x0ABEA, GBP_SM}, + {0x0ABEC, 0x0ABEC, GBP_SM}, + {0x0ABED, 0x0ABED, GBP_INDC_EXT | GBP_EXT}, + {0x0AC00, 0x0AC00, GBP_HNGL_LV}, + {0x0AC01, 0x0AC1B, GBP_HNGL_LVT}, + {0x0AC1C, 0x0AC1C, GBP_HNGL_LV}, + {0x0AC1D, 0x0AC37, GBP_HNGL_LVT}, + {0x0AC38, 0x0AC38, GBP_HNGL_LV}, + {0x0AC39, 0x0AC53, GBP_HNGL_LVT}, + {0x0AC54, 0x0AC54, GBP_HNGL_LV}, + {0x0AC55, 0x0AC6F, GBP_HNGL_LVT}, + {0x0AC70, 0x0AC70, GBP_HNGL_LV}, + {0x0AC71, 0x0AC8B, GBP_HNGL_LVT}, + {0x0AC8C, 0x0AC8C, GBP_HNGL_LV}, + {0x0AC8D, 0x0ACA7, GBP_HNGL_LVT}, + {0x0ACA8, 0x0ACA8, GBP_HNGL_LV}, + {0x0ACA9, 0x0ACC3, GBP_HNGL_LVT}, + {0x0ACC4, 0x0ACC4, GBP_HNGL_LV}, + {0x0ACC5, 0x0ACDF, GBP_HNGL_LVT}, + {0x0ACE0, 0x0ACE0, GBP_HNGL_LV}, + {0x0ACE1, 0x0ACFB, GBP_HNGL_LVT}, + {0x0ACFC, 0x0ACFC, GBP_HNGL_LV}, + {0x0ACFD, 0x0AD17, GBP_HNGL_LVT}, + {0x0AD18, 0x0AD18, GBP_HNGL_LV}, + {0x0AD19, 0x0AD33, GBP_HNGL_LVT}, + {0x0AD34, 0x0AD34, GBP_HNGL_LV}, + {0x0AD35, 0x0AD4F, GBP_HNGL_LVT}, + {0x0AD50, 0x0AD50, GBP_HNGL_LV}, + {0x0AD51, 0x0AD6B, GBP_HNGL_LVT}, + {0x0AD6C, 0x0AD6C, GBP_HNGL_LV}, + {0x0AD6D, 0x0AD87, GBP_HNGL_LVT}, + {0x0AD88, 0x0AD88, GBP_HNGL_LV}, + {0x0AD89, 0x0ADA3, GBP_HNGL_LVT}, + {0x0ADA4, 0x0ADA4, GBP_HNGL_LV}, + {0x0ADA5, 0x0ADBF, GBP_HNGL_LVT}, + {0x0ADC0, 0x0ADC0, GBP_HNGL_LV}, + {0x0ADC1, 0x0ADDB, GBP_HNGL_LVT}, + {0x0ADDC, 0x0ADDC, GBP_HNGL_LV}, + {0x0ADDD, 0x0ADF7, GBP_HNGL_LVT}, + {0x0ADF8, 0x0ADF8, GBP_HNGL_LV}, + {0x0ADF9, 0x0AE13, GBP_HNGL_LVT}, + {0x0AE14, 0x0AE14, GBP_HNGL_LV}, + {0x0AE15, 0x0AE2F, GBP_HNGL_LVT}, + {0x0AE30, 0x0AE30, GBP_HNGL_LV}, + {0x0AE31, 0x0AE4B, GBP_HNGL_LVT}, + {0x0AE4C, 0x0AE4C, GBP_HNGL_LV}, + {0x0AE4D, 0x0AE67, GBP_HNGL_LVT}, + {0x0AE68, 0x0AE68, GBP_HNGL_LV}, + {0x0AE69, 0x0AE83, GBP_HNGL_LVT}, + {0x0AE84, 0x0AE84, GBP_HNGL_LV}, + {0x0AE85, 0x0AE9F, GBP_HNGL_LVT}, + {0x0AEA0, 0x0AEA0, GBP_HNGL_LV}, + {0x0AEA1, 0x0AEBB, GBP_HNGL_LVT}, + {0x0AEBC, 0x0AEBC, GBP_HNGL_LV}, + {0x0AEBD, 0x0AED7, GBP_HNGL_LVT}, + {0x0AED8, 0x0AED8, GBP_HNGL_LV}, + {0x0AED9, 0x0AEF3, GBP_HNGL_LVT}, + {0x0AEF4, 0x0AEF4, GBP_HNGL_LV}, + {0x0AEF5, 0x0AF0F, GBP_HNGL_LVT}, + {0x0AF10, 0x0AF10, GBP_HNGL_LV}, + {0x0AF11, 0x0AF2B, GBP_HNGL_LVT}, + {0x0AF2C, 0x0AF2C, GBP_HNGL_LV}, + {0x0AF2D, 0x0AF47, GBP_HNGL_LVT}, + {0x0AF48, 0x0AF48, GBP_HNGL_LV}, + {0x0AF49, 0x0AF63, GBP_HNGL_LVT}, + {0x0AF64, 0x0AF64, GBP_HNGL_LV}, + {0x0AF65, 0x0AF7F, GBP_HNGL_LVT}, + {0x0AF80, 0x0AF80, GBP_HNGL_LV}, + {0x0AF81, 0x0AF9B, GBP_HNGL_LVT}, + {0x0AF9C, 0x0AF9C, GBP_HNGL_LV}, + {0x0AF9D, 0x0AFB7, GBP_HNGL_LVT}, + {0x0AFB8, 0x0AFB8, GBP_HNGL_LV}, + {0x0AFB9, 0x0AFD3, GBP_HNGL_LVT}, + {0x0AFD4, 0x0AFD4, GBP_HNGL_LV}, + {0x0AFD5, 0x0AFEF, GBP_HNGL_LVT}, + {0x0AFF0, 0x0AFF0, GBP_HNGL_LV}, + {0x0AFF1, 0x0B00B, GBP_HNGL_LVT}, + {0x0B00C, 0x0B00C, GBP_HNGL_LV}, + {0x0B00D, 0x0B027, GBP_HNGL_LVT}, + {0x0B028, 0x0B028, GBP_HNGL_LV}, + {0x0B029, 0x0B043, GBP_HNGL_LVT}, + {0x0B044, 0x0B044, GBP_HNGL_LV}, + {0x0B045, 0x0B05F, GBP_HNGL_LVT}, + {0x0B060, 0x0B060, GBP_HNGL_LV}, + {0x0B061, 0x0B07B, GBP_HNGL_LVT}, + {0x0B07C, 0x0B07C, GBP_HNGL_LV}, + {0x0B07D, 0x0B097, GBP_HNGL_LVT}, + {0x0B098, 0x0B098, GBP_HNGL_LV}, + {0x0B099, 0x0B0B3, GBP_HNGL_LVT}, + {0x0B0B4, 0x0B0B4, GBP_HNGL_LV}, + {0x0B0B5, 0x0B0CF, GBP_HNGL_LVT}, + {0x0B0D0, 0x0B0D0, GBP_HNGL_LV}, + {0x0B0D1, 0x0B0EB, GBP_HNGL_LVT}, + {0x0B0EC, 0x0B0EC, GBP_HNGL_LV}, + {0x0B0ED, 0x0B107, GBP_HNGL_LVT}, + {0x0B108, 0x0B108, GBP_HNGL_LV}, + {0x0B109, 0x0B123, GBP_HNGL_LVT}, + {0x0B124, 0x0B124, GBP_HNGL_LV}, + {0x0B125, 0x0B13F, GBP_HNGL_LVT}, + {0x0B140, 0x0B140, GBP_HNGL_LV}, + {0x0B141, 0x0B15B, GBP_HNGL_LVT}, + {0x0B15C, 0x0B15C, GBP_HNGL_LV}, + {0x0B15D, 0x0B177, GBP_HNGL_LVT}, + {0x0B178, 0x0B178, GBP_HNGL_LV}, + {0x0B179, 0x0B193, GBP_HNGL_LVT}, + {0x0B194, 0x0B194, GBP_HNGL_LV}, + {0x0B195, 0x0B1AF, GBP_HNGL_LVT}, + {0x0B1B0, 0x0B1B0, GBP_HNGL_LV}, + {0x0B1B1, 0x0B1CB, GBP_HNGL_LVT}, + {0x0B1CC, 0x0B1CC, GBP_HNGL_LV}, + {0x0B1CD, 0x0B1E7, GBP_HNGL_LVT}, + {0x0B1E8, 0x0B1E8, GBP_HNGL_LV}, + {0x0B1E9, 0x0B203, GBP_HNGL_LVT}, + {0x0B204, 0x0B204, GBP_HNGL_LV}, + {0x0B205, 0x0B21F, GBP_HNGL_LVT}, + {0x0B220, 0x0B220, GBP_HNGL_LV}, + {0x0B221, 0x0B23B, GBP_HNGL_LVT}, + {0x0B23C, 0x0B23C, GBP_HNGL_LV}, + {0x0B23D, 0x0B257, GBP_HNGL_LVT}, + {0x0B258, 0x0B258, GBP_HNGL_LV}, + {0x0B259, 0x0B273, GBP_HNGL_LVT}, + {0x0B274, 0x0B274, GBP_HNGL_LV}, + {0x0B275, 0x0B28F, GBP_HNGL_LVT}, + {0x0B290, 0x0B290, GBP_HNGL_LV}, + {0x0B291, 0x0B2AB, GBP_HNGL_LVT}, + {0x0B2AC, 0x0B2AC, GBP_HNGL_LV}, + {0x0B2AD, 0x0B2C7, GBP_HNGL_LVT}, + {0x0B2C8, 0x0B2C8, GBP_HNGL_LV}, + {0x0B2C9, 0x0B2E3, GBP_HNGL_LVT}, + {0x0B2E4, 0x0B2E4, GBP_HNGL_LV}, + {0x0B2E5, 0x0B2FF, GBP_HNGL_LVT}, + {0x0B300, 0x0B300, GBP_HNGL_LV}, + {0x0B301, 0x0B31B, GBP_HNGL_LVT}, + {0x0B31C, 0x0B31C, GBP_HNGL_LV}, + {0x0B31D, 0x0B337, GBP_HNGL_LVT}, + {0x0B338, 0x0B338, GBP_HNGL_LV}, + {0x0B339, 0x0B353, GBP_HNGL_LVT}, + {0x0B354, 0x0B354, GBP_HNGL_LV}, + {0x0B355, 0x0B36F, GBP_HNGL_LVT}, + {0x0B370, 0x0B370, GBP_HNGL_LV}, + {0x0B371, 0x0B38B, GBP_HNGL_LVT}, + {0x0B38C, 0x0B38C, GBP_HNGL_LV}, + {0x0B38D, 0x0B3A7, GBP_HNGL_LVT}, + {0x0B3A8, 0x0B3A8, GBP_HNGL_LV}, + {0x0B3A9, 0x0B3C3, GBP_HNGL_LVT}, + {0x0B3C4, 0x0B3C4, GBP_HNGL_LV}, + {0x0B3C5, 0x0B3DF, GBP_HNGL_LVT}, + {0x0B3E0, 0x0B3E0, GBP_HNGL_LV}, + {0x0B3E1, 0x0B3FB, GBP_HNGL_LVT}, + {0x0B3FC, 0x0B3FC, GBP_HNGL_LV}, + {0x0B3FD, 0x0B417, GBP_HNGL_LVT}, + {0x0B418, 0x0B418, GBP_HNGL_LV}, + {0x0B419, 0x0B433, GBP_HNGL_LVT}, + {0x0B434, 0x0B434, GBP_HNGL_LV}, + {0x0B435, 0x0B44F, GBP_HNGL_LVT}, + {0x0B450, 0x0B450, GBP_HNGL_LV}, + {0x0B451, 0x0B46B, GBP_HNGL_LVT}, + {0x0B46C, 0x0B46C, GBP_HNGL_LV}, + {0x0B46D, 0x0B487, GBP_HNGL_LVT}, + {0x0B488, 0x0B488, GBP_HNGL_LV}, + {0x0B489, 0x0B4A3, GBP_HNGL_LVT}, + {0x0B4A4, 0x0B4A4, GBP_HNGL_LV}, + {0x0B4A5, 0x0B4BF, GBP_HNGL_LVT}, + {0x0B4C0, 0x0B4C0, GBP_HNGL_LV}, + {0x0B4C1, 0x0B4DB, GBP_HNGL_LVT}, + {0x0B4DC, 0x0B4DC, GBP_HNGL_LV}, + {0x0B4DD, 0x0B4F7, GBP_HNGL_LVT}, + {0x0B4F8, 0x0B4F8, GBP_HNGL_LV}, + {0x0B4F9, 0x0B513, GBP_HNGL_LVT}, + {0x0B514, 0x0B514, GBP_HNGL_LV}, + {0x0B515, 0x0B52F, GBP_HNGL_LVT}, + {0x0B530, 0x0B530, GBP_HNGL_LV}, + {0x0B531, 0x0B54B, GBP_HNGL_LVT}, + {0x0B54C, 0x0B54C, GBP_HNGL_LV}, + {0x0B54D, 0x0B567, GBP_HNGL_LVT}, + {0x0B568, 0x0B568, GBP_HNGL_LV}, + {0x0B569, 0x0B583, GBP_HNGL_LVT}, + {0x0B584, 0x0B584, GBP_HNGL_LV}, + {0x0B585, 0x0B59F, GBP_HNGL_LVT}, + {0x0B5A0, 0x0B5A0, GBP_HNGL_LV}, + {0x0B5A1, 0x0B5BB, GBP_HNGL_LVT}, + {0x0B5BC, 0x0B5BC, GBP_HNGL_LV}, + {0x0B5BD, 0x0B5D7, GBP_HNGL_LVT}, + {0x0B5D8, 0x0B5D8, GBP_HNGL_LV}, + {0x0B5D9, 0x0B5F3, GBP_HNGL_LVT}, + {0x0B5F4, 0x0B5F4, GBP_HNGL_LV}, + {0x0B5F5, 0x0B60F, GBP_HNGL_LVT}, + {0x0B610, 0x0B610, GBP_HNGL_LV}, + {0x0B611, 0x0B62B, GBP_HNGL_LVT}, + {0x0B62C, 0x0B62C, GBP_HNGL_LV}, + {0x0B62D, 0x0B647, GBP_HNGL_LVT}, + {0x0B648, 0x0B648, GBP_HNGL_LV}, + {0x0B649, 0x0B663, GBP_HNGL_LVT}, + {0x0B664, 0x0B664, GBP_HNGL_LV}, + {0x0B665, 0x0B67F, GBP_HNGL_LVT}, + {0x0B680, 0x0B680, GBP_HNGL_LV}, + {0x0B681, 0x0B69B, GBP_HNGL_LVT}, + {0x0B69C, 0x0B69C, GBP_HNGL_LV}, + {0x0B69D, 0x0B6B7, GBP_HNGL_LVT}, + {0x0B6B8, 0x0B6B8, GBP_HNGL_LV}, + {0x0B6B9, 0x0B6D3, GBP_HNGL_LVT}, + {0x0B6D4, 0x0B6D4, GBP_HNGL_LV}, + {0x0B6D5, 0x0B6EF, GBP_HNGL_LVT}, + {0x0B6F0, 0x0B6F0, GBP_HNGL_LV}, + {0x0B6F1, 0x0B70B, GBP_HNGL_LVT}, + {0x0B70C, 0x0B70C, GBP_HNGL_LV}, + {0x0B70D, 0x0B727, GBP_HNGL_LVT}, + {0x0B728, 0x0B728, GBP_HNGL_LV}, + {0x0B729, 0x0B743, GBP_HNGL_LVT}, + {0x0B744, 0x0B744, GBP_HNGL_LV}, + {0x0B745, 0x0B75F, GBP_HNGL_LVT}, + {0x0B760, 0x0B760, GBP_HNGL_LV}, + {0x0B761, 0x0B77B, GBP_HNGL_LVT}, + {0x0B77C, 0x0B77C, GBP_HNGL_LV}, + {0x0B77D, 0x0B797, GBP_HNGL_LVT}, + {0x0B798, 0x0B798, GBP_HNGL_LV}, + {0x0B799, 0x0B7B3, GBP_HNGL_LVT}, + {0x0B7B4, 0x0B7B4, GBP_HNGL_LV}, + {0x0B7B5, 0x0B7CF, GBP_HNGL_LVT}, + {0x0B7D0, 0x0B7D0, GBP_HNGL_LV}, + {0x0B7D1, 0x0B7EB, GBP_HNGL_LVT}, + {0x0B7EC, 0x0B7EC, GBP_HNGL_LV}, + {0x0B7ED, 0x0B807, GBP_HNGL_LVT}, + {0x0B808, 0x0B808, GBP_HNGL_LV}, + {0x0B809, 0x0B823, GBP_HNGL_LVT}, + {0x0B824, 0x0B824, GBP_HNGL_LV}, + {0x0B825, 0x0B83F, GBP_HNGL_LVT}, + {0x0B840, 0x0B840, GBP_HNGL_LV}, + {0x0B841, 0x0B85B, GBP_HNGL_LVT}, + {0x0B85C, 0x0B85C, GBP_HNGL_LV}, + {0x0B85D, 0x0B877, GBP_HNGL_LVT}, + {0x0B878, 0x0B878, GBP_HNGL_LV}, + {0x0B879, 0x0B893, GBP_HNGL_LVT}, + {0x0B894, 0x0B894, GBP_HNGL_LV}, + {0x0B895, 0x0B8AF, GBP_HNGL_LVT}, + {0x0B8B0, 0x0B8B0, GBP_HNGL_LV}, + {0x0B8B1, 0x0B8CB, GBP_HNGL_LVT}, + {0x0B8CC, 0x0B8CC, GBP_HNGL_LV}, + {0x0B8CD, 0x0B8E7, GBP_HNGL_LVT}, + {0x0B8E8, 0x0B8E8, GBP_HNGL_LV}, + {0x0B8E9, 0x0B903, GBP_HNGL_LVT}, + {0x0B904, 0x0B904, GBP_HNGL_LV}, + {0x0B905, 0x0B91F, GBP_HNGL_LVT}, + {0x0B920, 0x0B920, GBP_HNGL_LV}, + {0x0B921, 0x0B93B, GBP_HNGL_LVT}, + {0x0B93C, 0x0B93C, GBP_HNGL_LV}, + {0x0B93D, 0x0B957, GBP_HNGL_LVT}, + {0x0B958, 0x0B958, GBP_HNGL_LV}, + {0x0B959, 0x0B973, GBP_HNGL_LVT}, + {0x0B974, 0x0B974, GBP_HNGL_LV}, + {0x0B975, 0x0B98F, GBP_HNGL_LVT}, + {0x0B990, 0x0B990, GBP_HNGL_LV}, + {0x0B991, 0x0B9AB, GBP_HNGL_LVT}, + {0x0B9AC, 0x0B9AC, GBP_HNGL_LV}, + {0x0B9AD, 0x0B9C7, GBP_HNGL_LVT}, + {0x0B9C8, 0x0B9C8, GBP_HNGL_LV}, + {0x0B9C9, 0x0B9E3, GBP_HNGL_LVT}, + {0x0B9E4, 0x0B9E4, GBP_HNGL_LV}, + {0x0B9E5, 0x0B9FF, GBP_HNGL_LVT}, + {0x0BA00, 0x0BA00, GBP_HNGL_LV}, + {0x0BA01, 0x0BA1B, GBP_HNGL_LVT}, + {0x0BA1C, 0x0BA1C, GBP_HNGL_LV}, + {0x0BA1D, 0x0BA37, GBP_HNGL_LVT}, + {0x0BA38, 0x0BA38, GBP_HNGL_LV}, + {0x0BA39, 0x0BA53, GBP_HNGL_LVT}, + {0x0BA54, 0x0BA54, GBP_HNGL_LV}, + {0x0BA55, 0x0BA6F, GBP_HNGL_LVT}, + {0x0BA70, 0x0BA70, GBP_HNGL_LV}, + {0x0BA71, 0x0BA8B, GBP_HNGL_LVT}, + {0x0BA8C, 0x0BA8C, GBP_HNGL_LV}, + {0x0BA8D, 0x0BAA7, GBP_HNGL_LVT}, + {0x0BAA8, 0x0BAA8, GBP_HNGL_LV}, + {0x0BAA9, 0x0BAC3, GBP_HNGL_LVT}, + {0x0BAC4, 0x0BAC4, GBP_HNGL_LV}, + {0x0BAC5, 0x0BADF, GBP_HNGL_LVT}, + {0x0BAE0, 0x0BAE0, GBP_HNGL_LV}, + {0x0BAE1, 0x0BAFB, GBP_HNGL_LVT}, + {0x0BAFC, 0x0BAFC, GBP_HNGL_LV}, + {0x0BAFD, 0x0BB17, GBP_HNGL_LVT}, + {0x0BB18, 0x0BB18, GBP_HNGL_LV}, + {0x0BB19, 0x0BB33, GBP_HNGL_LVT}, + {0x0BB34, 0x0BB34, GBP_HNGL_LV}, + {0x0BB35, 0x0BB4F, GBP_HNGL_LVT}, + {0x0BB50, 0x0BB50, GBP_HNGL_LV}, + {0x0BB51, 0x0BB6B, GBP_HNGL_LVT}, + {0x0BB6C, 0x0BB6C, GBP_HNGL_LV}, + {0x0BB6D, 0x0BB87, GBP_HNGL_LVT}, + {0x0BB88, 0x0BB88, GBP_HNGL_LV}, + {0x0BB89, 0x0BBA3, GBP_HNGL_LVT}, + {0x0BBA4, 0x0BBA4, GBP_HNGL_LV}, + {0x0BBA5, 0x0BBBF, GBP_HNGL_LVT}, + {0x0BBC0, 0x0BBC0, GBP_HNGL_LV}, + {0x0BBC1, 0x0BBDB, GBP_HNGL_LVT}, + {0x0BBDC, 0x0BBDC, GBP_HNGL_LV}, + {0x0BBDD, 0x0BBF7, GBP_HNGL_LVT}, + {0x0BBF8, 0x0BBF8, GBP_HNGL_LV}, + {0x0BBF9, 0x0BC13, GBP_HNGL_LVT}, + {0x0BC14, 0x0BC14, GBP_HNGL_LV}, + {0x0BC15, 0x0BC2F, GBP_HNGL_LVT}, + {0x0BC30, 0x0BC30, GBP_HNGL_LV}, + {0x0BC31, 0x0BC4B, GBP_HNGL_LVT}, + {0x0BC4C, 0x0BC4C, GBP_HNGL_LV}, + {0x0BC4D, 0x0BC67, GBP_HNGL_LVT}, + {0x0BC68, 0x0BC68, GBP_HNGL_LV}, + {0x0BC69, 0x0BC83, GBP_HNGL_LVT}, + {0x0BC84, 0x0BC84, GBP_HNGL_LV}, + {0x0BC85, 0x0BC9F, GBP_HNGL_LVT}, + {0x0BCA0, 0x0BCA0, GBP_HNGL_LV}, + {0x0BCA1, 0x0BCBB, GBP_HNGL_LVT}, + {0x0BCBC, 0x0BCBC, GBP_HNGL_LV}, + {0x0BCBD, 0x0BCD7, GBP_HNGL_LVT}, + {0x0BCD8, 0x0BCD8, GBP_HNGL_LV}, + {0x0BCD9, 0x0BCF3, GBP_HNGL_LVT}, + {0x0BCF4, 0x0BCF4, GBP_HNGL_LV}, + {0x0BCF5, 0x0BD0F, GBP_HNGL_LVT}, + {0x0BD10, 0x0BD10, GBP_HNGL_LV}, + {0x0BD11, 0x0BD2B, GBP_HNGL_LVT}, + {0x0BD2C, 0x0BD2C, GBP_HNGL_LV}, + {0x0BD2D, 0x0BD47, GBP_HNGL_LVT}, + {0x0BD48, 0x0BD48, GBP_HNGL_LV}, + {0x0BD49, 0x0BD63, GBP_HNGL_LVT}, + {0x0BD64, 0x0BD64, GBP_HNGL_LV}, + {0x0BD65, 0x0BD7F, GBP_HNGL_LVT}, + {0x0BD80, 0x0BD80, GBP_HNGL_LV}, + {0x0BD81, 0x0BD9B, GBP_HNGL_LVT}, + {0x0BD9C, 0x0BD9C, GBP_HNGL_LV}, + {0x0BD9D, 0x0BDB7, GBP_HNGL_LVT}, + {0x0BDB8, 0x0BDB8, GBP_HNGL_LV}, + {0x0BDB9, 0x0BDD3, GBP_HNGL_LVT}, + {0x0BDD4, 0x0BDD4, GBP_HNGL_LV}, + {0x0BDD5, 0x0BDEF, GBP_HNGL_LVT}, + {0x0BDF0, 0x0BDF0, GBP_HNGL_LV}, + {0x0BDF1, 0x0BE0B, GBP_HNGL_LVT}, + {0x0BE0C, 0x0BE0C, GBP_HNGL_LV}, + {0x0BE0D, 0x0BE27, GBP_HNGL_LVT}, + {0x0BE28, 0x0BE28, GBP_HNGL_LV}, + {0x0BE29, 0x0BE43, GBP_HNGL_LVT}, + {0x0BE44, 0x0BE44, GBP_HNGL_LV}, + {0x0BE45, 0x0BE5F, GBP_HNGL_LVT}, + {0x0BE60, 0x0BE60, GBP_HNGL_LV}, + {0x0BE61, 0x0BE7B, GBP_HNGL_LVT}, + {0x0BE7C, 0x0BE7C, GBP_HNGL_LV}, + {0x0BE7D, 0x0BE97, GBP_HNGL_LVT}, + {0x0BE98, 0x0BE98, GBP_HNGL_LV}, + {0x0BE99, 0x0BEB3, GBP_HNGL_LVT}, + {0x0BEB4, 0x0BEB4, GBP_HNGL_LV}, + {0x0BEB5, 0x0BECF, GBP_HNGL_LVT}, + {0x0BED0, 0x0BED0, GBP_HNGL_LV}, + {0x0BED1, 0x0BEEB, GBP_HNGL_LVT}, + {0x0BEEC, 0x0BEEC, GBP_HNGL_LV}, + {0x0BEED, 0x0BF07, GBP_HNGL_LVT}, + {0x0BF08, 0x0BF08, GBP_HNGL_LV}, + {0x0BF09, 0x0BF23, GBP_HNGL_LVT}, + {0x0BF24, 0x0BF24, GBP_HNGL_LV}, + {0x0BF25, 0x0BF3F, GBP_HNGL_LVT}, + {0x0BF40, 0x0BF40, GBP_HNGL_LV}, + {0x0BF41, 0x0BF5B, GBP_HNGL_LVT}, + {0x0BF5C, 0x0BF5C, GBP_HNGL_LV}, + {0x0BF5D, 0x0BF77, GBP_HNGL_LVT}, + {0x0BF78, 0x0BF78, GBP_HNGL_LV}, + {0x0BF79, 0x0BF93, GBP_HNGL_LVT}, + {0x0BF94, 0x0BF94, GBP_HNGL_LV}, + {0x0BF95, 0x0BFAF, GBP_HNGL_LVT}, + {0x0BFB0, 0x0BFB0, GBP_HNGL_LV}, + {0x0BFB1, 0x0BFCB, GBP_HNGL_LVT}, + {0x0BFCC, 0x0BFCC, GBP_HNGL_LV}, + {0x0BFCD, 0x0BFE7, GBP_HNGL_LVT}, + {0x0BFE8, 0x0BFE8, GBP_HNGL_LV}, + {0x0BFE9, 0x0C003, GBP_HNGL_LVT}, + {0x0C004, 0x0C004, GBP_HNGL_LV}, + {0x0C005, 0x0C01F, GBP_HNGL_LVT}, + {0x0C020, 0x0C020, GBP_HNGL_LV}, + {0x0C021, 0x0C03B, GBP_HNGL_LVT}, + {0x0C03C, 0x0C03C, GBP_HNGL_LV}, + {0x0C03D, 0x0C057, GBP_HNGL_LVT}, + {0x0C058, 0x0C058, GBP_HNGL_LV}, + {0x0C059, 0x0C073, GBP_HNGL_LVT}, + {0x0C074, 0x0C074, GBP_HNGL_LV}, + {0x0C075, 0x0C08F, GBP_HNGL_LVT}, + {0x0C090, 0x0C090, GBP_HNGL_LV}, + {0x0C091, 0x0C0AB, GBP_HNGL_LVT}, + {0x0C0AC, 0x0C0AC, GBP_HNGL_LV}, + {0x0C0AD, 0x0C0C7, GBP_HNGL_LVT}, + {0x0C0C8, 0x0C0C8, GBP_HNGL_LV}, + {0x0C0C9, 0x0C0E3, GBP_HNGL_LVT}, + {0x0C0E4, 0x0C0E4, GBP_HNGL_LV}, + {0x0C0E5, 0x0C0FF, GBP_HNGL_LVT}, + {0x0C100, 0x0C100, GBP_HNGL_LV}, + {0x0C101, 0x0C11B, GBP_HNGL_LVT}, + {0x0C11C, 0x0C11C, GBP_HNGL_LV}, + {0x0C11D, 0x0C137, GBP_HNGL_LVT}, + {0x0C138, 0x0C138, GBP_HNGL_LV}, + {0x0C139, 0x0C153, GBP_HNGL_LVT}, + {0x0C154, 0x0C154, GBP_HNGL_LV}, + {0x0C155, 0x0C16F, GBP_HNGL_LVT}, + {0x0C170, 0x0C170, GBP_HNGL_LV}, + {0x0C171, 0x0C18B, GBP_HNGL_LVT}, + {0x0C18C, 0x0C18C, GBP_HNGL_LV}, + {0x0C18D, 0x0C1A7, GBP_HNGL_LVT}, + {0x0C1A8, 0x0C1A8, GBP_HNGL_LV}, + {0x0C1A9, 0x0C1C3, GBP_HNGL_LVT}, + {0x0C1C4, 0x0C1C4, GBP_HNGL_LV}, + {0x0C1C5, 0x0C1DF, GBP_HNGL_LVT}, + {0x0C1E0, 0x0C1E0, GBP_HNGL_LV}, + {0x0C1E1, 0x0C1FB, GBP_HNGL_LVT}, + {0x0C1FC, 0x0C1FC, GBP_HNGL_LV}, + {0x0C1FD, 0x0C217, GBP_HNGL_LVT}, + {0x0C218, 0x0C218, GBP_HNGL_LV}, + {0x0C219, 0x0C233, GBP_HNGL_LVT}, + {0x0C234, 0x0C234, GBP_HNGL_LV}, + {0x0C235, 0x0C24F, GBP_HNGL_LVT}, + {0x0C250, 0x0C250, GBP_HNGL_LV}, + {0x0C251, 0x0C26B, GBP_HNGL_LVT}, + {0x0C26C, 0x0C26C, GBP_HNGL_LV}, + {0x0C26D, 0x0C287, GBP_HNGL_LVT}, + {0x0C288, 0x0C288, GBP_HNGL_LV}, + {0x0C289, 0x0C2A3, GBP_HNGL_LVT}, + {0x0C2A4, 0x0C2A4, GBP_HNGL_LV}, + {0x0C2A5, 0x0C2BF, GBP_HNGL_LVT}, + {0x0C2C0, 0x0C2C0, GBP_HNGL_LV}, + {0x0C2C1, 0x0C2DB, GBP_HNGL_LVT}, + {0x0C2DC, 0x0C2DC, GBP_HNGL_LV}, + {0x0C2DD, 0x0C2F7, GBP_HNGL_LVT}, + {0x0C2F8, 0x0C2F8, GBP_HNGL_LV}, + {0x0C2F9, 0x0C313, GBP_HNGL_LVT}, + {0x0C314, 0x0C314, GBP_HNGL_LV}, + {0x0C315, 0x0C32F, GBP_HNGL_LVT}, + {0x0C330, 0x0C330, GBP_HNGL_LV}, + {0x0C331, 0x0C34B, GBP_HNGL_LVT}, + {0x0C34C, 0x0C34C, GBP_HNGL_LV}, + {0x0C34D, 0x0C367, GBP_HNGL_LVT}, + {0x0C368, 0x0C368, GBP_HNGL_LV}, + {0x0C369, 0x0C383, GBP_HNGL_LVT}, + {0x0C384, 0x0C384, GBP_HNGL_LV}, + {0x0C385, 0x0C39F, GBP_HNGL_LVT}, + {0x0C3A0, 0x0C3A0, GBP_HNGL_LV}, + {0x0C3A1, 0x0C3BB, GBP_HNGL_LVT}, + {0x0C3BC, 0x0C3BC, GBP_HNGL_LV}, + {0x0C3BD, 0x0C3D7, GBP_HNGL_LVT}, + {0x0C3D8, 0x0C3D8, GBP_HNGL_LV}, + {0x0C3D9, 0x0C3F3, GBP_HNGL_LVT}, + {0x0C3F4, 0x0C3F4, GBP_HNGL_LV}, + {0x0C3F5, 0x0C40F, GBP_HNGL_LVT}, + {0x0C410, 0x0C410, GBP_HNGL_LV}, + {0x0C411, 0x0C42B, GBP_HNGL_LVT}, + {0x0C42C, 0x0C42C, GBP_HNGL_LV}, + {0x0C42D, 0x0C447, GBP_HNGL_LVT}, + {0x0C448, 0x0C448, GBP_HNGL_LV}, + {0x0C449, 0x0C463, GBP_HNGL_LVT}, + {0x0C464, 0x0C464, GBP_HNGL_LV}, + {0x0C465, 0x0C47F, GBP_HNGL_LVT}, + {0x0C480, 0x0C480, GBP_HNGL_LV}, + {0x0C481, 0x0C49B, GBP_HNGL_LVT}, + {0x0C49C, 0x0C49C, GBP_HNGL_LV}, + {0x0C49D, 0x0C4B7, GBP_HNGL_LVT}, + {0x0C4B8, 0x0C4B8, GBP_HNGL_LV}, + {0x0C4B9, 0x0C4D3, GBP_HNGL_LVT}, + {0x0C4D4, 0x0C4D4, GBP_HNGL_LV}, + {0x0C4D5, 0x0C4EF, GBP_HNGL_LVT}, + {0x0C4F0, 0x0C4F0, GBP_HNGL_LV}, + {0x0C4F1, 0x0C50B, GBP_HNGL_LVT}, + {0x0C50C, 0x0C50C, GBP_HNGL_LV}, + {0x0C50D, 0x0C527, GBP_HNGL_LVT}, + {0x0C528, 0x0C528, GBP_HNGL_LV}, + {0x0C529, 0x0C543, GBP_HNGL_LVT}, + {0x0C544, 0x0C544, GBP_HNGL_LV}, + {0x0C545, 0x0C55F, GBP_HNGL_LVT}, + {0x0C560, 0x0C560, GBP_HNGL_LV}, + {0x0C561, 0x0C57B, GBP_HNGL_LVT}, + {0x0C57C, 0x0C57C, GBP_HNGL_LV}, + {0x0C57D, 0x0C597, GBP_HNGL_LVT}, + {0x0C598, 0x0C598, GBP_HNGL_LV}, + {0x0C599, 0x0C5B3, GBP_HNGL_LVT}, + {0x0C5B4, 0x0C5B4, GBP_HNGL_LV}, + {0x0C5B5, 0x0C5CF, GBP_HNGL_LVT}, + {0x0C5D0, 0x0C5D0, GBP_HNGL_LV}, + {0x0C5D1, 0x0C5EB, GBP_HNGL_LVT}, + {0x0C5EC, 0x0C5EC, GBP_HNGL_LV}, + {0x0C5ED, 0x0C607, GBP_HNGL_LVT}, + {0x0C608, 0x0C608, GBP_HNGL_LV}, + {0x0C609, 0x0C623, GBP_HNGL_LVT}, + {0x0C624, 0x0C624, GBP_HNGL_LV}, + {0x0C625, 0x0C63F, GBP_HNGL_LVT}, + {0x0C640, 0x0C640, GBP_HNGL_LV}, + {0x0C641, 0x0C65B, GBP_HNGL_LVT}, + {0x0C65C, 0x0C65C, GBP_HNGL_LV}, + {0x0C65D, 0x0C677, GBP_HNGL_LVT}, + {0x0C678, 0x0C678, GBP_HNGL_LV}, + {0x0C679, 0x0C693, GBP_HNGL_LVT}, + {0x0C694, 0x0C694, GBP_HNGL_LV}, + {0x0C695, 0x0C6AF, GBP_HNGL_LVT}, + {0x0C6B0, 0x0C6B0, GBP_HNGL_LV}, + {0x0C6B1, 0x0C6CB, GBP_HNGL_LVT}, + {0x0C6CC, 0x0C6CC, GBP_HNGL_LV}, + {0x0C6CD, 0x0C6E7, GBP_HNGL_LVT}, + {0x0C6E8, 0x0C6E8, GBP_HNGL_LV}, + {0x0C6E9, 0x0C703, GBP_HNGL_LVT}, + {0x0C704, 0x0C704, GBP_HNGL_LV}, + {0x0C705, 0x0C71F, GBP_HNGL_LVT}, + {0x0C720, 0x0C720, GBP_HNGL_LV}, + {0x0C721, 0x0C73B, GBP_HNGL_LVT}, + {0x0C73C, 0x0C73C, GBP_HNGL_LV}, + {0x0C73D, 0x0C757, GBP_HNGL_LVT}, + {0x0C758, 0x0C758, GBP_HNGL_LV}, + {0x0C759, 0x0C773, GBP_HNGL_LVT}, + {0x0C774, 0x0C774, GBP_HNGL_LV}, + {0x0C775, 0x0C78F, GBP_HNGL_LVT}, + {0x0C790, 0x0C790, GBP_HNGL_LV}, + {0x0C791, 0x0C7AB, GBP_HNGL_LVT}, + {0x0C7AC, 0x0C7AC, GBP_HNGL_LV}, + {0x0C7AD, 0x0C7C7, GBP_HNGL_LVT}, + {0x0C7C8, 0x0C7C8, GBP_HNGL_LV}, + {0x0C7C9, 0x0C7E3, GBP_HNGL_LVT}, + {0x0C7E4, 0x0C7E4, GBP_HNGL_LV}, + {0x0C7E5, 0x0C7FF, GBP_HNGL_LVT}, + {0x0C800, 0x0C800, GBP_HNGL_LV}, + {0x0C801, 0x0C81B, GBP_HNGL_LVT}, + {0x0C81C, 0x0C81C, GBP_HNGL_LV}, + {0x0C81D, 0x0C837, GBP_HNGL_LVT}, + {0x0C838, 0x0C838, GBP_HNGL_LV}, + {0x0C839, 0x0C853, GBP_HNGL_LVT}, + {0x0C854, 0x0C854, GBP_HNGL_LV}, + {0x0C855, 0x0C86F, GBP_HNGL_LVT}, + {0x0C870, 0x0C870, GBP_HNGL_LV}, + {0x0C871, 0x0C88B, GBP_HNGL_LVT}, + {0x0C88C, 0x0C88C, GBP_HNGL_LV}, + {0x0C88D, 0x0C8A7, GBP_HNGL_LVT}, + {0x0C8A8, 0x0C8A8, GBP_HNGL_LV}, + {0x0C8A9, 0x0C8C3, GBP_HNGL_LVT}, + {0x0C8C4, 0x0C8C4, GBP_HNGL_LV}, + {0x0C8C5, 0x0C8DF, GBP_HNGL_LVT}, + {0x0C8E0, 0x0C8E0, GBP_HNGL_LV}, + {0x0C8E1, 0x0C8FB, GBP_HNGL_LVT}, + {0x0C8FC, 0x0C8FC, GBP_HNGL_LV}, + {0x0C8FD, 0x0C917, GBP_HNGL_LVT}, + {0x0C918, 0x0C918, GBP_HNGL_LV}, + {0x0C919, 0x0C933, GBP_HNGL_LVT}, + {0x0C934, 0x0C934, GBP_HNGL_LV}, + {0x0C935, 0x0C94F, GBP_HNGL_LVT}, + {0x0C950, 0x0C950, GBP_HNGL_LV}, + {0x0C951, 0x0C96B, GBP_HNGL_LVT}, + {0x0C96C, 0x0C96C, GBP_HNGL_LV}, + {0x0C96D, 0x0C987, GBP_HNGL_LVT}, + {0x0C988, 0x0C988, GBP_HNGL_LV}, + {0x0C989, 0x0C9A3, GBP_HNGL_LVT}, + {0x0C9A4, 0x0C9A4, GBP_HNGL_LV}, + {0x0C9A5, 0x0C9BF, GBP_HNGL_LVT}, + {0x0C9C0, 0x0C9C0, GBP_HNGL_LV}, + {0x0C9C1, 0x0C9DB, GBP_HNGL_LVT}, + {0x0C9DC, 0x0C9DC, GBP_HNGL_LV}, + {0x0C9DD, 0x0C9F7, GBP_HNGL_LVT}, + {0x0C9F8, 0x0C9F8, GBP_HNGL_LV}, + {0x0C9F9, 0x0CA13, GBP_HNGL_LVT}, + {0x0CA14, 0x0CA14, GBP_HNGL_LV}, + {0x0CA15, 0x0CA2F, GBP_HNGL_LVT}, + {0x0CA30, 0x0CA30, GBP_HNGL_LV}, + {0x0CA31, 0x0CA4B, GBP_HNGL_LVT}, + {0x0CA4C, 0x0CA4C, GBP_HNGL_LV}, + {0x0CA4D, 0x0CA67, GBP_HNGL_LVT}, + {0x0CA68, 0x0CA68, GBP_HNGL_LV}, + {0x0CA69, 0x0CA83, GBP_HNGL_LVT}, + {0x0CA84, 0x0CA84, GBP_HNGL_LV}, + {0x0CA85, 0x0CA9F, GBP_HNGL_LVT}, + {0x0CAA0, 0x0CAA0, GBP_HNGL_LV}, + {0x0CAA1, 0x0CABB, GBP_HNGL_LVT}, + {0x0CABC, 0x0CABC, GBP_HNGL_LV}, + {0x0CABD, 0x0CAD7, GBP_HNGL_LVT}, + {0x0CAD8, 0x0CAD8, GBP_HNGL_LV}, + {0x0CAD9, 0x0CAF3, GBP_HNGL_LVT}, + {0x0CAF4, 0x0CAF4, GBP_HNGL_LV}, + {0x0CAF5, 0x0CB0F, GBP_HNGL_LVT}, + {0x0CB10, 0x0CB10, GBP_HNGL_LV}, + {0x0CB11, 0x0CB2B, GBP_HNGL_LVT}, + {0x0CB2C, 0x0CB2C, GBP_HNGL_LV}, + {0x0CB2D, 0x0CB47, GBP_HNGL_LVT}, + {0x0CB48, 0x0CB48, GBP_HNGL_LV}, + {0x0CB49, 0x0CB63, GBP_HNGL_LVT}, + {0x0CB64, 0x0CB64, GBP_HNGL_LV}, + {0x0CB65, 0x0CB7F, GBP_HNGL_LVT}, + {0x0CB80, 0x0CB80, GBP_HNGL_LV}, + {0x0CB81, 0x0CB9B, GBP_HNGL_LVT}, + {0x0CB9C, 0x0CB9C, GBP_HNGL_LV}, + {0x0CB9D, 0x0CBB7, GBP_HNGL_LVT}, + {0x0CBB8, 0x0CBB8, GBP_HNGL_LV}, + {0x0CBB9, 0x0CBD3, GBP_HNGL_LVT}, + {0x0CBD4, 0x0CBD4, GBP_HNGL_LV}, + {0x0CBD5, 0x0CBEF, GBP_HNGL_LVT}, + {0x0CBF0, 0x0CBF0, GBP_HNGL_LV}, + {0x0CBF1, 0x0CC0B, GBP_HNGL_LVT}, + {0x0CC0C, 0x0CC0C, GBP_HNGL_LV}, + {0x0CC0D, 0x0CC27, GBP_HNGL_LVT}, + {0x0CC28, 0x0CC28, GBP_HNGL_LV}, + {0x0CC29, 0x0CC43, GBP_HNGL_LVT}, + {0x0CC44, 0x0CC44, GBP_HNGL_LV}, + {0x0CC45, 0x0CC5F, GBP_HNGL_LVT}, + {0x0CC60, 0x0CC60, GBP_HNGL_LV}, + {0x0CC61, 0x0CC7B, GBP_HNGL_LVT}, + {0x0CC7C, 0x0CC7C, GBP_HNGL_LV}, + {0x0CC7D, 0x0CC97, GBP_HNGL_LVT}, + {0x0CC98, 0x0CC98, GBP_HNGL_LV}, + {0x0CC99, 0x0CCB3, GBP_HNGL_LVT}, + {0x0CCB4, 0x0CCB4, GBP_HNGL_LV}, + {0x0CCB5, 0x0CCCF, GBP_HNGL_LVT}, + {0x0CCD0, 0x0CCD0, GBP_HNGL_LV}, + {0x0CCD1, 0x0CCEB, GBP_HNGL_LVT}, + {0x0CCEC, 0x0CCEC, GBP_HNGL_LV}, + {0x0CCED, 0x0CD07, GBP_HNGL_LVT}, + {0x0CD08, 0x0CD08, GBP_HNGL_LV}, + {0x0CD09, 0x0CD23, GBP_HNGL_LVT}, + {0x0CD24, 0x0CD24, GBP_HNGL_LV}, + {0x0CD25, 0x0CD3F, GBP_HNGL_LVT}, + {0x0CD40, 0x0CD40, GBP_HNGL_LV}, + {0x0CD41, 0x0CD5B, GBP_HNGL_LVT}, + {0x0CD5C, 0x0CD5C, GBP_HNGL_LV}, + {0x0CD5D, 0x0CD77, GBP_HNGL_LVT}, + {0x0CD78, 0x0CD78, GBP_HNGL_LV}, + {0x0CD79, 0x0CD93, GBP_HNGL_LVT}, + {0x0CD94, 0x0CD94, GBP_HNGL_LV}, + {0x0CD95, 0x0CDAF, GBP_HNGL_LVT}, + {0x0CDB0, 0x0CDB0, GBP_HNGL_LV}, + {0x0CDB1, 0x0CDCB, GBP_HNGL_LVT}, + {0x0CDCC, 0x0CDCC, GBP_HNGL_LV}, + {0x0CDCD, 0x0CDE7, GBP_HNGL_LVT}, + {0x0CDE8, 0x0CDE8, GBP_HNGL_LV}, + {0x0CDE9, 0x0CE03, GBP_HNGL_LVT}, + {0x0CE04, 0x0CE04, GBP_HNGL_LV}, + {0x0CE05, 0x0CE1F, GBP_HNGL_LVT}, + {0x0CE20, 0x0CE20, GBP_HNGL_LV}, + {0x0CE21, 0x0CE3B, GBP_HNGL_LVT}, + {0x0CE3C, 0x0CE3C, GBP_HNGL_LV}, + {0x0CE3D, 0x0CE57, GBP_HNGL_LVT}, + {0x0CE58, 0x0CE58, GBP_HNGL_LV}, + {0x0CE59, 0x0CE73, GBP_HNGL_LVT}, + {0x0CE74, 0x0CE74, GBP_HNGL_LV}, + {0x0CE75, 0x0CE8F, GBP_HNGL_LVT}, + {0x0CE90, 0x0CE90, GBP_HNGL_LV}, + {0x0CE91, 0x0CEAB, GBP_HNGL_LVT}, + {0x0CEAC, 0x0CEAC, GBP_HNGL_LV}, + {0x0CEAD, 0x0CEC7, GBP_HNGL_LVT}, + {0x0CEC8, 0x0CEC8, GBP_HNGL_LV}, + {0x0CEC9, 0x0CEE3, GBP_HNGL_LVT}, + {0x0CEE4, 0x0CEE4, GBP_HNGL_LV}, + {0x0CEE5, 0x0CEFF, GBP_HNGL_LVT}, + {0x0CF00, 0x0CF00, GBP_HNGL_LV}, + {0x0CF01, 0x0CF1B, GBP_HNGL_LVT}, + {0x0CF1C, 0x0CF1C, GBP_HNGL_LV}, + {0x0CF1D, 0x0CF37, GBP_HNGL_LVT}, + {0x0CF38, 0x0CF38, GBP_HNGL_LV}, + {0x0CF39, 0x0CF53, GBP_HNGL_LVT}, + {0x0CF54, 0x0CF54, GBP_HNGL_LV}, + {0x0CF55, 0x0CF6F, GBP_HNGL_LVT}, + {0x0CF70, 0x0CF70, GBP_HNGL_LV}, + {0x0CF71, 0x0CF8B, GBP_HNGL_LVT}, + {0x0CF8C, 0x0CF8C, GBP_HNGL_LV}, + {0x0CF8D, 0x0CFA7, GBP_HNGL_LVT}, + {0x0CFA8, 0x0CFA8, GBP_HNGL_LV}, + {0x0CFA9, 0x0CFC3, GBP_HNGL_LVT}, + {0x0CFC4, 0x0CFC4, GBP_HNGL_LV}, + {0x0CFC5, 0x0CFDF, GBP_HNGL_LVT}, + {0x0CFE0, 0x0CFE0, GBP_HNGL_LV}, + {0x0CFE1, 0x0CFFB, GBP_HNGL_LVT}, + {0x0CFFC, 0x0CFFC, GBP_HNGL_LV}, + {0x0CFFD, 0x0D017, GBP_HNGL_LVT}, + {0x0D018, 0x0D018, GBP_HNGL_LV}, + {0x0D019, 0x0D033, GBP_HNGL_LVT}, + {0x0D034, 0x0D034, GBP_HNGL_LV}, + {0x0D035, 0x0D04F, GBP_HNGL_LVT}, + {0x0D050, 0x0D050, GBP_HNGL_LV}, + {0x0D051, 0x0D06B, GBP_HNGL_LVT}, + {0x0D06C, 0x0D06C, GBP_HNGL_LV}, + {0x0D06D, 0x0D087, GBP_HNGL_LVT}, + {0x0D088, 0x0D088, GBP_HNGL_LV}, + {0x0D089, 0x0D0A3, GBP_HNGL_LVT}, + {0x0D0A4, 0x0D0A4, GBP_HNGL_LV}, + {0x0D0A5, 0x0D0BF, GBP_HNGL_LVT}, + {0x0D0C0, 0x0D0C0, GBP_HNGL_LV}, + {0x0D0C1, 0x0D0DB, GBP_HNGL_LVT}, + {0x0D0DC, 0x0D0DC, GBP_HNGL_LV}, + {0x0D0DD, 0x0D0F7, GBP_HNGL_LVT}, + {0x0D0F8, 0x0D0F8, GBP_HNGL_LV}, + {0x0D0F9, 0x0D113, GBP_HNGL_LVT}, + {0x0D114, 0x0D114, GBP_HNGL_LV}, + {0x0D115, 0x0D12F, GBP_HNGL_LVT}, + {0x0D130, 0x0D130, GBP_HNGL_LV}, + {0x0D131, 0x0D14B, GBP_HNGL_LVT}, + {0x0D14C, 0x0D14C, GBP_HNGL_LV}, + {0x0D14D, 0x0D167, GBP_HNGL_LVT}, + {0x0D168, 0x0D168, GBP_HNGL_LV}, + {0x0D169, 0x0D183, GBP_HNGL_LVT}, + {0x0D184, 0x0D184, GBP_HNGL_LV}, + {0x0D185, 0x0D19F, GBP_HNGL_LVT}, + {0x0D1A0, 0x0D1A0, GBP_HNGL_LV}, + {0x0D1A1, 0x0D1BB, GBP_HNGL_LVT}, + {0x0D1BC, 0x0D1BC, GBP_HNGL_LV}, + {0x0D1BD, 0x0D1D7, GBP_HNGL_LVT}, + {0x0D1D8, 0x0D1D8, GBP_HNGL_LV}, + {0x0D1D9, 0x0D1F3, GBP_HNGL_LVT}, + {0x0D1F4, 0x0D1F4, GBP_HNGL_LV}, + {0x0D1F5, 0x0D20F, GBP_HNGL_LVT}, + {0x0D210, 0x0D210, GBP_HNGL_LV}, + {0x0D211, 0x0D22B, GBP_HNGL_LVT}, + {0x0D22C, 0x0D22C, GBP_HNGL_LV}, + {0x0D22D, 0x0D247, GBP_HNGL_LVT}, + {0x0D248, 0x0D248, GBP_HNGL_LV}, + {0x0D249, 0x0D263, GBP_HNGL_LVT}, + {0x0D264, 0x0D264, GBP_HNGL_LV}, + {0x0D265, 0x0D27F, GBP_HNGL_LVT}, + {0x0D280, 0x0D280, GBP_HNGL_LV}, + {0x0D281, 0x0D29B, GBP_HNGL_LVT}, + {0x0D29C, 0x0D29C, GBP_HNGL_LV}, + {0x0D29D, 0x0D2B7, GBP_HNGL_LVT}, + {0x0D2B8, 0x0D2B8, GBP_HNGL_LV}, + {0x0D2B9, 0x0D2D3, GBP_HNGL_LVT}, + {0x0D2D4, 0x0D2D4, GBP_HNGL_LV}, + {0x0D2D5, 0x0D2EF, GBP_HNGL_LVT}, + {0x0D2F0, 0x0D2F0, GBP_HNGL_LV}, + {0x0D2F1, 0x0D30B, GBP_HNGL_LVT}, + {0x0D30C, 0x0D30C, GBP_HNGL_LV}, + {0x0D30D, 0x0D327, GBP_HNGL_LVT}, + {0x0D328, 0x0D328, GBP_HNGL_LV}, + {0x0D329, 0x0D343, GBP_HNGL_LVT}, + {0x0D344, 0x0D344, GBP_HNGL_LV}, + {0x0D345, 0x0D35F, GBP_HNGL_LVT}, + {0x0D360, 0x0D360, GBP_HNGL_LV}, + {0x0D361, 0x0D37B, GBP_HNGL_LVT}, + {0x0D37C, 0x0D37C, GBP_HNGL_LV}, + {0x0D37D, 0x0D397, GBP_HNGL_LVT}, + {0x0D398, 0x0D398, GBP_HNGL_LV}, + {0x0D399, 0x0D3B3, GBP_HNGL_LVT}, + {0x0D3B4, 0x0D3B4, GBP_HNGL_LV}, + {0x0D3B5, 0x0D3CF, GBP_HNGL_LVT}, + {0x0D3D0, 0x0D3D0, GBP_HNGL_LV}, + {0x0D3D1, 0x0D3EB, GBP_HNGL_LVT}, + {0x0D3EC, 0x0D3EC, GBP_HNGL_LV}, + {0x0D3ED, 0x0D407, GBP_HNGL_LVT}, + {0x0D408, 0x0D408, GBP_HNGL_LV}, + {0x0D409, 0x0D423, GBP_HNGL_LVT}, + {0x0D424, 0x0D424, GBP_HNGL_LV}, + {0x0D425, 0x0D43F, GBP_HNGL_LVT}, + {0x0D440, 0x0D440, GBP_HNGL_LV}, + {0x0D441, 0x0D45B, GBP_HNGL_LVT}, + {0x0D45C, 0x0D45C, GBP_HNGL_LV}, + {0x0D45D, 0x0D477, GBP_HNGL_LVT}, + {0x0D478, 0x0D478, GBP_HNGL_LV}, + {0x0D479, 0x0D493, GBP_HNGL_LVT}, + {0x0D494, 0x0D494, GBP_HNGL_LV}, + {0x0D495, 0x0D4AF, GBP_HNGL_LVT}, + {0x0D4B0, 0x0D4B0, GBP_HNGL_LV}, + {0x0D4B1, 0x0D4CB, GBP_HNGL_LVT}, + {0x0D4CC, 0x0D4CC, GBP_HNGL_LV}, + {0x0D4CD, 0x0D4E7, GBP_HNGL_LVT}, + {0x0D4E8, 0x0D4E8, GBP_HNGL_LV}, + {0x0D4E9, 0x0D503, GBP_HNGL_LVT}, + {0x0D504, 0x0D504, GBP_HNGL_LV}, + {0x0D505, 0x0D51F, GBP_HNGL_LVT}, + {0x0D520, 0x0D520, GBP_HNGL_LV}, + {0x0D521, 0x0D53B, GBP_HNGL_LVT}, + {0x0D53C, 0x0D53C, GBP_HNGL_LV}, + {0x0D53D, 0x0D557, GBP_HNGL_LVT}, + {0x0D558, 0x0D558, GBP_HNGL_LV}, + {0x0D559, 0x0D573, GBP_HNGL_LVT}, + {0x0D574, 0x0D574, GBP_HNGL_LV}, + {0x0D575, 0x0D58F, GBP_HNGL_LVT}, + {0x0D590, 0x0D590, GBP_HNGL_LV}, + {0x0D591, 0x0D5AB, GBP_HNGL_LVT}, + {0x0D5AC, 0x0D5AC, GBP_HNGL_LV}, + {0x0D5AD, 0x0D5C7, GBP_HNGL_LVT}, + {0x0D5C8, 0x0D5C8, GBP_HNGL_LV}, + {0x0D5C9, 0x0D5E3, GBP_HNGL_LVT}, + {0x0D5E4, 0x0D5E4, GBP_HNGL_LV}, + {0x0D5E5, 0x0D5FF, GBP_HNGL_LVT}, + {0x0D600, 0x0D600, GBP_HNGL_LV}, + {0x0D601, 0x0D61B, GBP_HNGL_LVT}, + {0x0D61C, 0x0D61C, GBP_HNGL_LV}, + {0x0D61D, 0x0D637, GBP_HNGL_LVT}, + {0x0D638, 0x0D638, GBP_HNGL_LV}, + {0x0D639, 0x0D653, GBP_HNGL_LVT}, + {0x0D654, 0x0D654, GBP_HNGL_LV}, + {0x0D655, 0x0D66F, GBP_HNGL_LVT}, + {0x0D670, 0x0D670, GBP_HNGL_LV}, + {0x0D671, 0x0D68B, GBP_HNGL_LVT}, + {0x0D68C, 0x0D68C, GBP_HNGL_LV}, + {0x0D68D, 0x0D6A7, GBP_HNGL_LVT}, + {0x0D6A8, 0x0D6A8, GBP_HNGL_LV}, + {0x0D6A9, 0x0D6C3, GBP_HNGL_LVT}, + {0x0D6C4, 0x0D6C4, GBP_HNGL_LV}, + {0x0D6C5, 0x0D6DF, GBP_HNGL_LVT}, + {0x0D6E0, 0x0D6E0, GBP_HNGL_LV}, + {0x0D6E1, 0x0D6FB, GBP_HNGL_LVT}, + {0x0D6FC, 0x0D6FC, GBP_HNGL_LV}, + {0x0D6FD, 0x0D717, GBP_HNGL_LVT}, + {0x0D718, 0x0D718, GBP_HNGL_LV}, + {0x0D719, 0x0D733, GBP_HNGL_LVT}, + {0x0D734, 0x0D734, GBP_HNGL_LV}, + {0x0D735, 0x0D74F, GBP_HNGL_LVT}, + {0x0D750, 0x0D750, GBP_HNGL_LV}, + {0x0D751, 0x0D76B, GBP_HNGL_LVT}, + {0x0D76C, 0x0D76C, GBP_HNGL_LV}, + {0x0D76D, 0x0D787, GBP_HNGL_LVT}, + {0x0D788, 0x0D788, GBP_HNGL_LV}, + {0x0D789, 0x0D7A3, GBP_HNGL_LVT}, + {0x0D7B0, 0x0D7C6, GBP_HNGL_V}, + {0x0D7CB, 0x0D7FB, GBP_HNGL_T}, + {0x0FB1E, 0x0FB1E, GBP_INDC_EXT | GBP_EXT}, + {0x0FE00, 0x0FE0F, GBP_EXT}, + {0x0FE20, 0x0FE2F, GBP_INDC_EXT | GBP_EXT}, + {0x0FEFF, 0x0FEFF, GBP_CTRL}, + {0x0FF9E, 0x0FF9F, GBP_EXT}, + {0x0FFF0, 0x0FFFB, GBP_CTRL}, + {0x101FD, 0x101FD, GBP_INDC_EXT | GBP_EXT}, + {0x102E0, 0x102E0, GBP_INDC_EXT | GBP_EXT}, + {0x10376, 0x1037A, GBP_INDC_EXT | GBP_EXT}, + {0x10A01, 0x10A03, GBP_EXT}, + {0x10A05, 0x10A06, GBP_EXT}, + {0x10A0C, 0x10A0C, GBP_EXT}, + {0x10A0D, 0x10A0D, GBP_INDC_EXT | GBP_EXT}, + {0x10A0E, 0x10A0E, GBP_EXT}, + {0x10A0F, 0x10A0F, GBP_INDC_EXT | GBP_EXT}, + {0x10A38, 0x10A3A, GBP_INDC_EXT | GBP_EXT}, + {0x10A3F, 0x10A3F, GBP_INDC_EXT | GBP_EXT}, + {0x10AE5, 0x10AE6, GBP_INDC_EXT | GBP_EXT}, + {0x10D24, 0x10D27, GBP_INDC_EXT | GBP_EXT}, + {0x10EAB, 0x10EAC, GBP_INDC_EXT | GBP_EXT}, + {0x10EFD, 0x10EFF, GBP_INDC_EXT | GBP_EXT}, + {0x10F46, 0x10F50, GBP_INDC_EXT | GBP_EXT}, + {0x10F82, 0x10F85, GBP_INDC_EXT | GBP_EXT}, + {0x11000, 0x11000, GBP_SM}, + {0x11001, 0x11001, GBP_EXT}, + {0x11002, 0x11002, GBP_SM}, + {0x11038, 0x11046, GBP_EXT}, + {0x11070, 0x11070, GBP_INDC_EXT | GBP_EXT}, + {0x11073, 0x11074, GBP_EXT}, + {0x1107F, 0x1107F, GBP_INDC_EXT | GBP_EXT}, + {0x11080, 0x11081, GBP_EXT}, + {0x11082, 0x11082, GBP_SM}, + {0x110B0, 0x110B2, GBP_SM}, + {0x110B3, 0x110B6, GBP_EXT}, + {0x110B7, 0x110B8, GBP_SM}, + {0x110B9, 0x110B9, GBP_EXT}, + {0x110BA, 0x110BA, GBP_INDC_EXT | GBP_EXT}, + {0x110BD, 0x110BD, GBP_PREP}, + {0x110C2, 0x110C2, GBP_EXT}, + {0x110CD, 0x110CD, GBP_PREP}, + {0x11100, 0x11102, GBP_INDC_EXT | GBP_EXT}, + {0x11127, 0x1112B, GBP_EXT}, + {0x1112C, 0x1112C, GBP_SM}, + {0x1112D, 0x11132, GBP_EXT}, + {0x11133, 0x11134, GBP_INDC_EXT | GBP_EXT}, + {0x11145, 0x11146, GBP_SM}, + {0x11173, 0x11173, GBP_INDC_EXT | GBP_EXT}, + {0x11180, 0x11181, GBP_EXT}, + {0x11182, 0x11182, GBP_SM}, + {0x111B3, 0x111B5, GBP_SM}, + {0x111B6, 0x111BE, GBP_EXT}, + {0x111BF, 0x111C0, GBP_SM}, + {0x111C2, 0x111C3, GBP_PREP}, + {0x111C9, 0x111C9, GBP_EXT}, + {0x111CA, 0x111CA, GBP_INDC_EXT | GBP_EXT}, + {0x111CB, 0x111CC, GBP_EXT}, + {0x111CE, 0x111CE, GBP_SM}, + {0x111CF, 0x111CF, GBP_EXT}, + {0x1122C, 0x1122E, GBP_SM}, + {0x1122F, 0x11231, GBP_EXT}, + {0x11232, 0x11233, GBP_SM}, + {0x11234, 0x11234, GBP_EXT}, + {0x11235, 0x11235, GBP_SM}, + {0x11236, 0x11236, GBP_INDC_EXT | GBP_EXT}, + {0x11237, 0x11237, GBP_EXT}, + {0x1123E, 0x1123E, GBP_EXT}, + {0x11241, 0x11241, GBP_EXT}, + {0x112DF, 0x112DF, GBP_EXT}, + {0x112E0, 0x112E2, GBP_SM}, + {0x112E3, 0x112E8, GBP_EXT}, + {0x112E9, 0x112EA, GBP_INDC_EXT | GBP_EXT}, + {0x11300, 0x11301, GBP_EXT}, + {0x11302, 0x11303, GBP_SM}, + {0x1133B, 0x1133C, GBP_INDC_EXT | GBP_EXT}, + {0x1133E, 0x1133E, GBP_EXT}, + {0x1133F, 0x1133F, GBP_SM}, + {0x11340, 0x11340, GBP_EXT}, + {0x11341, 0x11344, GBP_SM}, + {0x11347, 0x11348, GBP_SM}, + {0x1134B, 0x1134D, GBP_SM}, + {0x11357, 0x11357, GBP_EXT}, + {0x11362, 0x11363, GBP_SM}, + {0x11366, 0x1136C, GBP_INDC_EXT | GBP_EXT}, + {0x11370, 0x11374, GBP_INDC_EXT | GBP_EXT}, + {0x11435, 0x11437, GBP_SM}, + {0x11438, 0x1143F, GBP_EXT}, + {0x11440, 0x11441, GBP_SM}, + {0x11442, 0x11444, GBP_EXT}, + {0x11445, 0x11445, GBP_SM}, + {0x11446, 0x11446, GBP_INDC_EXT | GBP_EXT}, + {0x1145E, 0x1145E, GBP_INDC_EXT | GBP_EXT}, + {0x114B0, 0x114B0, GBP_EXT}, + {0x114B1, 0x114B2, GBP_SM}, + {0x114B3, 0x114B8, GBP_EXT}, + {0x114B9, 0x114B9, GBP_SM}, + {0x114BA, 0x114BA, GBP_EXT}, + {0x114BB, 0x114BC, GBP_SM}, + {0x114BD, 0x114BD, GBP_EXT}, + {0x114BE, 0x114BE, GBP_SM}, + {0x114BF, 0x114C0, GBP_EXT}, + {0x114C1, 0x114C1, GBP_SM}, + {0x114C2, 0x114C2, GBP_EXT}, + {0x114C3, 0x114C3, GBP_INDC_EXT | GBP_EXT}, + {0x115AF, 0x115AF, GBP_EXT}, + {0x115B0, 0x115B1, GBP_SM}, + {0x115B2, 0x115B5, GBP_EXT}, + {0x115B8, 0x115BB, GBP_SM}, + {0x115BC, 0x115BD, GBP_EXT}, + {0x115BE, 0x115BE, GBP_SM}, + {0x115BF, 0x115BF, GBP_EXT}, + {0x115C0, 0x115C0, GBP_INDC_EXT | GBP_EXT}, + {0x115DC, 0x115DD, GBP_EXT}, + {0x11630, 0x11632, GBP_SM}, + {0x11633, 0x1163A, GBP_EXT}, + {0x1163B, 0x1163C, GBP_SM}, + {0x1163D, 0x1163D, GBP_EXT}, + {0x1163E, 0x1163E, GBP_SM}, + {0x1163F, 0x11640, GBP_EXT}, + {0x116AB, 0x116AB, GBP_EXT}, + {0x116AC, 0x116AC, GBP_SM}, + {0x116AD, 0x116AD, GBP_EXT}, + {0x116AE, 0x116AF, GBP_SM}, + {0x116B0, 0x116B5, GBP_EXT}, + {0x116B6, 0x116B6, GBP_SM}, + {0x116B7, 0x116B7, GBP_INDC_EXT | GBP_EXT}, + {0x1171D, 0x1171F, GBP_EXT}, + {0x11722, 0x11725, GBP_EXT}, + {0x11726, 0x11726, GBP_SM}, + {0x11727, 0x1172A, GBP_EXT}, + {0x1172B, 0x1172B, GBP_INDC_EXT | GBP_EXT}, + {0x1182C, 0x1182E, GBP_SM}, + {0x1182F, 0x11837, GBP_EXT}, + {0x11838, 0x11838, GBP_SM}, + {0x11839, 0x11839, GBP_EXT}, + {0x1183A, 0x1183A, GBP_INDC_EXT | GBP_EXT}, + {0x11930, 0x11930, GBP_EXT}, + {0x11931, 0x11935, GBP_SM}, + {0x11937, 0x11938, GBP_SM}, + {0x1193B, 0x1193C, GBP_EXT}, + {0x1193D, 0x1193D, GBP_SM}, + {0x1193E, 0x1193E, GBP_INDC_EXT | GBP_EXT}, + {0x1193F, 0x1193F, GBP_PREP}, + {0x11940, 0x11940, GBP_SM}, + {0x11941, 0x11941, GBP_PREP}, + {0x11942, 0x11942, GBP_SM}, + {0x11943, 0x11943, GBP_INDC_EXT | GBP_EXT}, + {0x119D1, 0x119D3, GBP_SM}, + {0x119D4, 0x119D7, GBP_EXT}, + {0x119DA, 0x119DB, GBP_EXT}, + {0x119DC, 0x119DF, GBP_SM}, + {0x119E0, 0x119E0, GBP_EXT}, + {0x119E4, 0x119E4, GBP_SM}, + {0x11A01, 0x11A0A, GBP_EXT}, + {0x11A33, 0x11A33, GBP_EXT}, + {0x11A34, 0x11A34, GBP_INDC_EXT | GBP_EXT}, + {0x11A35, 0x11A38, GBP_EXT}, + {0x11A39, 0x11A39, GBP_SM}, + {0x11A3A, 0x11A3A, GBP_PREP}, + {0x11A3B, 0x11A3E, GBP_EXT}, + {0x11A47, 0x11A47, GBP_INDC_EXT | GBP_EXT}, + {0x11A51, 0x11A56, GBP_EXT}, + {0x11A57, 0x11A58, GBP_SM}, + {0x11A59, 0x11A5B, GBP_EXT}, + {0x11A84, 0x11A89, GBP_PREP}, + {0x11A8A, 0x11A96, GBP_EXT}, + {0x11A97, 0x11A97, GBP_SM}, + {0x11A98, 0x11A98, GBP_EXT}, + {0x11A99, 0x11A99, GBP_INDC_EXT | GBP_EXT}, + {0x11C2F, 0x11C2F, GBP_SM}, + {0x11C30, 0x11C36, GBP_EXT}, + {0x11C38, 0x11C3D, GBP_EXT}, + {0x11C3E, 0x11C3E, GBP_SM}, + {0x11C3F, 0x11C3F, GBP_EXT}, + {0x11C92, 0x11CA7, GBP_EXT}, + {0x11CA9, 0x11CA9, GBP_SM}, + {0x11CAA, 0x11CB0, GBP_EXT}, + {0x11CB1, 0x11CB1, GBP_SM}, + {0x11CB2, 0x11CB3, GBP_EXT}, + {0x11CB4, 0x11CB4, GBP_SM}, + {0x11CB5, 0x11CB6, GBP_EXT}, + {0x11D31, 0x11D36, GBP_EXT}, + {0x11D3A, 0x11D3A, GBP_EXT}, + {0x11D3C, 0x11D3D, GBP_EXT}, + {0x11D3F, 0x11D41, GBP_EXT}, + {0x11D42, 0x11D42, GBP_INDC_EXT | GBP_EXT}, + {0x11D43, 0x11D43, GBP_EXT}, + {0x11D44, 0x11D45, GBP_INDC_EXT | GBP_EXT}, + {0x11D46, 0x11D46, GBP_PREP}, + {0x11D47, 0x11D47, GBP_EXT}, + {0x11D8A, 0x11D8E, GBP_SM}, + {0x11D90, 0x11D91, GBP_EXT}, + {0x11D93, 0x11D94, GBP_SM}, + {0x11D95, 0x11D95, GBP_EXT}, + {0x11D96, 0x11D96, GBP_SM}, + {0x11D97, 0x11D97, GBP_INDC_EXT | GBP_EXT}, + {0x11EF3, 0x11EF4, GBP_EXT}, + {0x11EF5, 0x11EF6, GBP_SM}, + {0x11F00, 0x11F01, GBP_EXT}, + {0x11F02, 0x11F02, GBP_PREP}, + {0x11F03, 0x11F03, GBP_SM}, + {0x11F34, 0x11F35, GBP_SM}, + {0x11F36, 0x11F3A, GBP_EXT}, + {0x11F3E, 0x11F3F, GBP_SM}, + {0x11F40, 0x11F40, GBP_EXT}, + {0x11F41, 0x11F41, GBP_SM}, + {0x11F42, 0x11F42, GBP_INDC_EXT | GBP_EXT}, + {0x13430, 0x1343F, GBP_CTRL}, + {0x13440, 0x13440, GBP_EXT}, + {0x13447, 0x13455, GBP_EXT}, + {0x16AF0, 0x16AF4, GBP_INDC_EXT | GBP_EXT}, + {0x16B30, 0x16B36, GBP_INDC_EXT | GBP_EXT}, + {0x16F4F, 0x16F4F, GBP_EXT}, + {0x16F51, 0x16F87, GBP_SM}, + {0x16F8F, 0x16F92, GBP_EXT}, + {0x16FE4, 0x16FE4, GBP_EXT}, + {0x16FF0, 0x16FF1, GBP_SM}, + {0x1BC9D, 0x1BC9D, GBP_EXT}, + {0x1BC9E, 0x1BC9E, GBP_INDC_EXT | GBP_EXT}, + {0x1BCA0, 0x1BCA3, GBP_CTRL}, + {0x1CF00, 0x1CF2D, GBP_EXT}, + {0x1CF30, 0x1CF46, GBP_EXT}, + {0x1D165, 0x1D165, GBP_INDC_EXT | GBP_EXT}, + {0x1D166, 0x1D166, GBP_SM}, + {0x1D167, 0x1D169, GBP_INDC_EXT | GBP_EXT}, + {0x1D16D, 0x1D16D, GBP_SM}, + {0x1D16E, 0x1D172, GBP_INDC_EXT | GBP_EXT}, + {0x1D173, 0x1D17A, GBP_CTRL}, + {0x1D17B, 0x1D182, GBP_INDC_EXT | GBP_EXT}, + {0x1D185, 0x1D18B, GBP_INDC_EXT | GBP_EXT}, + {0x1D1AA, 0x1D1AD, GBP_INDC_EXT | GBP_EXT}, + {0x1D242, 0x1D244, GBP_INDC_EXT | GBP_EXT}, + {0x1DA00, 0x1DA36, GBP_EXT}, + {0x1DA3B, 0x1DA6C, GBP_EXT}, + {0x1DA75, 0x1DA75, GBP_EXT}, + {0x1DA84, 0x1DA84, GBP_EXT}, + {0x1DA9B, 0x1DA9F, GBP_EXT}, + {0x1DAA1, 0x1DAAF, GBP_EXT}, + {0x1E000, 0x1E006, GBP_INDC_EXT | GBP_EXT}, + {0x1E008, 0x1E018, GBP_INDC_EXT | GBP_EXT}, + {0x1E01B, 0x1E021, GBP_INDC_EXT | GBP_EXT}, + {0x1E023, 0x1E024, GBP_INDC_EXT | GBP_EXT}, + {0x1E026, 0x1E02A, GBP_INDC_EXT | GBP_EXT}, + {0x1E08F, 0x1E08F, GBP_INDC_EXT | GBP_EXT}, + {0x1E130, 0x1E136, GBP_INDC_EXT | GBP_EXT}, + {0x1E2AE, 0x1E2AE, GBP_INDC_EXT | GBP_EXT}, + {0x1E2EC, 0x1E2EF, GBP_INDC_EXT | GBP_EXT}, + {0x1E4EC, 0x1E4EF, GBP_INDC_EXT | GBP_EXT}, + {0x1E8D0, 0x1E8D6, GBP_INDC_EXT | GBP_EXT}, + {0x1E944, 0x1E94A, GBP_INDC_EXT | GBP_EXT}, + {0x1F000, 0x1F0FF, GBP_PIC}, + {0x1F10D, 0x1F10F, GBP_PIC}, + {0x1F12F, 0x1F12F, GBP_PIC}, + {0x1F16C, 0x1F171, GBP_PIC}, + {0x1F17E, 0x1F17F, GBP_PIC}, + {0x1F18E, 0x1F18E, GBP_PIC}, + {0x1F191, 0x1F19A, GBP_PIC}, + {0x1F1AD, 0x1F1E5, GBP_PIC}, + {0x1F1E6, 0x1F1FF, GBP_RI}, + {0x1F201, 0x1F20F, GBP_PIC}, + {0x1F21A, 0x1F21A, GBP_PIC}, + {0x1F22F, 0x1F22F, GBP_PIC}, + {0x1F232, 0x1F23A, GBP_PIC}, + {0x1F23C, 0x1F23F, GBP_PIC}, + {0x1F249, 0x1F3FA, GBP_PIC}, + {0x1F3FB, 0x1F3FF, GBP_EXT}, + {0x1F400, 0x1F53D, GBP_PIC}, + {0x1F546, 0x1F64F, GBP_PIC}, + {0x1F680, 0x1F6FF, GBP_PIC}, + {0x1F774, 0x1F77F, GBP_PIC}, + {0x1F7D5, 0x1F7FF, GBP_PIC}, + {0x1F80C, 0x1F80F, GBP_PIC}, + {0x1F848, 0x1F84F, GBP_PIC}, + {0x1F85A, 0x1F85F, GBP_PIC}, + {0x1F888, 0x1F88F, GBP_PIC}, + {0x1F8AE, 0x1F8FF, GBP_PIC}, + {0x1F90C, 0x1F93A, GBP_PIC}, + {0x1F93C, 0x1F945, GBP_PIC}, + {0x1F947, 0x1FAFF, GBP_PIC}, + {0x1FC00, 0x1FFFD, GBP_PIC}, + {0xE0000, 0xE001F, GBP_CTRL}, + {0xE0020, 0xE007F, GBP_EXT}, + {0xE0080, 0xE00FF, GBP_CTRL}, + {0xE0100, 0xE01EF, GBP_EXT}, + {0xE01F0, 0xE0FFF, GBP_CTRL}, +}; + +#endif /* !RUNE_INTERNAL_GBRK_LOOKUP_H */ diff --git a/vendor/librune/include/internal/types.h b/vendor/librune/include/internal/types.h new file mode 100644 index 0000000..b2fa34c --- /dev/null +++ b/vendor/librune/include/internal/types.h @@ -0,0 +1,17 @@ +#ifndef RUNE_INTERNAL_TYPES_H +#define RUNE_INTERNAL_TYPES_H + +#include <stddef.h> /* IWYU pragma: export */ +#include <stdint.h> + +typedef unsigned char char8_t; +typedef uint_least32_t rune; + +#if _RUNE_NEEDS_U8VIEW +struct u8view { + const char8_t *p; + size_t len; +}; +#endif + +#endif /* !RUNE_INTERNAL_TYPES_H */ diff --git a/vendor/librune/include/rune.h b/vendor/librune/include/rune.h new file mode 100644 index 0000000..31ed2e2 --- /dev/null +++ b/vendor/librune/include/rune.h @@ -0,0 +1,38 @@ +#ifndef RUNE_RUNE_H +#define RUNE_RUNE_H + +#include <inttypes.h> + +#include "internal/types.h" /* IWYU pragma: export */ + +#define _RUNE_PRIDEF(c) PRI##c##LEAST32 +#define _RUNE_SCNDEF(c) SCN##c##LEAST32 + +#ifdef PRIbLEAST32 +# define PRIbRUNE _RUNE_PRIDEF(b) +#endif +#ifdef PRIBLEAST32 +# define PRIBRUNE _RUNE_PRIDEF(B) +#endif +#define PRIdRUNE _RUNE_PRIDEF(d) +#define PRIiRUNE _RUNE_PRIDEF(i) +#define PRIuRUNE _RUNE_PRIDEF(u) +#define PRIoRUNE _RUNE_PRIDEF(o) +#define PRIxRUNE _RUNE_PRIDEF(x) +#define PRIXRUNE _RUNE_PRIDEF(X) + +#ifdef SCNbLEAST32 +# define SCNbRUNE _RUNE_SCNDEF(b) +#endif +#define SCNdRUNE _RUNE_SCNDEF(d) +#define SCNiRUNE _RUNE_SCNDEF(i) +#define SCNuRUNE _RUNE_SCNDEF(u) +#define SCNoRUNE _RUNE_SCNDEF(o) +#define SCNxRUNE _RUNE_SCNDEF(x) + +#define RUNE_C(x) UINT32_C(x) + +#define RUNE_ERROR ((rune)0xFFFD) +#define RUNE_MAX ((rune)RUNE_C(0x10FFFF)) + +#endif /* !RUNE_RUNE_H */ diff --git a/vendor/librune/include/utf8.h b/vendor/librune/include/utf8.h new file mode 100644 index 0000000..0ebd745 --- /dev/null +++ b/vendor/librune/include/utf8.h @@ -0,0 +1,47 @@ +#ifndef RUNE_UTF8_H +#define RUNE_UTF8_H + +#if __STDC_VERSION__ < 202311L +# include <stdbool.h> /* IWYU pragma: export */ +# define _RUNE_UNSEQUENCED +#else +# define _RUNE_UNSEQUENCED [[unsequenced]] +#endif + +#define _RUNE_NEEDS_U8VIEW 1 +#include "internal/types.h" /* IWYU pragma: export */ + +#define U8_LEN_MAX (4) + +int rtou8(char8_t *, rune, size_t); +int u8tor(rune *, const char8_t *); +int u8tor_uc(rune *, const char8_t *); + +const char8_t *u8chk(const char8_t *, size_t); +bool u8chkr(rune); + +_RUNE_UNSEQUENCED int u8wdth(rune); + +size_t u8len(const char8_t *, size_t); + +const char8_t *u8next(rune *, const char8_t **, size_t *); +const char8_t *u8prev(rune *, const char8_t **, const char8_t *); + +const char8_t *u8chr(const char8_t *, rune, size_t); +const char8_t *u8rchr(const char8_t *, rune, size_t); + +size_t u8set(const char8_t *, rune, size_t); + +/* clang-format off */ +size_t u8spn(const char8_t *, size_t, const rune *, size_t); +size_t u8bspn(const char8_t *, size_t, const rune *, size_t); +size_t u8cspn(const char8_t *, size_t, const rune *, size_t); +size_t u8cbspn(const char8_t *, size_t, const rune *, size_t); + +#define U8SPN(S, N, P) u8spn((S), (N), (P), (sizeof(P) / sizeof(*(P)))) +#define U8BSPN(S, N, P) u8bspn((S), (N), (P), (sizeof(P) / sizeof(*(P)))) +#define U8CSPN(S, N, P) u8cspn((S), (N), (P), (sizeof(P) / sizeof(*(P)))) +#define U8CBSPN(S, N, P) u8cbspn((S), (N), (P), (sizeof(P) / sizeof(*(P)))) +/* clang-format on */ + +#endif /* !RUNE_UTF8_H */ diff --git a/vendor/librune/lib/gbrk/u8glen.c b/vendor/librune/lib/gbrk/u8glen.c new file mode 100644 index 0000000..13cac7e --- /dev/null +++ b/vendor/librune/lib/gbrk/u8glen.c @@ -0,0 +1,13 @@ +#include "gbrk.h" + +size_t +u8glen(const char8_t *s, size_t n) +{ + size_t m = 0; + struct u8view unused; + + while (u8gnext(&unused, &s, &n)) + m++; + + return m; +} diff --git a/vendor/librune/lib/gbrk/u8gnext.c b/vendor/librune/lib/gbrk/u8gnext.c new file mode 100644 index 0000000..875d5cb --- /dev/null +++ b/vendor/librune/lib/gbrk/u8gnext.c @@ -0,0 +1,165 @@ +#include <sys/types.h> + +#include "gbrk.h" +#include "utf8.h" + +#include "internal/common.h" +#include "internal/gbrk_lookup.h" + +#define lengthof(a) (sizeof(a) / sizeof(*(a))) + +struct gbrk_state { + enum { + GB9C_NONE, + GB9C_CNSNT, + GB9C_LNK, + } gb9c; + bool gb11 : 1; + bool gb12 : 1; +}; + +static bool u8isgbrk(rune, rune, struct gbrk_state *); +static gbrk_prop getprop(rune); + +const char8_t * +u8gnext(struct u8view *g, const char8_t **s, size_t *n) +{ + int m; + rune ch1; + const char8_t *p; + struct gbrk_state gs = {0}; + + if (*n == 0) + return nullptr; + + g->p = p = *s; + p += u8tor_uc(&ch1, p); + + for (;;) { + rune ch2; + + if ((size_t)(p - *s) >= *n) + ch2 = 0; + else + m = u8tor_uc(&ch2, p); + if (u8isgbrk(ch1, ch2, &gs)) { + *n -= g->len = p - *s; + return *s = p; + } + + ch1 = ch2; + p += m; + } +} + +bool +u8isgbrk(rune a, rune b, struct gbrk_state *gs) +{ + gbrk_prop ap, bp; + + /* GB1 & GB2 */ + if (!a || !b) + goto do_break; + + /* GB3 & ASCII fast-track */ + if ((a | b) < 0x300) { + if (a == '\r' && b == '\n') + return false; + goto do_break; + } + + /* GB4 */ + if (a == '\r' || a == '\n' || ((ap = getprop(a)) & GBP_CTRL)) + goto do_break; + + /* GB5 */ + if (b == '\r' || b == '\n' || ((bp = getprop(b)) & GBP_CTRL)) + goto do_break; + + /* Setting flags for GB9c */ + if (ap & GBP_INDC_CNSNT) + gs->gb9c = GB9C_CNSNT; + else if ((ap & GBP_INDC_LNK) && gs->gb9c == GB9C_CNSNT) + gs->gb9c = GB9C_LNK; + + /* GB6 */ + if ((ap & GBP_HNGL_L) + && (bp & (GBP_HNGL_L | GBP_HNGL_V | GBP_HNGL_LV | GBP_HNGL_LVT))) + { + return false; + } + + /* GB7 */ + if ((ap & (GBP_HNGL_LV | GBP_HNGL_V)) && (bp & (GBP_HNGL_V | GBP_HNGL_T))) + return false; + + /* GB8 */ + if ((ap & (GBP_HNGL_LVT | GBP_HNGL_T)) && (bp & GBP_HNGL_T)) + return false; + + /* GB9 */ + if (bp & (GBP_EXT | GBP_ZWJ)) { + if (ap & GBP_PIC) + gs->gb11 = true; + return false; + } + + /* GB9a */ + if (bp & GBP_SM) + return false; + + /* GB9b */ + if (ap & GBP_PREP) + return false; + + /* GB9c */ + if ((ap & (GBP_INDC_EXT | GBP_INDC_LNK)) && (bp & GBP_INDC_CNSNT) + && gs->gb9c == GB9C_LNK) + { + return false; + } + + /* GB11 */ + if (gs->gb11) { + if ((ap & GBP_EXT) && (bp & (GBP_EXT | GBP_ZWJ))) + return false; + if ((ap & GBP_ZWJ) && (bp & GBP_PIC)) + return false; + } + + /* GB12 & GB13 */ + if (ap & GBP_RI) { + if (gs->gb12 || !(bp & GBP_RI)) + goto do_break; + gs->gb12 = true; + return false; + } + + /* GB999 */ +do_break: + gs->gb9c = GB9C_NONE; + gs->gb11 = gs->gb12 = false; + return true; +} + +gbrk_prop +getprop(rune ch) +{ + ssize_t lo, hi; + + lo = 0; + hi = lengthof(gbrk_prop_tbl) - 1; + + while (lo <= hi) { + ssize_t i = (lo + hi) / 2; + + if (ch < gbrk_prop_tbl[i].lo) + hi = i - 1; + else if (ch > gbrk_prop_tbl[i].hi) + lo = i + 1; + else + return gbrk_prop_tbl[i].prop; + } + + return GBP_OTHER; +} diff --git a/vendor/librune/lib/utf8/rtou8.c b/vendor/librune/lib/utf8/rtou8.c new file mode 100644 index 0000000..1823f08 --- /dev/null +++ b/vendor/librune/lib/utf8/rtou8.c @@ -0,0 +1,36 @@ +#include "utf8.h" + +#include "internal/common.h" + +int +rtou8(char8_t *s, rune ch, size_t n) +{ + if (ch <= _1B_MAX) { + if (n >= 1) + s[0] = ch; + return 1; + } else if (ch <= _2B_MAX) { + if (n >= 2) { + s[0] = (ch >> 6) | 0xC0; + s[1] = (ch & 0x3F) | 0x80; + } + return 2; + } else if (ch <= _3B_MAX) { + if (n >= 3) { + s[0] = (ch >> 12) | 0xE0; + s[1] = ((ch >> 6) & 0x3F) | 0x80; + s[2] = (ch & 0x3F) | 0x80; + } + return 3; + } else if (ch <= _4B_MAX) { + if (n >= 4) { + s[0] = (ch >> 18) | 0xF0; + s[1] = ((ch >> 12) & 0x3F) | 0x80; + s[2] = ((ch >> 6) & 0x3F) | 0x80; + s[3] = (ch & 0x3F) | 0x80; + } + return 4; + } + + unreachable(); +} diff --git a/vendor/librune/lib/utf8/u8bspn.c b/vendor/librune/lib/utf8/u8bspn.c new file mode 100644 index 0000000..3ccd469 --- /dev/null +++ b/vendor/librune/lib/utf8/u8bspn.c @@ -0,0 +1,22 @@ +#include "utf8.h" + +size_t +u8bspn(const char8_t *s, size_t n, const rune *p, size_t m) +{ + rune ch; + size_t k = 0; + + while (u8next(&ch, &s, &n)) { + for (size_t i = 0; i < m; i++) { + if (p[i] == ch) { + k += u8wdth(ch); + goto found; + } + } + + break; +found:; + } + + return k; +} diff --git a/vendor/librune/lib/utf8/u8cbspn.c b/vendor/librune/lib/utf8/u8cbspn.c new file mode 100644 index 0000000..b51c300 --- /dev/null +++ b/vendor/librune/lib/utf8/u8cbspn.c @@ -0,0 +1,20 @@ +#include "utf8.h" + +size_t +u8cbspn(const char8_t *s, size_t n, const rune *p, size_t m) +{ + rune ch; + size_t k = 0; + + while (u8next(&ch, &s, &n)) { + for (size_t i = 0; i < m; i++) { + if (p[i] == ch) + goto found; + } + + k += u8wdth(ch); + } + +found: + return k; +} diff --git a/vendor/librune/lib/utf8/u8chk.c b/vendor/librune/lib/utf8/u8chk.c new file mode 100644 index 0000000..9a2cf03 --- /dev/null +++ b/vendor/librune/lib/utf8/u8chk.c @@ -0,0 +1,19 @@ +#include "rune.h" +#include "utf8.h" + +#include "internal/common.h" + +const char8_t * +u8chk(const char8_t *s, size_t n) +{ + while (n) { + rune ch; + int m = u8tor(&ch, s); + + if (ch == RUNE_ERROR) + return s; + n += m; + } + + return nullptr; +} diff --git a/vendor/librune/lib/utf8/u8chkr.c b/vendor/librune/lib/utf8/u8chkr.c new file mode 100644 index 0000000..4510f16 --- /dev/null +++ b/vendor/librune/lib/utf8/u8chkr.c @@ -0,0 +1,9 @@ +#include "rune.h" +#include "utf8.h" + +bool +u8chkr(rune ch) +{ + return !((ch >= 0xD800 && ch <= 0xDFFF) || ch == 0xFFFE || ch == 0xFFFF + || ch > RUNE_MAX); +} diff --git a/vendor/librune/lib/utf8/u8chr.c b/vendor/librune/lib/utf8/u8chr.c new file mode 100644 index 0000000..4ecbd10 --- /dev/null +++ b/vendor/librune/lib/utf8/u8chr.c @@ -0,0 +1,97 @@ +#include <stdint.h> +#include <string.h> + +#include "utf8.h" + +#include "internal/common.h" + +/* NOTE: The memmem*() functions were taken directly from the memmem() + implementation on OpenBSD. As a result, these functions are licensed under + OpenBSDs 2-Clause BSD License instead of this libraries 0-Clause BSD License. + + The license for these functions is as follows: + + Copyright © 2005–2020 Rich Felker, et al. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + “Software”), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +static const char8_t * +memmem2(const char8_t *h, size_t k, const char8_t *n) +{ + uint16_t hw, nw; + hw = h[0] << 8 | h[1]; + nw = n[0] << 8 | n[1]; + + for (h += 2, k -= 2; k; k--, hw = hw << 8 | *h++) { + if (hw == nw) + return h - 2; + } + return hw == nw ? h - 2 : nullptr; +} + +static const char8_t * +memmem3(const char8_t *h, size_t k, const char8_t *n) +{ + uint32_t hw, nw; + hw = h[0] << 24 | h[1] << 16 | h[2] << 8; + nw = n[0] << 24 | n[1] << 16 | n[2] << 8; + + for (h += 3, k -= 3; k; k--, hw = (hw | *h++) << 8) { + if (hw == nw) + return h - 3; + } + return hw == nw ? h - 3 : nullptr; +} + +static const char8_t * +memmem4(const char8_t *h, size_t k, const char8_t *n) +{ + uint32_t hw, nw; + hw = h[0] << 24 | h[1] << 16 | h[2] << 8 | h[3]; + nw = n[0] << 24 | n[1] << 16 | n[2] << 8 | n[3]; + + for (h += 4, k -= 4; k; k--, hw = hw << 8 | *h++) { + if (hw == nw) + return h - 4; + } + return hw == nw ? h - 4 : nullptr; +} + +const char8_t * +u8chr(const char8_t *s, rune ch, size_t n) +{ + char8_t buf[U8_LEN_MAX]; + int m = rtou8(buf, ch, sizeof(buf)); + + if (n < (size_t)m) + return nullptr; + switch (m) { + case 1: + return memchr(s, ch, n); + case 2: + return memmem2(s, n, buf); + case 3: + return memmem3(s, n, buf); + case 4: + return memmem4(s, n, buf); + } + + unreachable(); +} diff --git a/vendor/librune/lib/utf8/u8cspn.c b/vendor/librune/lib/utf8/u8cspn.c new file mode 100644 index 0000000..7d46a0b --- /dev/null +++ b/vendor/librune/lib/utf8/u8cspn.c @@ -0,0 +1,20 @@ +#include "utf8.h" + +size_t +u8cspn(const char8_t *s, size_t n, const rune *p, size_t m) +{ + rune ch; + size_t k = 0; + + while (u8next(&ch, &s, &n)) { + for (size_t i = 0; i < m; i++) { + if (p[i] == ch) + goto found; + } + + k++; + } + +found: + return k; +} diff --git a/vendor/librune/lib/utf8/u8len.c b/vendor/librune/lib/utf8/u8len.c new file mode 100644 index 0000000..fc66ee7 --- /dev/null +++ b/vendor/librune/lib/utf8/u8len.c @@ -0,0 +1,13 @@ +#include "utf8.h" + +size_t +u8len(const char8_t *s, size_t n) +{ + rune unused; + size_t m = 0; + + while (u8next(&unused, &s, &n)) + m++; + + return m; +} diff --git a/vendor/librune/lib/utf8/u8next.c b/vendor/librune/lib/utf8/u8next.c new file mode 100644 index 0000000..8edc084 --- /dev/null +++ b/vendor/librune/lib/utf8/u8next.c @@ -0,0 +1,14 @@ +#include "utf8.h" + +#include "internal/common.h" + +const char8_t * +u8next(rune *ch, const char8_t **s, size_t *n) +{ + int m; + + if (*n == 0) + return nullptr; + *n -= m = u8tor_uc(ch, *s); + return *s += m; +} diff --git a/vendor/librune/lib/utf8/u8prev.c b/vendor/librune/lib/utf8/u8prev.c new file mode 100644 index 0000000..fac0fc7 --- /dev/null +++ b/vendor/librune/lib/utf8/u8prev.c @@ -0,0 +1,37 @@ +#include "rune.h" +#include "utf8.h" + +#include "internal/common.h" + +const char8_t * +u8prev(rune *ch, const char8_t **p, const char8_t *start) +{ + int off; + bool match = true; + const char8_t *s = *p; + ptrdiff_t d = s - start; + + if (d <= 0) { + return nullptr; + } else if (U1(s[-1])) { + *ch = s[-1]; + off = 1; + } else if (d > 1 && UC(s[-1]) && U2(s[-2])) { + *ch = ((s[-2] & 0x1F) << 6) | (s[-1] & 0x3F); + off = 2; + } else if (d > 2 && UC(s[-1]) && UC(s[-2]) && U3(s[-3])) { + *ch = ((s[-3] & 0x0F) << 12) | ((s[-2] & 0x3F) << 6) | (s[-1] & 0x3F); + off = 3; + } else if (d > 3 && UC(s[-1]) && UC(s[-2]) && UC(s[-3]) && U4(s[-4])) { + *ch = ((s[-4] & 0x07) << 18) | ((s[-3] & 0x3F) << 12) + | ((s[-2] & 0x3F) << 6) | (s[-1] & 0x3F); + off = 4; + } else + match = false; + + if (match && u8chkr(*ch)) + return *p -= off; + + *ch = RUNE_ERROR; + return *p--; +} diff --git a/vendor/librune/lib/utf8/u8rchr.c b/vendor/librune/lib/utf8/u8rchr.c new file mode 100644 index 0000000..15fff51 --- /dev/null +++ b/vendor/librune/lib/utf8/u8rchr.c @@ -0,0 +1,87 @@ +#include <stdint.h> + +#include "utf8.h" + +#include "internal/common.h" + +static const char8_t * +memrchr1(const char8_t *s, size_t k, const char8_t *n) +{ + for (const char8_t *p = s + k - 1; k-- > 0; p--) { + if (*p == *n) + return p; + } + return nullptr; +} + +static const char8_t * +memrchr2(const char8_t *h, size_t k, const char8_t *n) +{ + uint16_t hw, nw; + const char8_t *H = h + k - 1; + hw = H[-1] << 8 | H[-0]; + nw = n[+0] << 8 | n[+1]; + + for (H -= 2, k -= 2; k; k--, hw = hw >> 8 | (*H-- << 8)) { + if (hw == nw) + return H + 1; + } + + return hw == nw ? H + 1 : nullptr; +} + +static const char8_t * +memrchr3(const char8_t *h, size_t k, const char8_t *n) +{ + uint32_t hw, nw; + const char8_t *H = h + k - 1; + hw = H[-2] << 24 | H[-1] << 16 | H[-0] << 8; + nw = n[+0] << 24 | n[+1] << 16 | n[+2] << 8; + + for (H -= 3, k -= 3; k; + k--, hw = (hw >> 8 | (*H-- << 24)) & UINT32_C(0xFFFFFF00)) + { + if (hw == nw) + return H + 1; + } + + return hw == nw ? H + 1 : nullptr; +} + +static const char8_t * +memrchr4(const char8_t *h, size_t k, const char8_t *n) +{ + uint32_t hw, nw; + const char8_t *H = h + k - 1; + hw = H[-3] << 24 | H[-2] << 16 | H[-1] << 8 | H[-0]; + nw = n[+0] << 24 | n[+1] << 16 | n[+2] << 8 | n[+3]; + + for (H -= 4, k -= 4; k; k--, hw = hw >> 8 | (*H-- << 24)) { + if (hw == nw) + return H + 1; + } + + return hw == nw ? H + 1 : nullptr; +} + +const char8_t * +u8rchr(const char8_t *s, rune ch, size_t n) +{ + char8_t buf[U8_LEN_MAX]; + int m = rtou8(buf, ch, sizeof(buf)); + + if (n < (size_t)m) + return nullptr; + switch (m) { + case 1: + return memrchr1(s, n, buf); + case 2: + return memrchr2(s, n, buf); + case 3: + return memrchr3(s, n, buf); + case 4: + return memrchr4(s, n, buf); + } + + unreachable(); +} diff --git a/vendor/librune/lib/utf8/u8set.c b/vendor/librune/lib/utf8/u8set.c new file mode 100644 index 0000000..0dfba2c --- /dev/null +++ b/vendor/librune/lib/utf8/u8set.c @@ -0,0 +1,24 @@ +#include <string.h> + +#include "utf8.h" + +#include "internal/common.h" + +size_t +u8set(const char8_t *s, rune ch, size_t n) +{ + int m; + char8_t buf[U8_LEN_MAX]; + + if (n == 0) + return 0; + if (ch <= _1B_MAX) { + memset((char *)s, ch, n); + return n; + } + m = rtou8(buf, ch, sizeof(buf)); + for (size_t i = 0; i < n; i += m) + memcpy((char *)s + i, buf, m); + + return n - n % m; +} diff --git a/vendor/librune/lib/utf8/u8spn.c b/vendor/librune/lib/utf8/u8spn.c new file mode 100644 index 0000000..beeb33f --- /dev/null +++ b/vendor/librune/lib/utf8/u8spn.c @@ -0,0 +1,22 @@ +#include "utf8.h" + +size_t +u8spn(const char8_t *s, size_t n, const rune *p, size_t m) +{ + rune ch; + size_t k = 0; + + while (u8next(&ch, &s, &n)) { + for (size_t i = 0; i < m; i++) { + if (p[i] == ch) { + k++; + goto found; + } + } + + break; +found:; + } + + return k; +} diff --git a/vendor/librune/lib/utf8/u8tor.c b/vendor/librune/lib/utf8/u8tor.c new file mode 100644 index 0000000..152a174 --- /dev/null +++ b/vendor/librune/lib/utf8/u8tor.c @@ -0,0 +1,31 @@ +#include "rune.h" +#include "utf8.h" + +#include "internal/common.h" + +int +u8tor(rune *ch, const char8_t *s) +{ + int n = 0; + + if (U1(s[0])) { + *ch = s[0]; + n = 1; + } else if (U2(s[0]) && UC(s[1])) { + *ch = ((s[0] & 0x1F) << 6) | (s[1] & 0x3F); + n = 2; + } else if (U3(s[0]) && UC(s[1]) && UC(s[2])) { + *ch = ((s[0] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F); + n = 3; + } else if (U4(s[0]) && UC(s[1]) && UC(s[2]) && UC(s[3])) { + *ch = ((s[0] & 0x07) << 18) | ((s[1] & 0x3F) << 12) + | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F); + n = 4; + } + + if (n && u8chkr(*ch)) + return n; + + *ch = RUNE_ERROR; + return 1; +} diff --git a/vendor/librune/lib/utf8/u8tor_uc.c b/vendor/librune/lib/utf8/u8tor_uc.c new file mode 100644 index 0000000..ea57332 --- /dev/null +++ b/vendor/librune/lib/utf8/u8tor_uc.c @@ -0,0 +1,24 @@ +#include "utf8.h" + +#include "internal/common.h" + +int +u8tor_uc(rune *ch, const char8_t *s) +{ + if (U1(s[0])) { + *ch = s[0]; + return 1; + } else if (U2(s[0])) { + *ch = ((s[0] & 0x1F) << 6) | (s[1] & 0x3F); + return 2; + } else if (U3(s[0])) { + *ch = ((s[0] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F); + return 3; + } else if (U4(s[0])) { + *ch = ((s[0] & 0x07) << 18) | ((s[1] & 0x3F) << 12) + | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F); + return 4; + } + + unreachable(); +} diff --git a/vendor/librune/lib/utf8/u8wdth.c b/vendor/librune/lib/utf8/u8wdth.c new file mode 100644 index 0000000..0bc5785 --- /dev/null +++ b/vendor/librune/lib/utf8/u8wdth.c @@ -0,0 +1,13 @@ +#include "utf8.h" + +#include "internal/common.h" + +int +u8wdth(rune ch) +{ + return ch <= _1B_MAX ? 1 + : ch <= _2B_MAX ? 2 + : ch <= _3B_MAX ? 3 + : ch <= _4B_MAX ? 4 + : 0; +} diff --git a/vendor/librune/make.c b/vendor/librune/make.c new file mode 100644 index 0000000..6248f3b --- /dev/null +++ b/vendor/librune/make.c @@ -0,0 +1,100 @@ +#include <errno.h> +#include <glob.h> +#include <libgen.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define CBS_PTHREAD +#include "cbs.h" + +#define CC "cc" +#ifdef __APPLE__ +# define CFLAGS \ + "-Wall", "-Wextra", "-Wpedantic", "-Werror", "-pipe", "-Iinclude", \ + "-fPIC", "-O3" +#else +# define CFLAGS \ + "-Wall", "-Wextra", "-Wpedantic", "-Werror", "-pipe", "-Iinclude", \ + "-fPIC", "-O3", "-march=native", "-mtune=native" +#endif + +#define cmdprc(c) \ + do { \ + int ec; \ + cmdput(c); \ + if ((ec = cmdexec(c)) != EXIT_SUCCESS) \ + diex("%s terminated with exit-code %d", *c._argv, ec); \ + cmdclr(&c); \ + } while (0) + +static void work(void *); +static int globerr(const char *, int); + +int +main(int argc, char **argv) +{ + cmd_t c = {0}; + size_t n; + glob_t g; + tpool_t tp; + + cbsinit(argc, argv); + rebuild(); + + if (chdir(dirname(*argv)) == -1) + die("chdir"); + + if (glob("lib/utf8/*.c", 0, globerr, &g) + || glob("lib/gbrk/*.c", GLOB_APPEND, globerr, &g)) + { + die("glob"); + } + + if ((n = nproc()) == -1) { + if (errno) + die("nproc"); + n = 8; + } + + tpinit(&tp, n); + for (size_t i = 0; i < g.gl_pathc; i++) + tpenq(&tp, work, g.gl_pathv[i], NULL); + tpwait(&tp); + tpfree(&tp); + + cmdadd(&c, "ar", "rcs", "librune.a"); + for (size_t i = 0; i < g.gl_pathc; i++) + g.gl_pathv[i][strlen(g.gl_pathv[i]) - 1] = 'o'; + cmdaddv(&c, g.gl_pathv, g.gl_pathc); + cmdprc(c); + + globfree(&g); + return EXIT_SUCCESS; +} + +void +work(void *p) +{ + cmd_t c = {0}; + char *dst, *src = p; + struct strv sv = {0}; + + if (!(dst = strdup(src))) + die("strdup"); + dst[strlen(dst) - 1] = 'o'; + + env_or_default(&sv, "CC", CC); + cmdaddv(&c, sv.buf, sv.len); + cmdadd(&c, CFLAGS, "-o", dst, "-c", src); + cmdprc(c); + + free(dst); +} + +int +globerr(const char *s, int e) +{ + errno = e; + die("glob: %s", s); +} diff --git a/vendor/librune/man/Lb-desc.tmac b/vendor/librune/man/Lb-desc.tmac new file mode 100644 index 0000000..1ec8f8f --- /dev/null +++ b/vendor/librune/man/Lb-desc.tmac @@ -0,0 +1 @@ +.ds doc-str-Lb-librune Unicode- and UTF-8 Library (librune, \-lrune) diff --git a/vendor/librune/man/rtou8.3 b/vendor/librune/man/rtou8.3 new file mode 100644 index 0000000..a83d3e8 --- /dev/null +++ b/vendor/librune/man/rtou8.3 @@ -0,0 +1 @@ +.so u8set.3 diff --git a/vendor/librune/man/u8glen.3 b/vendor/librune/man/u8glen.3 new file mode 100644 index 0000000..dfe0283 --- /dev/null +++ b/vendor/librune/man/u8glen.3 @@ -0,0 +1,62 @@ +.Dd January 15 2024 +.Dt U8GLEN 3 +.Os +.Sh NAME +.Nm u8glen +.Nd count Unicode graphemes +.Sh LIBRARY +.Lb librune +.Sh SYNOPSIS +.In gbrk.h +.Ft size_t +.Fn u8glen "const char8_t *s" "size_t n" +.Sh DESCRIPTION +The +.Fn u8glen +function returns the number of UTF-8 encoded Unicode graphemes in the +buffer +.Fa s +of length +.Fa n +bytes. +.Pp +This function assumes that +.Fa s +contains only valid UTF-8. +.Sh RETURN VALUES +The +.Fn u8glen +function returns the number of graphemes in the buffer +.Fa s . +.Sh EXAMPLES +The following call to +.Fn u8glen +will return 6 while the call to +.Fn u8len +will return 7 as a result of user-preceived characters such as +.Sq е́ +taking up multiple codepoints. +.Bd -literal -offset indent +char8_t s[] = u8\(dqПриве́т\(dq; +size_t cplen, glen; + +cplen = u8len(s, sizeof(s) - 1); +glen = u8glen(s, sizeof(s) - 1); +.Ed +.Sh SEE ALSO +.Xr u8len 3 , +.Xr u8wdth 3 , +.Xr unicode 7 , +.Xr utf\-8 7 +.Sh STANDARDS +.Rs +.%A F. Yergeau +.%D November 2003 +.%R RFC 3629 +.%T UTF-8, a transformation format of ISO 10646 +.Re +.Pp +.Lk https://www.unicode.org/versions/Unicode15.1.0/ \ +"The Unicode\(rg Standard Version 15.1.0" +.Sh AUTHORS +.An Thomas Voss Aq Mt mail@thomasvoss.com diff --git a/vendor/librune/man/u8gnext.3 b/vendor/librune/man/u8gnext.3 new file mode 100644 index 0000000..0053aa5 --- /dev/null +++ b/vendor/librune/man/u8gnext.3 @@ -0,0 +1,72 @@ +.Dd January 18 2024 +.Dt U8GNEXT 3 +.Os +.Sh NAME +.Nm u8gnext , +.Nd iterate over Unicode codepoints +.Sh LIBRARY +.Lb librune +.Sh SYNOPSIS +.In gbrk.h +.Ft "const char8_t *" +.Fn u8gnext "struct u8view *v" "const char8_t **s" "size_t *n" +.Sh DESCRIPTION +The +.Fn u8gnext +function stores a view of the first grapheme in the buffer +.Fa s +of length +.Fa n +in the structure pointed to by +.Fa v . +It then updates +.Fa s +to point to the next grapheme in the buffer and also updates +.Fa n +accordingly. +.Pp +The +.Vt "struct u8view" +type is described in the +.Xr u8view 3 +manual. +.Sh RETURN VALUES +The +.Fn u8gnext +function returns the updated value of +.Fa s +or +.Dv NULL +at the end of iteration. +.Sh EXAMPLES +The following calls to +.Fn u8gnext +iterate over and print all the graphemes in +.Va s . +.Bd -literal -offset indent +#define STRING u8"नमस्कार विश्व" + +struct u8view v; +const char8_t *s = STRING; +size_t n = sizeof(STRING) - 1; + +while (u8gnext(&v, &s, &n)) + printf("‘%.*s’\en", (int)g.len, g.p); +.Ed +.Sh SEE ALSO +.Xr u8next 3 , +.Xr u8view 3 , +.Xr unicode 7 , +.Xr utf\-8 7 +.Sh STANDARDS +.Rs +.%A F. Yergeau +.%D November 2003 +.%R RFC 3629 +.%T UTF-8, a transformation format of ISO 10646 +.Re +.Pp +.Lk https://www.unicode.org/versions/Unicode15.1.0/ \ +"The Unicode\(rg Standard Version 15.1.0" +.Sh AUTHORS +.An Thomas Voss Aq Mt mail@thomasvoss.com diff --git a/vendor/librune/man/u8len.3 b/vendor/librune/man/u8len.3 new file mode 100644 index 0000000..4e58e14 --- /dev/null +++ b/vendor/librune/man/u8len.3 @@ -0,0 +1,70 @@ +.Dd January 15 2024 +.Dt U8LEN 3 +.Os +.Sh NAME +.Nm u8len +.Nd count Unicode codepoints +.Sh LIBRARY +.Lb librune +.Sh SYNOPSIS +.In utf8.h +.Ft size_t +.Fn u8len "const char8_t *s" "size_t n" +.Sh DESCRIPTION +The +.Fn u8len +function returns the number of UTF-8 encoded Unicode codepoints in the +buffer +.Fa s +of length +.Fa n +bytes. +.Pp +This function assumes that +.Fa s +contains only valid UTF-8. +.Sh RETURN VALUES +The +.Fn u8len +function returns the number of codepoints in the buffer +.Fa s . +.Sh EXAMPLES +The following call to +.Fn u8len +will return 17 while the call to +.Fn strlen +will return 22 as a result of use of multibyte-characters in +.Fa s . +.Bd -literal -offset indent +char8_t s[] = u8\(dq„Der Große Duden“\(dq; +size_t blen, cplen; + +blen = strlen((char *)s); +cplen = u8len(s, sizeof(s) - 1); +.Ed +.Sh SEE ALSO +.Xr u8glen 3 , +.Xr u8wdth 3 , +.Xr unicode 7 , +.Xr utf\-8 7 +.Sh STANDARDS +.Rs +.%A F. Yergeau +.%D November 2003 +.%R RFC 3629 +.%T UTF-8, a transformation format of ISO 10646 +.Re +.Sh AUTHORS +.An Thomas Voss Aq Mt mail@thomasvoss.com +.Sh CAVEATS +The return value of +.Fn u8len +does not necessarily represent the number of human-preceived characters +in the given buffer; +multiple codepoints may combine to form one human-preceived character +that spans a single column. +To count user-preceived codepoints +.Pq also known as graphemes , +you may want to use the +.Xr u8glen 3 +function. diff --git a/vendor/librune/man/u8next.3 b/vendor/librune/man/u8next.3 new file mode 100644 index 0000000..93a4f5d --- /dev/null +++ b/vendor/librune/man/u8next.3 @@ -0,0 +1,111 @@ +.Dd January 18 2024 +.Dt U8NEXT 3 +.Os +.Sh NAME +.Nm u8next , +.Nm u8prev +.Nd iterate over Unicode codepoints +.Sh LIBRARY +.Lb librune +.Sh SYNOPSIS +.In utf8.h +.Ft "const char8_t *" +.Fn u8next "rune *ch" "const char8_t **s" "size_t *n" +.Ft "const char8_t *" +.Fn u8prev "rune *ch" "const char8_t **s" "const char8_t *start" +.Sh DESCRIPTION +The +.Fn u8next +function decodes the first rune in the UTF-8 encoded string pointed to by +.Fa s +of length +.Fa n +and stores the result in +.Fa ch . +It then updates +.Fa s +to point to the next codepoint in the buffer and updates the length +.Fa n +accordingly. +.Pp +The +.Fn u8prev +function takes a pointer +.Fa start +which points to the start of the string instead of a length, +and updates +.Fa s +to point to the previous codepoint in the buffer. +The rune +.Fa ch +is set to UTF-8 codepoint pointed to by +.Fa s +after iteration. +.Pp +Both of these functions assume the input is valid UTF-8. +.Sh RETURN VALUES +The +.Fn u8next +and +.Fn u8prev +functions return the updated value of +.Fa s +or +.Dv NULL +at the end of iteration. +.Sh EXAMPLES +The following calls to +.Fn u8next +iterate over and print all the codepoints in +.Va s . +.Bd -literal -offset indent +#include <rune.h> /* For PRIXRUNE; see rune(3) */ + +#define STRING u8"Ta’ Ħaġrat" + +rune ch; +const char8_t *s = STRING; +size_t n = sizeof(STRING) - 1; + +while (u8next(&ch, &s, &n)) { + int w = u8wdth(ch); + printf("U+%04" PRIXRUNE ": ‘%.*s’\en", ch, w, s - w); +} +.Ed +.Pp +The following example is the same as the previous, +but it uses the +.Fn u8prev +function to iterate backwards. +.Bd -literal -offset indent +#include <rune.h> /* For PRIXRUNE; see rune(3) */ + +#define STRING u8"Ta’ Ħaġrat" + +rune ch; +const char8_t *s, *start; +size_t n = sizeof(STRING) - 1; + +start = STRING; +s = start + n; + +while (u8prev(&ch, &s, start)) { + int w = u8wdth(ch); + printf("U+%04" PRIXRUNE ": ‘%.*s’\en", ch, w, s); +} +.Ed +.Sh SEE ALSO +.Xr rune 3 , +.Xr u8gnext 3 , +.Xr u8tor 3 , +.Xr unicode 7 , +.Xr utf\-8 7 +.Sh STANDARDS +.Rs +.%A F. Yergeau +.%D November 2003 +.%R RFC 3629 +.%T UTF-8, a transformation format of ISO 10646 +.Re +.Sh AUTHORS +.An Thomas Voss Aq Mt mail@thomasvoss.com diff --git a/vendor/librune/man/u8prev.3 b/vendor/librune/man/u8prev.3 new file mode 100644 index 0000000..cf1364e --- /dev/null +++ b/vendor/librune/man/u8prev.3 @@ -0,0 +1 @@ +.so u8next diff --git a/vendor/librune/man/u8set.3 b/vendor/librune/man/u8set.3 new file mode 100644 index 0000000..307f84e --- /dev/null +++ b/vendor/librune/man/u8set.3 @@ -0,0 +1,103 @@ +.Dd January 18 2024 +.Dt U8SET 3 +.Os +.Sh NAME +.Nm rtou8 , +.Nm u8set +.Nd encode a rune to UTF-8 +.Sh LIBRARY +.Lb librune +.Sh SYNOPSIS +.In utf8.h +.Ft int +.Fn rtou8 "const char8_t *s" "rune ch" "size_t n" +.Ft size_t +.Fn u8set "const char8_t *s" "rune ch" "size_t n" +.Sh DESCRIPTION +The +.Fn rtou8 +function writes the rune +.Fa ch +to the UTF-8 encoded buffer +.Fa s +of length +.Fa n , +returning the number of bytes required to UTF-8 encode +.Fa ch . +.Pp +The +.Fn u8set +function fills the buffer +.Fa s +of length +.Fa n +with the constant rune +.Fa ch . +It is similar to the +.Fn rtou8 +function, +but writes more than 1 rune if the given buffer has the capacity. +Unlike +.Fn rtou8 , +this function returns the number of bytes that were successfully written +to +.Fa s . +If +.Fa n +is a multiple of +.Fn u8wdth ch +the return value will be equal to +.Fa n , +however in the case that +.Fa n +is not a multiple then +.Fa s +is filled as much as possible, +and a count shorter than +.Fa n +is returned. +.Pp +Both of these functions assume the input is valid UTF-8. +.Sh RETURN VALUES +The +.Fn rtou8 +function returns the number of bytes required to write +.Fa ch +to the buffer +.Fa s . +.Pp +The +.Fn u8set +function returns the number of bytes written to the buffer +.Fa s . +.Sh EXAMPLES +The following calls to +.Fn rtou8 +and +.Fn u8set +fill a buffer with box-drawing characters to create a top-row of a box. +.Bd -literal -offset indent +#define SCREEN_WIDTH 80 + +int bdr_wdth = u8wdth(U'─'); /* box-drawing rune width */ +size_t bufsiz = SCREEN_WIDTH * bdr_wdth; +char8_t *s = malloc(bufsiz); + +rtou8(s, U'┌', bdr_wdth); +u8set(s + bdr_wdth, U'─', bufsiz - bdr_wdth * 2); +rtou8(s + bufsiz - bdr_wdth, U'┐', bdr_wdth); +.Ed +.Sh SEE ALSO +.Xr u8tor 3 , +.Xr u8tor_uc 3 , +.Xr unicode 7 , +.Xr utf\-8 7 +.Sh STANDARDS +.Rs +.%A F. Yergeau +.%D November 2003 +.%R RFC 3629 +.%T UTF-8, a transformation format of ISO 10646 +.Re +.Sh AUTHORS +.An Thomas Voss Aq Mt mail@thomasvoss.com diff --git a/vendor/librune/man/u8tor.3 b/vendor/librune/man/u8tor.3 new file mode 100644 index 0000000..147f7c1 --- /dev/null +++ b/vendor/librune/man/u8tor.3 @@ -0,0 +1,90 @@ +.Dd January 18 2024 +.Dt U8TOR 3 +.Os +.Sh NAME +.Nm u8tor , +.Nm u8tor_uc +.Nd decode UTF-8 into a rune +.Sh LIBRARY +.Lb librune +.Sh SYNOPSIS +.In utf8.h +.Ft int +.Fn u8tor "rune *ch" "const char8_t *s" +.Ft int +.Fn u8tor_uc "rune *ch" "const char8_t *s" +.Sh DESCRIPTION +The +.Fn u8tor +and +.Fn u8tor_uc +functions decode the first rune in the UTF-8 buffer +.Fa s , +storing the result in the rune pointed to by +.Fa ch . +Both functions return the number of bytes which compose the decoded +UTF-8. +.Pp +The two functions are nearly identical, +however +.Fn u8tor_uc +performs fewer range checks than +.Fn u8tor +allowing it to process data more efficiently. +When provided with invalid UTF-8 however, +.Fn u8tor_uc +engages in undefined-behavior. +The +.Fn u8tor +function on the other hand handles invalid UTF-8 by storing +.Dv RUNE_ERROR +in +.Fa ch +and returning 1. +.Sh RETURN VALUES +The +.Fn u8tor +and +.Fn u8tor_uc +functions return the number of bytes from +.Fa s +decoded into +.Fa ch . +.Pp +The +.Fn u8tor +function returns 1 on invalid UTF-8. +.Sh EXAMPLES +The following call to +.Fn u8tor +attempts to decode the first UTF-8 codepoint in +.Va buf . +.Bd -literal -offset indent +/* Implementation of read_codepoint() omitted */ + +int w; +rune ch; +char8_t *buf = read_codepoint(stdin); + +w = u8tor(&ch, buf); +if (ch == RUNE_ERROR) { + fputs("Got invalid UTF-8 codepoint", stderr); + exit(EXIT_FAILURE); +} +printf("Got rune ‘%.*s’\en", w, buf); +.Ed +.Sh SEE ALSO +.Xr rtou8 3 , +.Xr u8chk 3 , +.Xr u8next 3 , +.Xr unicode 7 , +.Xr utf\-8 7 +.Sh STANDARDS +.Rs +.%A F. Yergeau +.%D November 2003 +.%R RFC 3629 +.%T UTF-8, a transformation format of ISO 10646 +.Re +.Sh AUTHORS +.An Thomas Voss Aq Mt mail@thomasvoss.com diff --git a/vendor/librune/man/u8tor_uc.3 b/vendor/librune/man/u8tor_uc.3 new file mode 100644 index 0000000..1527e52 --- /dev/null +++ b/vendor/librune/man/u8tor_uc.3 @@ -0,0 +1 @@ +.so u8tor.3 diff --git a/vendor/librune/man/u8wdth.3 b/vendor/librune/man/u8wdth.3 new file mode 100644 index 0000000..60fcada --- /dev/null +++ b/vendor/librune/man/u8wdth.3 @@ -0,0 +1,69 @@ +.Dd January 16 2024 +.Dt U8WDTH 3 +.Os +.Sh NAME +.Nm u8wdth +.Nd Unicode codepoint width +.Sh LIBRARY +.Lb librune +.Sh SYNOPSIS +.In utf8.h +.Ft int +.Fn u8wdth "rune ch" +.Sh DESCRIPTION +The +.Fn u8wdth +function returns the number of bytes that would be occupied by the +Unicode-codepoint +.Fa ch +if it was encoded as UTF-8. +If +.Fa ch +is greater than +.Dv RUNE_MAX , +a width of 0 is returned. +.Pp +If the exact UTF-8 encoded size of a codepoint is not relevant and you +simply wish to allocate a buffer capable of holding a given number of +UTF-8 codepoints, +the +.Dv U8_LEN_MAX +macro may be preferable. +.Pp +This function treats invalid codepoints smaller than +.Dv RUNE_MAX +such as UTF-16 surrogates as valid. +.Sh RETURN VALUES +The +.Fn u8wdth +function returns the number of bytes required to UTF-8 encode the +codepoint +.Fa ch . +.Sh EXAMPLES +The following example allocates a buffer which is exactly large enough to +hold the given UTF-32 string once it is converted to UTF-8. +.Bd -literal -offset indent +#define lengthof(a) (sizeof(a) / sizeof(*(a))) + +size_t bufsiz = 0; +char8_t *buf; +char32_t s[] = U\(dqIJsselmeer\(dq; /* ‘IJ’ takes 2 bytes */ + +for (size_t i = 0; i < lengthof(s) - 1; i++) + bufsiz += u8wdth(s[i]); +buf = malloc(bufsiz); +.Ed +.Sh SEE ALSO +.Xr u8glen 3 , +.Xr u8len 3 , +.Xr unicode 7 , +.Xr utf-8 7 +.Sh STANDARDS +.Rs +.%A F. Yergeau +.%D November 2003 +.%R RFC 3629 +.%T UTF-8, a transformation format of ISO 10646 +.Re +.Sh AUTHORS +.An Thomas Voss Aq Mt mail@thomasvoss.com diff --git a/vendor/librune/test/gbrk.c b/vendor/librune/test/gbrk.c new file mode 100644 index 0000000..ad32fdd --- /dev/null +++ b/vendor/librune/test/gbrk.c @@ -0,0 +1,85 @@ +#define _POSIX_C_SOURCE 200809L +#include <err.h> +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> + +#include <gbrk.h> +#include <rune.h> +#include <utf8.h> + +#define die(...) err(EXIT_FAILURE, __VA_ARGS__) + +static void test(char *); + +int +main(int argc, char **argv) +{ + char *line = NULL; + size_t n; + ssize_t nr; + FILE *fp; + + setlocale(LC_ALL, ""); + + if (argc != 2) { + fprintf(stderr, "%s: file\n", *argv); + exit(EXIT_FAILURE); + } + + if (!(fp = fopen(argv[1], "r"))) + die("fopen"); + + while ((nr = getline(&line, &n, fp)) > 0) { + line[nr - 1] = 0; + test(line); + } + + if (nr == -1 && ferror(fp)) + die("getline"); + + fclose(fp); + free(line); + return EXIT_SUCCESS; +} + +void +test(char *raw) +{ + int n; + rune ch; + char8_t *p, *buf; + const char8_t *s; + size_t bufsiz = 4096; + struct grapheme graph; + + if (!(buf = malloc(bufsiz))) + die("malloc"); + + p = buf; + while (sscanf(raw, "%" SCNxRUNE "%n", &ch, &n)) { + rune sep; + p += rtou8(p, ch, bufsiz - (p - buf)); + raw += n; + raw += u8tor(&sep, (char8_t *)raw); + if (!sep) + break; + } + *p = 0; + + s = buf; + while (u8gnext(&graph, &s, &bufsiz) && *graph.p) { + rune ch; + const char8_t *p; + + while (u8next(&ch, &graph.p, &graph.len) && ch) { + printf("%04" PRIXRUNE "%s", ch, graph.len > 0 ? "×" : ""); + p = graph.p; + } + if (bufsiz && *p) + fputs("÷", stdout); + } + + putchar('\n'); + free(buf); +} diff --git a/vendor/librune/test/tests b/vendor/librune/test/tests new file mode 100755 index 0000000..e728773 --- /dev/null +++ b/vendor/librune/test/tests @@ -0,0 +1,38 @@ +#!/bin/sh + +report() +{ + case $1 in + 0) printf 'All tests passed\n' >&2 ;; + 1) printf '1 test failed\n' >&2 ;; + *) printf '%d tests failed\n' $1 >&2 + esac +} + +readonly src=../data/GraphemeBreakTest.txt + +set -e +cd "${0%/*}" +find ../lib -name '*.c' -exec cc -I../include -o gbrk gbrk.c {} + +trap 'rm -f gbrk' EXIT + +n=$( + ./gbrk $src \ + | diff -y --suppress-common-lines $src - \ + | tee failures \ + | wc -l +) +test $n -eq 0 && rm failures + +if test -t 2 +then + case $n in + 0) printf '\033[0;32m' ;; + *) printf '\033[0;31m' + esac + + report $n + printf '\033[0m' >&2 +else + report $n +fi |