├── .gitignore ├── CMakeLists.txt ├── LICENCE ├── LICENCE.clish ├── README ├── complete.c ├── complete.h ├── example.c ├── history.c ├── history.h ├── tinyrl.c ├── tinyrl.h ├── utf8.c ├── utf8.h ├── utf8data.c └── utf8data.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | tags 3 | /Debug 4 | /Release 5 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | project(tinyrl C) 3 | 4 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wmissing-prototypes -Werror") 5 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") 6 | 7 | option(UTF8 "Enable UTF-8" ON) 8 | if(UTF8) 9 | set(UTF8_SOURCE utf8.c) 10 | else() 11 | add_definitions(-DDISABLE_UTF8) 12 | endif() 13 | 14 | add_library(tinyrl tinyrl.c history.c complete.c ${UTF8_SOURCE}) 15 | 16 | add_executable(example example.c) 17 | target_link_libraries(example tinyrl) 18 | 19 | add_custom_target(data DEPENDS utf8data.c) 20 | 21 | add_custom_command( 22 | OUTPUT utf8data.c 23 | COMMAND python ${CMAKE_SOURCE_DIR}/utf8data.py > utf8data.c 24 | DEPENDS utf8data.py UnicodeData.txt EastAsianWidth.txt GraphemeBreakProperty.txt) 25 | 26 | add_custom_command( 27 | OUTPUT UnicodeData.txt 28 | COMMAND curl -o UnicodeData.txt http://www.unicode.org/Public/UNIDATA/UnicodeData.txt) 29 | add_custom_command( 30 | OUTPUT EastAsianWidth.txt 31 | COMMAND curl -o EastAsianWidth.txt http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt) 32 | add_custom_command( 33 | OUTPUT GraphemeBreakProperty.txt 34 | COMMAND curl -o GraphemeBreakProperty.txt http://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt) 35 | 36 | file(GLOB headers *.h) 37 | install(FILES ${headers} DESTINATION include/tinyrl) 38 | install(TARGETS tinyrl ARCHIVE DESTINATION lib) 39 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | This software contains modified portions of the clish software. See 2 | LICENCE.clish for the licence terms which apply to the original clish 3 | software. 4 | 5 | 6 | Copyright (c) 2014-2015, the tinyrl contributors. 7 | All rights reserved. 8 | 9 | Redistribution and use in source and binary forms, with or without modification, 10 | are permitted provided that the following conditions are met: 11 | 12 | * Redistributions of source code must retain the above copyright notice, 13 | this list of conditions and the following disclaimer. 14 | * Redistributions in binary form must reproduce the above copyright notice, 15 | this list of conditions and the following disclaimer in the documentation 16 | and/or other materials provided with the distribution. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 19 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 22 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 25 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 27 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /LICENCE.clish: -------------------------------------------------------------------------------- 1 | /** 2 | \page _licence_page Licence 3 | 4 | \section Overview 5 | This package contains code which is copyrighted to multiple sources. 6 | 7 |
8 | 9 | \section _3com 3Com Corporation 10 | The intial public release of this software was developed by Graeme McKerrell 11 | whilst in the employment of 3Com Europe Ltd. 12 | 13 | \verbatim 14 | clish/ 15 | clish/command 16 | clish/param 17 | clish/pargv 18 | clish/ptype 19 | clish/shell 20 | clish/variable 21 | clish/view 22 | 23 | lub/ 24 | lub/argv 25 | lub/bintree 26 | lub/blockpool 27 | lub/test 28 | lub/dump 29 | lub/string 30 | \endverbatim 31 | 32 | 33 | Copyright (c) 2005, 3Com Corporation 34 | All rights reserved. 35 | 36 | Redistribution and use in source and binary forms, with or without modification, 37 | are permitted provided that the following conditions are met: 38 | 39 | * Redistributions of source code must retain the above copyright notice, 40 | this list of conditions and the following disclaimer. 41 | * Redistributions in binary form must reproduce the above copyright notice, 42 | this list of conditions and the following disclaimer in the documentation 43 | and/or other materials provided with the distribution. 44 | * Neither the name of 3Com Corporation nor the names of its contributors may 45 | be used to endorse or promote products derived from this software without 46 | specific prior written permission. 47 | 48 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 49 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 50 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 51 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 52 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 53 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 54 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 55 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 56 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 57 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 58 | 59 |
60 | 61 | \section _newport Newport Networks Ltd. 62 | The 0.6-0.7 releases of this software was developed by Graeme McKerrell whilst in the 63 | employment of Newport Networks Ltd. 64 | As well as enhancing the existing code the following new modules were developed. 65 | 66 | \verbatim 67 | tinyrl/ 68 | tinyrl/history 69 | tinyrl/vt100 70 | 71 | lub/heap/ 72 | lub/heap/vxworks 73 | lub/heap/posix 74 | lub/dblockpool 75 | lubheap/ 76 | lubheap/vxworks 77 | lubheap/posix 78 | 79 | \endverbatim 80 | 81 | 82 | Copyright (c) 2005,2006, Newport Networks Ltd 83 | All rights reserved. 84 | 85 | Redistribution and use in source and binary forms, with or without modification, 86 | are permitted provided that the following conditions are met: 87 | 88 | * Redistributions of source code must retain the above copyright notice, 89 | this list of conditions and the following disclaimer. 90 | * Redistributions in binary form must reproduce the above copyright notice, 91 | this list of conditions and the following disclaimer in the documentation 92 | and/or other materials provided with the distribution. 93 | * Neither the name of Newport Networks Ltd nor the names of its contributors may 94 | be used to endorse or promote products derived from this software without 95 | specific prior written permission. 96 | 97 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 98 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 99 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 100 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 101 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 102 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 103 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 104 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 105 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 106 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 107 | 108 |
109 | 110 | */ 111 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | /** 2 | \defgroup tinyrl "Tiny Readline Library" 3 | @{ 4 | 5 | This library provides a simple replacement of the "readline" functionality. 6 | 7 | The readline interface and implementation has some fundamental flaws when 8 | it comes to try and run it within a single memory space envrioment. e.g. vxWorks 9 | - The use of global variables prevents multiple sessions from co-existing. 10 | - The comprehensiveness of the library makes it large, and it contains 11 | more features than are needed in an embedded system. 12 | - It relies on other (large) libraries which are not typically available on an 13 | embedded system e.g. termcap. 14 | 15 | @} 16 | */ -------------------------------------------------------------------------------- /complete.c: -------------------------------------------------------------------------------- 1 | #include "complete.h" 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "tinyrl.h" 8 | 9 | char **tinyrl_add_match(const struct tinyrl *this, unsigned start, 10 | char **matches, const char *match) 11 | { 12 | const char *line; 13 | unsigned end; 14 | size_t len; 15 | char **m; 16 | 17 | line = tinyrl_get_line(this); 18 | end = tinyrl_get_point(this); 19 | if (strncmp(match, line + start, end - start) != 0) 20 | return matches; 21 | 22 | len = 0; 23 | if (matches) 24 | for (m = matches; *m; m++) 25 | len++; 26 | 27 | /* Allocate memory for new match, plus terminator */ 28 | matches = realloc(matches, (len + 2) * sizeof(*matches)); 29 | matches[len] = strdup(match); 30 | matches[len+1] = NULL; 31 | return matches; 32 | } 33 | 34 | void tinyrl_delete_matches(char **matches) 35 | { 36 | char **m; 37 | 38 | for (m = matches; *m; m++) 39 | free(*m); 40 | free(matches); 41 | } 42 | 43 | /* 44 | * A convenience function for displaying a list of strings in columnar 45 | * format on Readline's output stream. matches is the list of strings, 46 | * in argv format, such as a list of completion matches. 47 | */ 48 | void tinyrl_display_matches(struct tinyrl *this, char *const *matches) 49 | { 50 | char *const *m; 51 | size_t max; 52 | size_t c, cols; 53 | 54 | /* find maximum completion length */ 55 | max = 0; 56 | for (m = matches; *m; m++) { 57 | size_t size = strlen(*m); 58 | if (max < size) 59 | max = size; 60 | } 61 | 62 | /* allow for a space between words */ 63 | cols = tinyrl__get_width(this) / (max + 1); 64 | 65 | /* print out a table of completions */ 66 | m = matches; 67 | for (m = matches; *m; ) { 68 | for (c = 0; c < cols && *m; c++, m++) 69 | tinyrl_printf(this, "%-*s ", max, *m); 70 | tinyrl_crlf(this); 71 | } 72 | } 73 | 74 | bool tinyrl_complete(struct tinyrl *this, unsigned start, 75 | char **matches, bool allow_prefix) 76 | { 77 | const char *line; 78 | unsigned end, len; 79 | bool completion; 80 | bool prefix; 81 | int i; 82 | 83 | if (!matches || !matches[0]) 84 | return false; 85 | 86 | /* identify common prefix */ 87 | len = strlen(matches[0]); 88 | prefix = true; 89 | for (i = 1; matches[i]; i++) { 90 | unsigned common; 91 | for (common = 0; common < len; common++) 92 | if (matches[0][common] != matches[i][common]) 93 | break; 94 | if (len != common) { 95 | len = common; 96 | prefix = !matches[i][len]; 97 | } 98 | } 99 | 100 | /* insert common prefix */ 101 | line = tinyrl_get_line(this); 102 | end = tinyrl_get_point(this); 103 | if (end - start < len 104 | || strncmp(line + start, matches[0], len) != 0) { 105 | tinyrl_delete_text(this, start, end); 106 | if (!tinyrl_insert_text_len(this, matches[0], len)) 107 | return false; 108 | tinyrl_redisplay(this); 109 | completion = true; 110 | } else { 111 | completion = false; 112 | } 113 | 114 | /* is there only one completion? */ 115 | if (!matches[1]) 116 | return true; 117 | 118 | /* is the prefix valid? */ 119 | if (prefix && allow_prefix) 120 | return true; 121 | 122 | /* display matches if no progress was made */ 123 | if (!completion) { 124 | tinyrl_crlf(this); 125 | tinyrl_display_matches(this, matches); 126 | tinyrl_reset_line_state(this); 127 | } 128 | 129 | return false; 130 | } 131 | -------------------------------------------------------------------------------- /complete.h: -------------------------------------------------------------------------------- 1 | #ifndef _tinyrl_complete_h 2 | #define _tinyrl_complete_h 3 | 4 | #include 5 | 6 | struct tinyrl; 7 | 8 | char **tinyrl_add_match(const struct tinyrl *this, unsigned start, 9 | char **matches, const char *match); 10 | void tinyrl_delete_matches(char **matches); 11 | void tinyrl_display_matches(struct tinyrl * this, char *const *matches); 12 | 13 | /** 14 | * Complete the current word in the input buffer. 15 | * 16 | * The longest common prefix is inserted into the buffer. 17 | * 18 | * If there was only one possible match, then the result is true. 19 | * 20 | * If allow_prefix is true and the longest common prefix is also a valid match, 21 | * then the result is true. 22 | * 23 | * Otherwise the result is false. In this case, if nothing was inserted into 24 | * the buffer then the matches are displayed. 25 | */ 26 | bool tinyrl_complete(struct tinyrl *this, unsigned start, 27 | char **matches, bool allow_prefix); 28 | 29 | #endif 30 | -------------------------------------------------------------------------------- /example.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "tinyrl.h" 5 | #include "history.h" 6 | #include "complete.h" 7 | 8 | static bool complete(struct tinyrl *t, bool allow_prefix, bool allow_empty) 9 | { 10 | const char *text; 11 | unsigned start; 12 | unsigned end; 13 | char **matches; 14 | bool ret = false; 15 | 16 | /* find the start of the current word */ 17 | text = tinyrl_get_line(t); 18 | start = end = tinyrl_get_point(t); 19 | while (start && !isspace(text[start - 1])) 20 | start--; 21 | if (start == end && allow_empty) 22 | return true; 23 | 24 | /* build a list of possible completions */ 25 | matches = NULL; 26 | matches = tinyrl_add_match(t, start, matches, "exit"); 27 | matches = tinyrl_add_match(t, start, matches, "help"); 28 | matches = tinyrl_add_match(t, start, matches, "hello"); 29 | matches = tinyrl_add_match(t, start, matches, "vi"); 30 | matches = tinyrl_add_match(t, start, matches, "view"); 31 | if (!matches) 32 | return false; 33 | 34 | /* select the longest completion */ 35 | ret = tinyrl_complete(t, start, matches, allow_prefix); 36 | 37 | tinyrl_delete_matches(matches); 38 | 39 | return ret; 40 | } 41 | 42 | static bool tab_key(void *context, char *key) 43 | { 44 | struct tinyrl *t = context; 45 | 46 | if (complete(t, false, false)) 47 | return tinyrl_insert_text(t, " "); 48 | return false; 49 | } 50 | 51 | static bool space_key(void *context, char *key) 52 | { 53 | struct tinyrl *t = context; 54 | 55 | if (complete(t, true, false)) 56 | return tinyrl_insert_text(t, " "); 57 | return false; 58 | } 59 | 60 | static bool enter_key(void *context, char *key) 61 | { 62 | struct tinyrl *t = context; 63 | 64 | if (complete(t, true, true)) { 65 | tinyrl_crlf(t); 66 | tinyrl_done(t); 67 | } 68 | return false; 69 | } 70 | 71 | int main(int argc, char *argv[]) 72 | { 73 | struct tinyrl_history *history; 74 | struct tinyrl *t; 75 | char *line; 76 | 77 | t = tinyrl_new(stdin, stdout); 78 | tinyrl_bind_key(t, '\t', tab_key, t); 79 | tinyrl_bind_key(t, '\r', enter_key, t); 80 | tinyrl_bind_key(t, ' ', space_key, t); 81 | 82 | history = tinyrl_history_new(t, 0); 83 | 84 | for (;;) { 85 | line = tinyrl_readline(t, "> "); 86 | if (!line) 87 | break; 88 | 89 | if (strcmp(line, "exit") == 0) { 90 | free(line); 91 | break; 92 | } 93 | 94 | printf("echo: %s\n", line); 95 | 96 | tinyrl_history_add(history, line); 97 | free(line); 98 | } 99 | 100 | tinyrl_history_delete(history); 101 | tinyrl_delete(t); 102 | return 0; 103 | } 104 | 105 | -------------------------------------------------------------------------------- /history.c: -------------------------------------------------------------------------------- 1 | /* 2 | * history.c 3 | * 4 | * Simple non-readline hooks for the cli library 5 | */ 6 | #include 7 | #include 8 | #include 9 | 10 | #include 11 | 12 | #include "tinyrl.h" 13 | #include "history.h" 14 | 15 | struct tinyrl_history { 16 | struct tinyrl *tinyrl; 17 | char **entries; /* pointer entries */ 18 | unsigned length; /* Number of elements within this array */ 19 | unsigned size; /* Number of slots allocated in this array */ 20 | unsigned limit; 21 | unsigned iter; 22 | }; 23 | 24 | static bool tinyrl_history_key_up(void *context, char *key) 25 | { 26 | struct tinyrl_history *history = context; 27 | 28 | if (tinyrl_history_get(history, history->iter) != tinyrl_get_line(history->tinyrl)) 29 | history->iter = tinyrl_history_length(history); 30 | if (history->iter == 0) 31 | return false; 32 | history->iter--; 33 | tinyrl_set_line(history->tinyrl, tinyrl_history_get(history, history->iter)); 34 | return true; 35 | } 36 | 37 | static bool tinyrl_history_key_down(void *context, char *key) 38 | { 39 | struct tinyrl_history *history = context; 40 | 41 | if (tinyrl_history_get(history, history->iter) != tinyrl_get_line(history->tinyrl)) 42 | return false; 43 | history->iter++; 44 | tinyrl_set_line(history->tinyrl, tinyrl_history_get(history, history->iter)); 45 | return true; 46 | } 47 | 48 | struct tinyrl_history *tinyrl_history_new(struct tinyrl *tinyrl, unsigned limit) 49 | { 50 | struct tinyrl_history *history; 51 | 52 | history = malloc(sizeof(*history)); 53 | if (!history) 54 | return NULL; 55 | 56 | history->tinyrl = tinyrl; 57 | history->entries = NULL; 58 | history->limit = limit; 59 | history->length = 0; 60 | history->size = 0; 61 | history->iter = 0; 62 | 63 | tinyrl_bind_special(tinyrl, TINYRL_KEY_UP, tinyrl_history_key_up, history); 64 | tinyrl_bind_special(tinyrl, TINYRL_KEY_DOWN, tinyrl_history_key_down, history); 65 | return history; 66 | } 67 | 68 | void tinyrl_history_delete(struct tinyrl_history *history) 69 | { 70 | unsigned i; 71 | 72 | for (i = 0; i < history->length; i++) 73 | free(history->entries[i]); 74 | free(history->entries); 75 | free(history); 76 | } 77 | 78 | /* 79 | * This removes the specified entries from the 80 | * entries vector. Shuffling up the array as necessary 81 | */ 82 | static void 83 | remove_entries(struct tinyrl_history *history, unsigned start, unsigned delta) 84 | { 85 | unsigned end = start + delta; 86 | unsigned i; 87 | 88 | assert(end <= history->length); 89 | 90 | for (i = start; i < end; i++) 91 | free(history->entries[i]); 92 | memmove(history->entries + start, history->entries + end, 93 | sizeof(*history->entries) * (history->length - end)); 94 | history->length -= delta; 95 | } 96 | 97 | /* 98 | add an entry to the end of the current array 99 | if there is no space returns -1 else 0 100 | */ 101 | static void append_entry(struct tinyrl_history *history, const char *line) 102 | { 103 | if (history->length < history->size) { 104 | history->entries[history->length] = strdup(line); 105 | history->length++; 106 | } 107 | } 108 | 109 | /* grow the array if necessary */ 110 | static void grow(struct tinyrl_history *history) 111 | { 112 | if (history->size == history->length) { 113 | /* increment the history memory by 10 entries each time we grow */ 114 | unsigned new_size = history->size + 10; 115 | char **new_entries; 116 | 117 | new_entries = realloc(history->entries, 118 | sizeof(*history->entries) * new_size); 119 | if (NULL != new_entries) { 120 | history->size = new_size; 121 | history->entries = new_entries; 122 | } 123 | } 124 | } 125 | 126 | void tinyrl_history_add(struct tinyrl_history *history, const char *line) 127 | { 128 | if (history->length && (history->length == history->limit)) { 129 | /* remove the oldest entry */ 130 | remove_entries(history, 0, 1); 131 | } else { 132 | grow(history); 133 | } 134 | append_entry(history, line); 135 | } 136 | 137 | void tinyrl_history_remove(struct tinyrl_history *history, unsigned offset) 138 | { 139 | if (offset < history->length) { 140 | /* do the biz */ 141 | remove_entries(history, offset, 1); 142 | } 143 | } 144 | 145 | void tinyrl_history_clear(struct tinyrl_history *history) 146 | { 147 | /* free all the entries */ 148 | remove_entries(history, 0, history->length); 149 | } 150 | 151 | void tinyrl_history_limit(struct tinyrl_history *history, unsigned limit) 152 | { 153 | if (limit && limit < history->length) 154 | remove_entries(history, 0, history->length - limit); 155 | history->limit = limit; 156 | } 157 | 158 | /* 159 | INFORMATION ABOUT THE HISTORY LIST 160 | */ 161 | const char *tinyrl_history_get(const struct tinyrl_history *history, 162 | unsigned position) 163 | { 164 | if (position < history->length) 165 | return history->entries[position]; 166 | return NULL; 167 | } 168 | 169 | size_t tinyrl_history_length(const struct tinyrl_history *history) 170 | { 171 | return history->length; 172 | } 173 | -------------------------------------------------------------------------------- /history.h: -------------------------------------------------------------------------------- 1 | /** 2 | \ingroup tinyrl 3 | \defgroup tinyrl_history history 4 | @{ 5 | 6 | \brief This class handles the maintenance of a historical list of command lines. 7 | 8 | */ 9 | #ifndef _tinyrl_history_h 10 | #define _tinyrl_history_h 11 | 12 | #include 13 | 14 | /************************************** 15 | * tinyrl_history class interface 16 | ************************************** */ 17 | 18 | struct tinyrl; 19 | 20 | struct tinyrl_history *tinyrl_history_new(struct tinyrl *tinyrl, unsigned limit); 21 | 22 | void tinyrl_history_delete(struct tinyrl_history *history); 23 | void tinyrl_history_add(struct tinyrl_history *history, const char *line); 24 | 25 | /* 26 | HISTORY LIST MANAGEMENT 27 | */ 28 | void tinyrl_history_remove(struct tinyrl_history *history, unsigned offset); 29 | void tinyrl_history_clear(struct tinyrl_history *history); 30 | void tinyrl_history_limit(struct tinyrl_history *history, unsigned limit); 31 | 32 | const char *tinyrl_history_get(const struct tinyrl_history *history, 33 | unsigned offset); 34 | size_t tinyrl_history_length(const struct tinyrl_history *history); 35 | 36 | #endif /* _tinyrl_history_h */ 37 | /** @} tinyrl_history */ 38 | -------------------------------------------------------------------------------- /tinyrl.c: -------------------------------------------------------------------------------- 1 | #include "tinyrl.h" 2 | #include "utf8.h" 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | #define KEYMAP_SIZE 256 17 | 18 | struct tinyrl_keymap { 19 | tinyrl_key_func_t *handler[KEYMAP_SIZE]; 20 | struct tinyrl_keymap *keymap[KEYMAP_SIZE]; 21 | void *context[KEYMAP_SIZE]; 22 | }; 23 | 24 | /* define the class member data and virtual methods */ 25 | struct tinyrl { 26 | FILE *istream; 27 | FILE *ostream; 28 | const char *line; 29 | unsigned max_line_length; 30 | const char *prompt; 31 | char *buffer; 32 | size_t buffer_size; 33 | bool done; 34 | unsigned point; 35 | unsigned end; 36 | char *kill_string; 37 | struct tinyrl_keymap *keymap; 38 | 39 | char echo_char; 40 | bool echo_enabled; 41 | bool isatty; 42 | 43 | char *last_buffer; 44 | size_t last_end; 45 | size_t last_row; 46 | size_t last_point_row; 47 | }; 48 | 49 | #define ESCAPESTR "\x1b" 50 | #define ESCAPE 27 51 | #define BACKSPACE 127 52 | 53 | static void tinyrl_vt100_clear_screen(struct tinyrl *this) 54 | { 55 | tinyrl_printf(this, "\x1b[2J"); 56 | } 57 | 58 | static void tinyrl_vt100_erase_line_end(struct tinyrl *this) 59 | { 60 | tinyrl_printf(this, "\x1b[0K"); 61 | } 62 | 63 | static void tinyrl_vt100_erase_line(struct tinyrl *this) 64 | { 65 | tinyrl_printf(this, "\x1b[2K"); 66 | } 67 | 68 | static void tinyrl_vt100_cursor_up(struct tinyrl *this, unsigned count) 69 | { 70 | tinyrl_printf(this, "\x1b[%dA", count); 71 | } 72 | 73 | static void tinyrl_vt100_cursor_down(struct tinyrl *this, unsigned count) 74 | { 75 | tinyrl_printf(this, "\x1b[%dB", count); 76 | } 77 | 78 | static void tinyrl_vt100_cursor_forward(struct tinyrl *this, unsigned count) 79 | { 80 | tinyrl_printf(this, "\x1b[%dC", count); 81 | } 82 | 83 | static void tinyrl_vt100_cursor_home(struct tinyrl *this) 84 | { 85 | tinyrl_printf(this, "\x1b[H"); 86 | } 87 | 88 | static void tty_set_raw_mode(FILE *istream, struct termios *old_termios) 89 | { 90 | struct termios new_termios; 91 | int fd = fileno(istream); 92 | int status; 93 | 94 | status = tcgetattr(fd, old_termios); 95 | if (-1 != status) { 96 | status = tcgetattr(fd, &new_termios); 97 | assert(-1 != status); 98 | new_termios.c_iflag = 0; 99 | new_termios.c_oflag = OPOST | ONLCR; 100 | new_termios.c_lflag = 0; 101 | new_termios.c_cc[VMIN] = 1; 102 | new_termios.c_cc[VTIME] = 0; 103 | /* Do the mode switch */ 104 | status = tcsetattr(fd, TCSAFLUSH, &new_termios); 105 | assert(-1 != status); 106 | } 107 | } 108 | 109 | static void tty_restore_mode(FILE *istream, struct termios *old_termios) 110 | { 111 | int fd = fileno(istream); 112 | 113 | tcsetattr(fd, TCSAFLUSH, old_termios); 114 | } 115 | 116 | /* 117 | This is called whenever a line is edited in any way. 118 | It signals that if we are currently viewing a history line we should transfer it 119 | to the current buffer 120 | */ 121 | static void changed_line(struct tinyrl *this) 122 | { 123 | /* if the current line is not our buffer then make it so */ 124 | if (this->line != this->buffer) { 125 | /* replace the current buffer with the new details */ 126 | free(this->buffer); 127 | this->line = this->buffer = strdup(this->line); 128 | this->buffer_size = strlen(this->buffer); 129 | assert(this->line); 130 | } 131 | } 132 | 133 | static bool tinyrl_key_default(void *context, char *key) 134 | { 135 | struct tinyrl *this = context; 136 | 137 | return tinyrl_insert_text(this, key); 138 | } 139 | 140 | static bool tinyrl_key_interrupt(void *context, char *key) 141 | { 142 | struct tinyrl *this = context; 143 | 144 | tinyrl_delete_text(this, 0, this->end); 145 | this->done = true; 146 | 147 | return true; 148 | } 149 | 150 | static bool tinyrl_key_start_of_line(void *context, char *key) 151 | { 152 | struct tinyrl *this = context; 153 | 154 | /* set the insertion point to the start of the line */ 155 | this->point = 0; 156 | return true; 157 | } 158 | 159 | static bool tinyrl_key_end_of_line(void *context, char *key) 160 | { 161 | struct tinyrl *this = context; 162 | 163 | /* set the insertion point to the end of the line */ 164 | this->point = this->end; 165 | return true; 166 | } 167 | 168 | static bool tinyrl_key_kill(void *context, char *key) 169 | { 170 | struct tinyrl *this = context; 171 | 172 | /* release any old kill string */ 173 | free(this->kill_string); 174 | 175 | /* store the killed string */ 176 | this->kill_string = strdup(&this->buffer[this->point]); 177 | 178 | /* delete the text to the end of the line */ 179 | tinyrl_delete_text(this, this->point, this->end); 180 | return true; 181 | } 182 | 183 | static bool tinyrl_key_yank(void *context, char *key) 184 | { 185 | struct tinyrl *this = context; 186 | bool result = false; 187 | if (this->kill_string) { 188 | /* insert the kill string at the current insertion point */ 189 | result = tinyrl_insert_text(this, this->kill_string); 190 | } 191 | return result; 192 | } 193 | 194 | static bool tinyrl_key_crlf(void *context, char *key) 195 | { 196 | struct tinyrl *this = context; 197 | 198 | tinyrl_crlf(this); 199 | this->done = true; 200 | return true; 201 | } 202 | 203 | static bool tinyrl_key_left(void *context, char *key) 204 | { 205 | struct tinyrl *this = context; 206 | bool result = false; 207 | if (this->point > 0) { 208 | this->point = utf8_grapheme_prev(this->line, this->end, this->point); 209 | result = true; 210 | } 211 | return result; 212 | } 213 | 214 | static bool tinyrl_key_right(void *context, char *key) 215 | { 216 | struct tinyrl *this = context; 217 | bool result = false; 218 | if (this->point < this->end) { 219 | this->point = utf8_grapheme_next(this->line, this->end, this->point); 220 | result = true; 221 | } 222 | return result; 223 | } 224 | 225 | static bool tinyrl_key_backspace(void *context, char *key) 226 | { 227 | struct tinyrl *this = context; 228 | bool result = false; 229 | size_t end; 230 | 231 | if (this->point) { 232 | end = this->point; 233 | this->point = utf8_char_prev(this->line, this->end, this->point); 234 | tinyrl_delete_text(this, this->point, end); 235 | result = true; 236 | } 237 | return result; 238 | } 239 | 240 | static bool tinyrl_key_delete(void *context, char *key) 241 | { 242 | struct tinyrl *this = context; 243 | bool result = false; 244 | size_t end; 245 | 246 | if (this->point < this->end) { 247 | end = utf8_grapheme_next(this->line, this->end, this->point); 248 | tinyrl_delete_text(this, this->point, end); 249 | result = true; 250 | } 251 | return result; 252 | } 253 | 254 | static bool tinyrl_key_clear_screen(void *context, char *key) 255 | { 256 | struct tinyrl *this = context; 257 | 258 | tinyrl_vt100_clear_screen(this); 259 | tinyrl_vt100_cursor_home(this); 260 | tinyrl_reset_line_state(this); 261 | return true; 262 | } 263 | 264 | static bool tinyrl_key_erase_line(void *context, char *key) 265 | { 266 | struct tinyrl *this = context; 267 | 268 | tinyrl_delete_text(this, 0, this->point); 269 | this->point = 0; 270 | return true; 271 | } 272 | 273 | static struct tinyrl_keymap *tinyrl_keymap_new() 274 | { 275 | struct tinyrl_keymap *keymap; 276 | int i; 277 | 278 | keymap = malloc(sizeof(*keymap)); 279 | 280 | for (i = 0; i < KEYMAP_SIZE; i++) { 281 | keymap->handler[i] = NULL; 282 | keymap->keymap[i] = NULL; 283 | keymap->context[i] = NULL; 284 | } 285 | 286 | return keymap; 287 | } 288 | 289 | static void tinyrl_keymap_free(struct tinyrl_keymap *keymap) 290 | { 291 | int i; 292 | 293 | for (i = 0; i < KEYMAP_SIZE; i++) 294 | if (keymap->keymap[i]) 295 | tinyrl_keymap_free(keymap->keymap[i]); 296 | free(keymap); 297 | } 298 | 299 | static void tinyrl_fini(struct tinyrl *this) 300 | { 301 | /* free up any dynamic strings */ 302 | free(this->buffer); 303 | this->buffer = NULL; 304 | free(this->kill_string); 305 | this->kill_string = NULL; 306 | free(this->last_buffer); 307 | tinyrl_keymap_free(this->keymap); 308 | } 309 | 310 | static void 311 | tinyrl_init(struct tinyrl *this, FILE * instream, FILE * outstream) 312 | { 313 | int i; 314 | 315 | this->keymap = tinyrl_keymap_new(); 316 | for (i = 32; i < 256; i++) 317 | tinyrl_bind_key(this, i, tinyrl_key_default, this); 318 | tinyrl_bind_key(this, '\r', tinyrl_key_crlf, this); 319 | tinyrl_bind_key(this, '\n', tinyrl_key_crlf, this); 320 | tinyrl_bind_key(this, CTRL('C'), tinyrl_key_interrupt, this); 321 | tinyrl_bind_key(this, BACKSPACE, tinyrl_key_backspace, this); 322 | tinyrl_bind_key(this, CTRL('H'), tinyrl_key_backspace, this); 323 | tinyrl_bind_key(this, CTRL('D'), tinyrl_key_delete, this); 324 | tinyrl_bind_key(this, CTRL('L'), tinyrl_key_clear_screen, this); 325 | tinyrl_bind_key(this, CTRL('U'), tinyrl_key_erase_line, this); 326 | tinyrl_bind_key(this, CTRL('A'), tinyrl_key_start_of_line, this); 327 | tinyrl_bind_key(this, CTRL('E'), tinyrl_key_end_of_line, this); 328 | tinyrl_bind_key(this, CTRL('K'), tinyrl_key_kill, this); 329 | tinyrl_bind_key(this, CTRL('Y'), tinyrl_key_yank, this); 330 | tinyrl_bind_special(this, TINYRL_KEY_RIGHT, tinyrl_key_right, this); 331 | tinyrl_bind_special(this, TINYRL_KEY_LEFT, tinyrl_key_left, this); 332 | tinyrl_bind_special(this, TINYRL_KEY_HOME, tinyrl_key_start_of_line, this); 333 | tinyrl_bind_special(this, TINYRL_KEY_END, tinyrl_key_end_of_line, this); 334 | tinyrl_bind_special(this, TINYRL_KEY_INSERT, NULL, NULL); 335 | tinyrl_bind_special(this, TINYRL_KEY_DELETE, tinyrl_key_delete, this); 336 | 337 | this->line = NULL; 338 | this->max_line_length = 0; 339 | this->prompt = NULL; 340 | this->buffer = NULL; 341 | this->buffer_size = 0; 342 | this->done = false; 343 | this->point = 0; 344 | this->end = 0; 345 | this->kill_string = NULL; 346 | this->echo_char = '\0'; 347 | this->echo_enabled = true; 348 | this->isatty = isatty(fileno(instream)); 349 | this->last_buffer = NULL; 350 | this->last_end = 0; 351 | this->last_row = 0; 352 | this->last_point_row = 0; 353 | 354 | this->istream = instream; 355 | this->ostream = outstream; 356 | } 357 | 358 | int tinyrl_printf(struct tinyrl *this, const char *fmt, ...) 359 | { 360 | va_list args; 361 | int len; 362 | 363 | va_start(args, fmt); 364 | len = vfprintf(this->ostream, fmt, args); 365 | va_end(args); 366 | 367 | return len; 368 | } 369 | 370 | void tinyrl_delete(struct tinyrl *this) 371 | { 372 | assert(this); 373 | if (this) { 374 | /* let the object tidy itself up */ 375 | tinyrl_fini(this); 376 | 377 | /* release the memory associate with this instance */ 378 | free(this); 379 | } 380 | } 381 | 382 | static int tinyrl_getchar(const struct tinyrl *this, char *key) 383 | { 384 | int c; 385 | size_t i, key_len; 386 | 387 | c = getc(this->istream); 388 | if (c == EOF) 389 | return -1; 390 | 391 | key_len = utf8_char_len(c); 392 | if (!key_len) 393 | return -1; 394 | 395 | key[0] = c; 396 | for (i = 1; i < key_len; i++) { 397 | c = getc(this->istream); 398 | if (c == EOF) 399 | return -1; 400 | key[i] = c; 401 | } 402 | key[i] = 0; 403 | 404 | if (utf8_char_decode(key, key_len, NULL) != key_len) 405 | return -1; 406 | 407 | return key_len; 408 | } 409 | 410 | static int tinyrl_getchar_nonblock(const struct tinyrl *this, char *key) 411 | { 412 | int fd; 413 | int flags; 414 | int key_len; 415 | 416 | fd = fileno(this->istream); 417 | flags = fcntl(fd, F_GETFL, 0); 418 | if (flags != -1) 419 | fcntl(fd, F_SETFL, flags | O_NONBLOCK); 420 | key_len = tinyrl_getchar(this, key); 421 | if (flags != -1) 422 | fcntl(fd, F_SETFL, flags); 423 | return key_len; 424 | } 425 | 426 | static void tinyrl_internal_print( 427 | struct tinyrl *this, char **buffer, size_t *point, size_t *end) 428 | { 429 | if (this->echo_enabled) { 430 | /* simply echo the line */ 431 | *point = this->point; 432 | *end = this->end; 433 | *buffer = strdup(this->line); 434 | } else { 435 | /* replace the line with echo char if defined */ 436 | if (this->echo_char) { 437 | size_t i; 438 | 439 | *point = 0; 440 | *end = 0; 441 | for (i = 0; ; i = utf8_grapheme_next(this->line, this->end, i)) { 442 | if (i == this->point) 443 | *point = *end; 444 | if (i >= this->end) 445 | break; 446 | *end += 1; 447 | } 448 | 449 | *buffer = malloc(*end + 1); 450 | if (*buffer) { 451 | memset(*buffer, this->echo_char, *end); 452 | (*buffer)[*end] = 0; 453 | } 454 | } else { 455 | *point = 0; 456 | *end = 0; 457 | *buffer = strdup(""); 458 | } 459 | } 460 | } 461 | 462 | static void tinyrl_string_wrap( 463 | const char *s, size_t len, size_t row_width, size_t *row, size_t *col) 464 | { 465 | size_t point, next, width; 466 | 467 | for (point = 0; point < len; point = next) { 468 | width = utf8_grapheme_width(s, len, point, &next); 469 | *col += width; 470 | if (*col > row_width) { 471 | *row += 1; 472 | *col = width; 473 | } 474 | } 475 | } 476 | 477 | void tinyrl_redisplay(struct tinyrl *this) 478 | { 479 | size_t width; 480 | size_t prompt_row, prompt_col; 481 | size_t row, col; 482 | size_t point_row, point_col; 483 | size_t i; 484 | size_t next_len, keep_len, keep_row, keep_col; 485 | size_t point, end; 486 | char *buffer; 487 | 488 | width = tinyrl__get_width(this); 489 | 490 | prompt_row = 0; 491 | prompt_col = 0; 492 | tinyrl_string_wrap(this->prompt, strlen(this->prompt), width, &prompt_row, &prompt_col); 493 | 494 | tinyrl_internal_print(this, &buffer, &point, &end); 495 | if (!buffer) 496 | return; 497 | 498 | /* erase changed portion of previous line */ 499 | if (this->last_buffer) { 500 | /* find out how much to keep */ 501 | keep_len = 0; 502 | for (;;) { 503 | if (keep_len >= end) 504 | break; 505 | next_len = utf8_grapheme_next(buffer, end, keep_len); 506 | if (next_len > this->last_end) 507 | break; 508 | if (memcmp(buffer + keep_len, this->last_buffer + keep_len, next_len - keep_len) != 0) 509 | break; 510 | keep_len = next_len; 511 | } 512 | 513 | keep_row = prompt_row; 514 | keep_col = prompt_col; 515 | tinyrl_string_wrap(buffer, keep_len, width, &keep_row, &keep_col); 516 | if (keep_len > 0 && keep_col == width) { 517 | /* never keep an empty last line, so that we can 518 | * position the cursor correctly */ 519 | keep_len = utf8_grapheme_prev(buffer, end, keep_len); 520 | keep_row = prompt_row; 521 | keep_col = prompt_col; 522 | tinyrl_string_wrap(buffer, keep_len, width, &keep_row, &keep_col); 523 | } 524 | 525 | /* move cursor to the start of the last displayed row */ 526 | tinyrl_printf(this, "\r"); 527 | if (this->last_row > this->last_point_row) { 528 | tinyrl_vt100_cursor_down(this, this->last_row - this->last_point_row); 529 | } else if (this->last_row < this->last_point_row) { 530 | tinyrl_vt100_cursor_up(this, this->last_point_row - this->last_row); 531 | } 532 | 533 | /* erase the rows we aren't keeping */ 534 | for (i = keep_row; i < this->last_row; i++) { 535 | tinyrl_vt100_erase_line(this); 536 | tinyrl_vt100_cursor_up(this, 1); 537 | } 538 | 539 | /* partially erase the last kept row */ 540 | if (keep_col) 541 | tinyrl_vt100_cursor_forward(this, keep_col); 542 | tinyrl_vt100_erase_line_end(this); 543 | } else { 544 | keep_len = 0; 545 | tinyrl_printf(this, "%s", this->prompt); 546 | } 547 | 548 | tinyrl_printf(this, "%s", buffer + keep_len); 549 | 550 | /* move cursor to point */ 551 | row = prompt_row; 552 | col = prompt_col; 553 | tinyrl_string_wrap(buffer, end, width, &row, &col); 554 | 555 | point_row = prompt_row; 556 | point_col = prompt_col; 557 | tinyrl_string_wrap(buffer, point, width, &point_row, &point_col); 558 | if (point_col == width 559 | || (point < end && point_col + utf8_grapheme_width(buffer, end, point, NULL) > width)) { 560 | point_row++; 561 | point_col = 0; 562 | } 563 | 564 | if (row < point_row) { 565 | /* if the text is a whole number of lines, then the 566 | * cursor will still be at the end of the last line, 567 | * so move it to the start of the next */ 568 | tinyrl_printf(this, "\n"); 569 | } 570 | if (end > point) { 571 | if (row > point_row) { 572 | tinyrl_vt100_cursor_up(this, row - point_row); 573 | } 574 | tinyrl_printf(this, "\r"); 575 | if (point_col) { 576 | tinyrl_vt100_cursor_forward(this, point_col); 577 | } 578 | } 579 | 580 | free(this->last_buffer); 581 | this->last_buffer = buffer; 582 | this->last_end = end; 583 | this->last_row = row; 584 | this->last_point_row = point_row; 585 | 586 | fflush(this->ostream); 587 | } 588 | 589 | struct tinyrl *tinyrl_new(FILE * instream, FILE * outstream) 590 | { 591 | struct tinyrl *this = NULL; 592 | 593 | this = malloc(sizeof(*this)); 594 | if (NULL != this) { 595 | tinyrl_init(this, instream, outstream); 596 | } 597 | 598 | return this; 599 | } 600 | 601 | /* Call the handler for the longest matching key sequence. 602 | * Note: if there is a partial match, then the extra keys are discarded. This 603 | * shouldn't matter in practice. 604 | */ 605 | static void tinyrl_handle_key(struct tinyrl *this, char *key, int key_len) 606 | { 607 | struct tinyrl_keymap *keymap; 608 | tinyrl_key_func_t *handler; 609 | void *context; 610 | unsigned char c; 611 | int i; 612 | 613 | handler = NULL; 614 | context = NULL; 615 | keymap = this->keymap; 616 | i = 0; 617 | for (;;) { 618 | c = key[i]; 619 | if (keymap->handler[c]) { 620 | handler = keymap->handler[c]; 621 | context = keymap->context[c]; 622 | } 623 | keymap = keymap->keymap[c]; 624 | if (!keymap) 625 | break; 626 | 627 | i++; 628 | if (i >= key_len) { 629 | key_len = tinyrl_getchar_nonblock(this, key); 630 | if (key_len <= 0) 631 | break; 632 | i = 0; 633 | } 634 | } 635 | 636 | if (!handler || !handler(context, key)) { 637 | /* an issue has occured */ 638 | tinyrl_ding(this); 639 | } 640 | } 641 | 642 | static void tinyrl_readtty(struct tinyrl *this) 643 | { 644 | struct termios default_termios; 645 | char key[5]; 646 | int key_len; 647 | 648 | tty_set_raw_mode(this->istream, &default_termios); 649 | 650 | tinyrl_reset_line_state(this); 651 | 652 | while (!this->done) { 653 | /* update the display */ 654 | tinyrl_redisplay(this); 655 | 656 | /* get a key */ 657 | key_len = tinyrl_getchar(this, key); 658 | 659 | /* has the input stream terminated? */ 660 | if (key_len > 0) { 661 | /* call the handler for this key */ 662 | tinyrl_handle_key(this, key, key_len); 663 | 664 | if (this->done) { 665 | /* 666 | * If the last character in the line (other than 667 | * the null) is a space remove it. 668 | */ 669 | if (this->end 670 | && isspace(this-> line[this->end - 1])) { 671 | tinyrl_delete_text(this, this->end - 1, 672 | this->end); 673 | } 674 | } 675 | } else { 676 | /* time to finish the session */ 677 | this->done = true; 678 | this->line = NULL; 679 | } 680 | } 681 | 682 | tty_restore_mode(this->istream, &default_termios); 683 | } 684 | 685 | static void tinyrl_readraw(struct tinyrl *this) 686 | { 687 | /* This is a non-interactive set of commands */ 688 | char *s = 0, buffer[80]; 689 | size_t len = sizeof(buffer); 690 | 691 | /* manually reset the line state without redisplaying */ 692 | free(this->last_buffer); 693 | this->last_buffer = NULL; 694 | 695 | while ((sizeof(buffer) == len) && 696 | (s = fgets(buffer, sizeof(buffer), this->istream))) { 697 | char *p; 698 | /* strip any spurious '\r' or '\n' */ 699 | p = strchr(buffer, '\r'); 700 | if (NULL == p) { 701 | p = strchr(buffer, '\n'); 702 | } 703 | if (NULL != p) { 704 | *p = '\0'; 705 | } 706 | /* skip any whitespace at the beginning of the line */ 707 | if (0 == this->point) { 708 | while (*s && isspace(*s)) { 709 | s++; 710 | } 711 | } 712 | if (*s) { 713 | /* append this string to the input buffer */ 714 | (void)tinyrl_insert_text(this, s); 715 | /* echo the command to the output stream */ 716 | tinyrl_redisplay(this); 717 | } 718 | len = strlen(buffer) + 1; /* account for the '\0' */ 719 | } 720 | 721 | /* 722 | * check against fgets returning null as either error or end of file. 723 | * This is a measure to stop potential task spin on encountering an 724 | * error from fgets. 725 | */ 726 | if (s == NULL || (this->line[0] == '\0' && feof(this->istream))) { 727 | /* time to finish the session */ 728 | this->line = NULL; 729 | } else { 730 | tinyrl_crlf(this); 731 | this->done = true; 732 | } 733 | } 734 | 735 | char *tinyrl_readline(struct tinyrl *this, const char *prompt) 736 | { 737 | char *result; 738 | 739 | /* initialise for reading a line */ 740 | this->done = false; 741 | this->point = 0; 742 | this->end = 0; 743 | this->buffer = strdup(""); 744 | this->buffer_size = strlen(this->buffer); 745 | this->line = this->buffer; 746 | this->prompt = prompt; 747 | 748 | if (this->isatty) { 749 | tinyrl_readtty(this); 750 | } else { 751 | tinyrl_readraw(this); 752 | } 753 | 754 | /* 755 | * duplicate the string for return to the client 756 | * we have to duplicate as we may be referencing a 757 | * history entry or our internal buffer 758 | */ 759 | result = this->line ? strdup(this->line) : NULL; 760 | 761 | /* free our internal buffer */ 762 | free(this->buffer); 763 | this->buffer = NULL; 764 | 765 | if ((NULL == result) || '\0' == *result) { 766 | /* make sure we're not left on a prompt line */ 767 | tinyrl_crlf(this); 768 | } 769 | return result; 770 | } 771 | 772 | /* 773 | * Ensure that buffer has enough space to hold len characters, 774 | * possibly reallocating it if necessary. The function returns true 775 | * if the line is successfully extended, false if not. 776 | */ 777 | static bool tinyrl_extend_line_buffer(struct tinyrl *this, unsigned len) 778 | { 779 | bool result = true; 780 | if (this->buffer_size < len) { 781 | char *new_buffer; 782 | size_t new_len = len; 783 | 784 | /* 785 | * What we do depends on whether we are limited by 786 | * memory or a user imposed limit. 787 | */ 788 | 789 | if (this->max_line_length == 0) { 790 | if (new_len < this->buffer_size + 10) { 791 | /* make sure we don't realloc too often */ 792 | new_len = this->buffer_size + 10; 793 | } 794 | /* leave space for terminator */ 795 | new_buffer = realloc(this->buffer, new_len + 1); 796 | 797 | if (NULL == new_buffer) { 798 | tinyrl_ding(this); 799 | result = false; 800 | } else { 801 | this->buffer_size = new_len; 802 | this->line = this->buffer = new_buffer; 803 | result = true; 804 | } 805 | } else { 806 | if (new_len < this->max_line_length) { 807 | 808 | /* Just reallocate once to the max size */ 809 | new_buffer = 810 | realloc(this->buffer, 811 | this->max_line_length); 812 | 813 | if (NULL == new_buffer) { 814 | tinyrl_ding(this); 815 | result = false; 816 | } else { 817 | this->buffer_size = 818 | this->max_line_length - 1; 819 | this->line = this->buffer = new_buffer; 820 | result = true; 821 | } 822 | } else { 823 | tinyrl_ding(this); 824 | result = false; 825 | } 826 | } 827 | } 828 | return result; 829 | } 830 | 831 | /* 832 | * Insert text into the line at the current cursor position. 833 | */ 834 | bool tinyrl_insert_text_len(struct tinyrl *this, const char *text, unsigned delta) 835 | { 836 | /* 837 | * If the client wants to change the line ensure that the line and buffer 838 | * references are in sync 839 | */ 840 | changed_line(this); 841 | 842 | if ((delta + this->end) > (this->buffer_size)) { 843 | /* extend the current buffer */ 844 | if (!tinyrl_extend_line_buffer(this, this->end + delta)) { 845 | return false; 846 | } 847 | } 848 | 849 | if (this->point < this->end) { 850 | /* move the current text to the right (including the terminator) */ 851 | memmove(&this->buffer[this->point + delta], 852 | &this->buffer[this->point], 853 | (this->end - this->point) + 1); 854 | } else { 855 | /* terminate the string */ 856 | this->buffer[this->end + delta] = '\0'; 857 | } 858 | 859 | /* insert the new text */ 860 | strncpy(&this->buffer[this->point], text, delta); 861 | 862 | /* now update the indexes */ 863 | this->point += delta; 864 | this->end += delta; 865 | 866 | return true; 867 | } 868 | 869 | bool tinyrl_insert_text(struct tinyrl *this, const char *text) 870 | { 871 | return tinyrl_insert_text_len(this, text, strlen(text)); 872 | } 873 | 874 | /* 875 | * Delete the text in the interval [start, end-1] in the current line. 876 | * This adjusts the rl_point and rl_end indexes appropriately. 877 | */ 878 | void tinyrl_delete_text(struct tinyrl *this, unsigned start, unsigned end) 879 | { 880 | unsigned delta; 881 | 882 | if (end == start) 883 | return; 884 | 885 | changed_line(this); 886 | 887 | /* move any text which is left, including terminator */ 888 | delta = end - start; 889 | memmove(&this->buffer[start], 890 | &this->buffer[start + delta], this->end + 1 - end); 891 | this->end -= delta; 892 | 893 | /* now adjust the indexs */ 894 | if (this->point > end) { 895 | /* move the insertion point back appropriately */ 896 | this->point -= delta; 897 | } else if (this->point > start) { 898 | /* move the insertion point to the start */ 899 | this->point = start; 900 | } 901 | } 902 | 903 | static void tinyrl_bind_keyseq(struct tinyrl *this, const char *seq, 904 | tinyrl_key_func_t *handler, void *context) 905 | { 906 | struct tinyrl_keymap *keymap; 907 | unsigned char key; 908 | 909 | if (!*seq) 910 | return; 911 | 912 | keymap = this->keymap; 913 | key = *seq++; 914 | 915 | while (*seq) { 916 | if (!keymap->keymap[key]) 917 | keymap->keymap[key] = tinyrl_keymap_new(); 918 | keymap = keymap->keymap[key]; 919 | key = *seq++; 920 | } 921 | 922 | keymap->handler[key] = handler; 923 | keymap->context[key] = context; 924 | } 925 | 926 | void tinyrl_bind_special(struct tinyrl *this, enum tinyrl_key key, 927 | tinyrl_key_func_t *handler, void *context) 928 | { 929 | switch (key) { 930 | case TINYRL_KEY_UP: 931 | tinyrl_bind_keyseq(this, ESCAPESTR "[A", handler, context); 932 | break; 933 | case TINYRL_KEY_DOWN: 934 | tinyrl_bind_keyseq(this, ESCAPESTR "[B", handler, context); 935 | break; 936 | case TINYRL_KEY_LEFT: 937 | tinyrl_bind_keyseq(this, ESCAPESTR "[D", handler, context); 938 | break; 939 | case TINYRL_KEY_RIGHT: 940 | tinyrl_bind_keyseq(this, ESCAPESTR "[C", handler, context); 941 | break; 942 | case TINYRL_KEY_HOME: 943 | tinyrl_bind_keyseq(this, ESCAPESTR "OH", handler, context); 944 | break; 945 | case TINYRL_KEY_END: 946 | tinyrl_bind_keyseq(this, ESCAPESTR "OF", handler, context); 947 | break; 948 | case TINYRL_KEY_INSERT: 949 | tinyrl_bind_keyseq(this, ESCAPESTR "[2~", handler, context); 950 | break; 951 | case TINYRL_KEY_DELETE: 952 | tinyrl_bind_keyseq(this, ESCAPESTR "[3~", handler, context); 953 | break; 954 | } 955 | } 956 | 957 | void tinyrl_bind_key(struct tinyrl *this, unsigned char key, 958 | tinyrl_key_func_t *handler, void *context) 959 | { 960 | this->keymap->handler[key] = handler; 961 | this->keymap->context[key] = context; 962 | } 963 | 964 | void tinyrl_crlf(struct tinyrl *this) 965 | { 966 | tinyrl_printf(this, "\n"); 967 | } 968 | 969 | /* 970 | * Ring the terminal bell, obeying the setting of bell-style. 971 | */ 972 | void tinyrl_ding(struct tinyrl *this) 973 | { 974 | tinyrl_printf(this, "\x7"); 975 | fflush(this->ostream); 976 | } 977 | 978 | void tinyrl_reset_line_state(struct tinyrl *this) 979 | { 980 | /* start from scratch */ 981 | free(this->last_buffer); 982 | this->last_buffer = NULL; 983 | 984 | tinyrl_redisplay(this); 985 | } 986 | 987 | void tinyrl_set_line(struct tinyrl *this, const char *text) 988 | { 989 | this->line = text ?: this->buffer; 990 | this->point = this->end = strlen(this->line); 991 | } 992 | 993 | void tinyrl_replace_line(struct tinyrl *this, const char *text) 994 | { 995 | size_t new_len = strlen(text); 996 | 997 | if (tinyrl_extend_line_buffer(this, new_len)) { 998 | strcpy(this->buffer, text); 999 | this->point = this->end = new_len; 1000 | } 1001 | tinyrl_redisplay(this); 1002 | } 1003 | 1004 | const char *tinyrl_get_line(const struct tinyrl *this) 1005 | { 1006 | return this->line; 1007 | } 1008 | 1009 | unsigned tinyrl_get_point(const struct tinyrl *this) 1010 | { 1011 | return this->point; 1012 | } 1013 | 1014 | size_t tinyrl__get_width(const struct tinyrl *this) 1015 | { 1016 | struct winsize ws; 1017 | 1018 | if (ioctl(fileno(this->ostream), TIOCGWINSZ, &ws) != -1 && ws.ws_col) 1019 | return ws.ws_col; 1020 | 1021 | return 80; 1022 | } 1023 | 1024 | void tinyrl_done(struct tinyrl *this) 1025 | { 1026 | this->done = true; 1027 | } 1028 | 1029 | void tinyrl_enable_echo(struct tinyrl *this) 1030 | { 1031 | this->echo_enabled = true; 1032 | } 1033 | 1034 | void tinyrl_disable_echo(struct tinyrl *this, char echo_char) 1035 | { 1036 | this->echo_enabled = false; 1037 | this->echo_char = echo_char; 1038 | } 1039 | 1040 | void tinyrl_limit_line_length(struct tinyrl *this, unsigned length) 1041 | { 1042 | this->max_line_length = length; 1043 | } 1044 | -------------------------------------------------------------------------------- /tinyrl.h: -------------------------------------------------------------------------------- 1 | /** 2 | \ingroup tinyrl 3 | \defgroup tinyrl_class tinyrl 4 | @{ 5 | 6 | \brief This class provides instances which are capable of handling user input 7 | from a CLI in a "readline" like fashion. 8 | 9 | */ 10 | #ifndef TINYRL_TINYRL_H 11 | #define TINYRL_TINYRL_H 12 | 13 | #include 14 | #include 15 | #include 16 | 17 | struct tinyrl; 18 | 19 | enum tinyrl_key { 20 | TINYRL_KEY_UP, 21 | TINYRL_KEY_DOWN, 22 | TINYRL_KEY_LEFT, 23 | TINYRL_KEY_RIGHT, 24 | TINYRL_KEY_HOME, 25 | TINYRL_KEY_END, 26 | TINYRL_KEY_INSERT, 27 | TINYRL_KEY_DELETE, 28 | }; 29 | 30 | /** 31 | * \return 32 | * - true if the action associated with the key has 33 | * been performed successfully 34 | * - false if the action was not successful 35 | */ 36 | typedef bool tinyrl_key_func_t(void *context, char *key); 37 | 38 | /* exported functions */ 39 | struct tinyrl *tinyrl_new(FILE * instream, FILE * outstream); 40 | 41 | /*lint -esym(534,tinyrl_printf) Ignoring return value of function */ 42 | int tinyrl_printf(struct tinyrl *instance, const char *fmt, ...); 43 | 44 | void tinyrl_delete(struct tinyrl *instance); 45 | 46 | void tinyrl_done(struct tinyrl *instance); 47 | 48 | size_t tinyrl__get_width(const struct tinyrl *instance); 49 | 50 | char *tinyrl_readline(struct tinyrl *instance, const char *prompt); 51 | 52 | void tinyrl_bind_key(struct tinyrl *instance, unsigned char key, 53 | tinyrl_key_func_t *handler, void *context); 54 | void tinyrl_bind_special(struct tinyrl *instance, enum tinyrl_key key, 55 | tinyrl_key_func_t *handler, void *context); 56 | 57 | void tinyrl_crlf(struct tinyrl *instance); 58 | void tinyrl_ding(struct tinyrl *instance); 59 | 60 | void tinyrl_reset_line_state(struct tinyrl *instance); 61 | 62 | bool tinyrl_insert_text(struct tinyrl *instance, const char *text); 63 | bool tinyrl_insert_text_len(struct tinyrl *instance, 64 | const char *text, unsigned len); 65 | void tinyrl_delete_text( struct tinyrl *instance, unsigned start, unsigned end); 66 | 67 | void tinyrl_redisplay(struct tinyrl *instance); 68 | 69 | /* text must be persistent */ 70 | void tinyrl_set_line(struct tinyrl *instance, const char *text); 71 | 72 | void tinyrl_replace_line(struct tinyrl *instance, const char *text); 73 | 74 | /** 75 | * This operation returns the current line in use by the tinyrl instance 76 | * NB. the pointer will become invalid after any further operation on the 77 | * instance. 78 | */ 79 | const char *tinyrl_get_line(const struct tinyrl *instance); 80 | 81 | unsigned tinyrl_get_point(const struct tinyrl *instance); 82 | 83 | /** 84 | * Disable echoing of input characters when a line in input. 85 | * 86 | * echo_char is the character to display instead of a key press. 87 | * If this has the special value '/0' then the insertion point will not 88 | * be moved when keys are pressed. 89 | */ 90 | void tinyrl_disable_echo(struct tinyrl *instance, char echo_char); 91 | 92 | /** 93 | * Enable key echoing for this instance. (This is the default behaviour) 94 | */ 95 | void tinyrl_enable_echo(struct tinyrl *instance); 96 | 97 | /** 98 | * Limit maximum line length 99 | * 100 | * 0 is unlimited 101 | */ 102 | void tinyrl_limit_line_length(struct tinyrl *instance, unsigned length); 103 | 104 | #endif 105 | /** @} tinyrl_tinyrl */ 106 | -------------------------------------------------------------------------------- /utf8.c: -------------------------------------------------------------------------------- 1 | #include "utf8.h" 2 | #include 3 | 4 | enum { 5 | UTF8_GRAPHEME_BREAK_OTHER, 6 | UTF8_GRAPHEME_BREAK_CR, 7 | UTF8_GRAPHEME_BREAK_LF, 8 | UTF8_GRAPHEME_BREAK_CONTROL, 9 | UTF8_GRAPHEME_BREAK_EXTEND, 10 | UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR, 11 | UTF8_GRAPHEME_BREAK_PREPEND, 12 | UTF8_GRAPHEME_BREAK_SPACINGMARK, 13 | UTF8_GRAPHEME_BREAK_L, 14 | UTF8_GRAPHEME_BREAK_V, 15 | UTF8_GRAPHEME_BREAK_T, 16 | UTF8_GRAPHEME_BREAK_LV, 17 | UTF8_GRAPHEME_BREAK_LVT, 18 | }; 19 | 20 | #include "utf8data.c" 21 | 22 | static bool utf8_cont(char c) 23 | { 24 | return (c & 0xc0) == 0x80; 25 | } 26 | 27 | size_t utf8_char_len(char c) 28 | { 29 | if ((c & 0x80) == 0x00) 30 | return 1; 31 | if ((c & 0xe0) == 0xc0) 32 | return 2; 33 | if ((c & 0xf0) == 0xe0) 34 | return 3; 35 | if ((c & 0xf8) == 0xf0) 36 | return 4; 37 | return 0; 38 | } 39 | 40 | size_t utf8_char_decode(const char *s, size_t len, uint32_t *dst) 41 | { 42 | size_t char_len; 43 | uint32_t c; 44 | 45 | char_len = utf8_char_len(*s); 46 | if (char_len > len) 47 | goto err; 48 | 49 | switch (char_len) { 50 | case 1: 51 | c = *s; 52 | break; 53 | case 2: 54 | if (!utf8_cont(s[1])) 55 | goto err; 56 | c = ((s[0] & 0x1f) << 6) | (s[1] & 0x3f); 57 | if (c < 0x80) 58 | goto err; 59 | break; 60 | case 3: 61 | if (!utf8_cont(s[1]) || !utf8_cont(s[2])) 62 | goto err; 63 | c = ((s[0] & 0xf) << 12) | ((s[1] & 0x3f) << 6) | (s[2] & 0x3f); 64 | if (c < 0x800) 65 | goto err; 66 | if (c >= 0xd800 && c < 0xe000) 67 | goto err; 68 | break; 69 | case 4: 70 | if (!utf8_cont(s[1]) || !utf8_cont(s[2]) || !utf8_cont(s[3])) 71 | goto err; 72 | c = ((s[0] & 0x7) << 18) | ((s[1] & 0x3f) << 12) | ((s[2] & 0x3f) << 6) | (s[3] & 0x3f); 73 | if (c < 0x10000 || c >= 0x110000) 74 | goto err; 75 | break; 76 | default: 77 | goto err; 78 | } 79 | 80 | if (dst) 81 | *dst = c; 82 | return char_len; 83 | 84 | err: 85 | if (dst) 86 | *dst = 0; 87 | return 0; 88 | } 89 | 90 | size_t utf8_char_encode(uint32_t c, char *s, size_t len) 91 | { 92 | if (c < 0x80) { 93 | if (len < 1) 94 | return 0; 95 | s[0] = c; 96 | return 1; 97 | } else if (c < 0x800) { 98 | if (len < 2) 99 | return 0; 100 | s[0] = 0xC0 + (c >> 6); 101 | s[1] = 0x80 + (c & 0x3f); 102 | return 2; 103 | } else if (c < 0x10000) { 104 | if (len < 3) 105 | return 0; 106 | s[0] = 0xE0 + (c >> 12); 107 | s[1] = 0x80 + ((c >> 6) & 0x3f); 108 | s[2] = 0x80 + (c & 0x3f); 109 | return 3; 110 | } else if (c < 0x110000) { 111 | if (len < 4) 112 | return 0; 113 | s[0] = 0xF0 + (c >> 18); 114 | s[1] = 0x80 + ((c >> 12) & 0x3f); 115 | s[2] = 0x80 + ((c >> 6) & 0x3f); 116 | s[3] = 0x80 + (c & 0x3f); 117 | return 4; 118 | } else { 119 | return 0; 120 | } 121 | } 122 | 123 | size_t utf8_char_next(const char *s, size_t len, size_t point) 124 | { 125 | for (;;) { 126 | point++; 127 | if (point >= len) 128 | return len; 129 | if (!utf8_cont(s[point])) 130 | return point; 131 | } 132 | } 133 | 134 | size_t utf8_char_prev(const char *s, size_t len, size_t point) 135 | { 136 | for (;;) { 137 | if (point == 0) 138 | return point; 139 | point--; 140 | if (!utf8_cont(s[point])) 141 | return point; 142 | } 143 | } 144 | 145 | size_t utf8_char_width(const char *s, size_t len, size_t point) 146 | { 147 | uint32_t c; 148 | uint8_t i; 149 | 150 | utf8_char_decode(s + point, len - point, &c); 151 | if (c >= 0x110000) 152 | return 0; 153 | i = width0[c >> width0_shift]; 154 | i = width1[i][(c >> width1_shift) & width1_mask]; 155 | i = width2[i][(c >> width2_shift) & width2_mask]; 156 | return (i >> ((c & width3_mask) * width_val_shift)) & width_val_mask; 157 | } 158 | 159 | static int utf8_grapheme_boundary_class(uint32_t c) 160 | { 161 | uint8_t i; 162 | 163 | i = grapheme_break0[c >> grapheme_break0_shift]; 164 | i = grapheme_break1[i][(c >> grapheme_break1_shift) & grapheme_break1_mask]; 165 | i = grapheme_break2[i][(c >> grapheme_break2_shift) & grapheme_break2_mask]; 166 | return (i >> ((c & grapheme_break3_mask) * grapheme_break_val_shift)) & grapheme_break_val_mask; 167 | } 168 | 169 | static bool utf8_grapheme_break(uint32_t c1, uint32_t c2) 170 | { 171 | int b1, b2; 172 | 173 | b1 = utf8_grapheme_boundary_class(c1); 174 | b2 = utf8_grapheme_boundary_class(c2); 175 | 176 | /* GB3 */ 177 | if (b1 == UTF8_GRAPHEME_BREAK_CR && b2 == UTF8_GRAPHEME_BREAK_LF) 178 | return false; 179 | 180 | /* GB4 */ 181 | if (b1 == UTF8_GRAPHEME_BREAK_CR || b1 == UTF8_GRAPHEME_BREAK_LF || b1 == UTF8_GRAPHEME_BREAK_CONTROL) 182 | return true; 183 | 184 | /* GB5 */ 185 | if (b2 == UTF8_GRAPHEME_BREAK_CR || b2 == UTF8_GRAPHEME_BREAK_LF || b2 == UTF8_GRAPHEME_BREAK_CONTROL) 186 | return true; 187 | 188 | /* GB6 */ 189 | if (b1 == UTF8_GRAPHEME_BREAK_L && (b2 == UTF8_GRAPHEME_BREAK_L || b2 == UTF8_GRAPHEME_BREAK_V || b2 == UTF8_GRAPHEME_BREAK_LV || b2 == UTF8_GRAPHEME_BREAK_LVT)) 190 | return false; 191 | 192 | /* GB7 */ 193 | if ((b1 == UTF8_GRAPHEME_BREAK_LV || b1 == UTF8_GRAPHEME_BREAK_V) && (b2 == UTF8_GRAPHEME_BREAK_V || b2 == UTF8_GRAPHEME_BREAK_T)) 194 | return false; 195 | 196 | /* GB8 */ 197 | if ((b1 == UTF8_GRAPHEME_BREAK_LVT || b1 == UTF8_GRAPHEME_BREAK_T) && b2 == UTF8_GRAPHEME_BREAK_T) 198 | return false; 199 | 200 | /* GB8a */ 201 | if (b1 == UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR && b2 == UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR) 202 | return false; 203 | 204 | /* GB9 */ 205 | if (b2 == UTF8_GRAPHEME_BREAK_EXTEND) 206 | return false; 207 | 208 | /* GB9a */ 209 | if (b2 == UTF8_GRAPHEME_BREAK_SPACINGMARK) 210 | return false; 211 | 212 | /* GB9b */ 213 | if (b1 == UTF8_GRAPHEME_BREAK_PREPEND) 214 | return false; 215 | 216 | /* GB10 */ 217 | return true; 218 | } 219 | 220 | size_t utf8_grapheme_next(const char *s, size_t len, size_t point) 221 | { 222 | uint32_t c1, c2; 223 | 224 | utf8_char_decode(s + point, len - point, &c1); 225 | for (;;) { 226 | point = utf8_char_next(s, len, point); 227 | if (point >= len) 228 | return point; 229 | utf8_char_decode(s + point, len - point, &c2); 230 | if (utf8_grapheme_break(c1, c2)) 231 | return point; 232 | c1 = c2; 233 | } 234 | } 235 | 236 | size_t utf8_grapheme_prev(const char *s, size_t len, size_t point) 237 | { 238 | uint32_t c1, c2; 239 | size_t prev; 240 | 241 | point = utf8_char_prev(s, len, point); 242 | utf8_char_decode(s + point, len - point, &c2); 243 | for (;;) { 244 | if (point == 0) 245 | return point; 246 | prev = utf8_char_prev(s, len, point); 247 | utf8_char_decode(s + prev, len - prev, &c1); 248 | if (utf8_grapheme_break(c1, c2)) 249 | return point; 250 | point = prev; 251 | c2 = c1; 252 | } 253 | } 254 | 255 | size_t utf8_grapheme_width(const char *s, size_t len, size_t point, size_t *pnext) 256 | { 257 | size_t next; 258 | size_t width; 259 | size_t i; 260 | 261 | next = utf8_grapheme_next(s, len, point); 262 | if (pnext) *pnext = next; 263 | 264 | width = 0; 265 | for (i = point; i < next; i = utf8_char_next(s, len, i)) 266 | width += utf8_char_width(s, len, i); 267 | return width; 268 | } 269 | -------------------------------------------------------------------------------- /utf8.h: -------------------------------------------------------------------------------- 1 | #ifndef TINYRL_UTF8_H 2 | #define TINYRL_UTF8_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #ifndef DISABLE_UTF8 9 | size_t utf8_char_len(char c); 10 | size_t utf8_char_decode(const char *s, size_t len, uint32_t *dst); 11 | size_t utf8_char_encode(uint32_t c, char *s, size_t len); 12 | size_t utf8_char_next(const char *s, size_t len, size_t point); 13 | size_t utf8_char_prev(const char *s, size_t len, size_t point); 14 | size_t utf8_char_width(const char *s, size_t len, size_t point); 15 | size_t utf8_grapheme_next(const char *s, size_t len, size_t point); 16 | size_t utf8_grapheme_prev(const char *s, size_t len, size_t point); 17 | size_t utf8_grapheme_width(const char *s, size_t len, size_t point, size_t *pnext); 18 | #else 19 | static inline size_t utf8_char_len(char c) { 20 | return 1; 21 | } 22 | 23 | static inline size_t utf8_char_decode(const char *s, size_t len, uint32_t *dst) { 24 | if (dst) 25 | *dst = *s; 26 | return 1; 27 | } 28 | 29 | static inline size_t utf8_char_encode(uint32_t c, char *s, size_t len) { 30 | if (len < 1) 31 | return 0; 32 | *s = c; 33 | return 1; 34 | } 35 | 36 | static inline size_t utf8_char_next(const char *s, size_t len, size_t point) { 37 | if (point >= len) 38 | return len; 39 | point++; 40 | return point; 41 | } 42 | 43 | static inline size_t utf8_char_prev(const char *s, size_t len, size_t point) { 44 | if (point <= 0) 45 | return 0; 46 | point--; 47 | return point; 48 | } 49 | 50 | static inline size_t utf8_char_width(const char *s, size_t len, size_t point) { 51 | if (s[point] < 0x20) 52 | return 0; 53 | if (s[point] < 0x7f) 54 | return 1; 55 | return 0; 56 | } 57 | 58 | static inline size_t utf8_grapheme_next(const char *s, size_t len, size_t point) { 59 | return utf8_char_next(s, len, point); 60 | } 61 | 62 | static inline size_t utf8_grapheme_prev(const char *s, size_t len, size_t point) { 63 | return utf8_char_prev(s, len, point); 64 | } 65 | 66 | static inline size_t utf8_grapheme_width(const char *s, size_t len, size_t point, size_t *pnext) { 67 | if (pnext) 68 | *pnext = utf8_char_next(s, len, point); 69 | return utf8_char_width(s, len, point); 70 | } 71 | #endif 72 | 73 | #endif 74 | -------------------------------------------------------------------------------- /utf8data.c: -------------------------------------------------------------------------------- 1 | static const uint8_t width2[][8] = { 2 | { 3 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 4 | }, 5 | { 6 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 7 | }, 8 | { 9 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 10 | }, 11 | { 12 | 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 13 | }, 14 | { 15 | 0x15, 0x00, 0x50, 0x55, 0x55, 0x55, 0x55, 0x55, 16 | }, 17 | { 18 | 0x55, 0x55, 0x55, 0x55, 0x01, 0x00, 0x00, 0x00, 19 | }, 20 | { 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 22 | }, 23 | { 24 | 0x41, 0x10, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 25 | }, 26 | { 27 | 0x00, 0x50, 0x55, 0x55, 0x00, 0x00, 0x40, 0x54, 28 | }, 29 | { 30 | 0x55, 0x55, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | }, 32 | { 33 | 0x55, 0x55, 0x55, 0x55, 0x54, 0x55, 0x55, 0x55, 34 | }, 35 | { 36 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x05, 0x00, 0x10, 37 | }, 38 | { 39 | 0x00, 0x14, 0x04, 0x50, 0x55, 0x55, 0x55, 0x55, 40 | }, 41 | { 42 | 0x55, 0x55, 0x55, 0x15, 0x51, 0x55, 0x55, 0x55, 43 | }, 44 | { 45 | 0x55, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 46 | }, 47 | { 48 | 0x00, 0x00, 0x40, 0x55, 0x55, 0x55, 0x55, 0x55, 49 | }, 50 | { 51 | 0x55, 0x05, 0x00, 0x00, 0x54, 0x55, 0x55, 0x55, 52 | }, 53 | { 54 | 0x55, 0x55, 0x15, 0x00, 0x00, 0x55, 0x55, 0x55, 55 | }, 56 | { 57 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x05, 0x10, 0x00, 58 | }, 59 | { 60 | 0x00, 0x01, 0x01, 0x50, 0x55, 0x55, 0x55, 0x55, 61 | }, 62 | { 63 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x01, 0x55, 64 | }, 65 | { 66 | 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 67 | }, 68 | { 69 | 0x40, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 70 | }, 71 | { 72 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x54, 73 | }, 74 | { 75 | 0x01, 0x00, 0x54, 0x51, 0x01, 0x00, 0x55, 0x55, 76 | }, 77 | { 78 | 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 79 | }, 80 | { 81 | 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 82 | }, 83 | { 84 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x54, 85 | }, 86 | { 87 | 0x01, 0x54, 0x55, 0x51, 0x55, 0x55, 0x55, 0x55, 88 | }, 89 | { 90 | 0x41, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 91 | }, 92 | { 93 | 0x41, 0x15, 0x14, 0x50, 0x51, 0x55, 0x55, 0x55, 94 | }, 95 | { 96 | 0x55, 0x55, 0x55, 0x55, 0x50, 0x51, 0x55, 0x55, 97 | }, 98 | { 99 | 0x01, 0x10, 0x54, 0x51, 0x55, 0x55, 0x55, 0x55, 100 | }, 101 | { 102 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x14, 103 | }, 104 | { 105 | 0x01, 0x54, 0x55, 0x51, 0x55, 0x45, 0x55, 0x55, 106 | }, 107 | { 108 | 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 109 | }, 110 | { 111 | 0x54, 0x55, 0x55, 0x51, 0x55, 0x55, 0x55, 0x55, 112 | }, 113 | { 114 | 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 115 | }, 116 | { 117 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x05, 118 | }, 119 | { 120 | 0x54, 0x05, 0x04, 0x50, 0x55, 0x41, 0x55, 0x55, 121 | }, 122 | { 123 | 0x55, 0x45, 0x55, 0x50, 0x55, 0x55, 0x55, 0x55, 124 | }, 125 | { 126 | 0x55, 0x55, 0x45, 0x55, 0x05, 0x44, 0x55, 0x55, 127 | }, 128 | { 129 | 0x55, 0x55, 0x55, 0x55, 0x51, 0x00, 0x40, 0x55, 130 | }, 131 | { 132 | 0x55, 0x15, 0x00, 0x40, 0x55, 0x55, 0x55, 0x55, 133 | }, 134 | { 135 | 0x55, 0x55, 0x55, 0x55, 0x51, 0x00, 0x10, 0x54, 136 | }, 137 | { 138 | 0x55, 0x55, 0x00, 0x50, 0x55, 0x55, 0x55, 0x55, 139 | }, 140 | { 141 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, 0x55, 142 | }, 143 | { 144 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x11, 0x51, 0x55, 145 | }, 146 | { 147 | 0x55, 0x55, 0x55, 0x55, 0x01, 0x00, 0x00, 0x40, 148 | }, 149 | { 150 | 0x00, 0x04, 0x55, 0x01, 0x00, 0x00, 0x01, 0x00, 151 | }, 152 | { 153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 154 | }, 155 | { 156 | 0x55, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 157 | }, 158 | { 159 | 0x55, 0x55, 0x55, 0x01, 0x04, 0x00, 0x41, 0x41, 160 | }, 161 | { 162 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, 0x05, 163 | }, 164 | { 165 | 0x54, 0x55, 0x55, 0x55, 0x01, 0x54, 0x55, 0x55, 166 | }, 167 | { 168 | 0x45, 0x41, 0x55, 0x51, 0x55, 0x55, 0x55, 0x51, 169 | }, 170 | { 171 | 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 172 | }, 173 | { 174 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x01, 175 | }, 176 | { 177 | 0x55, 0x55, 0x55, 0x55, 0x05, 0x54, 0x55, 0x55, 178 | }, 179 | { 180 | 0x55, 0x55, 0x55, 0x55, 0x05, 0x55, 0x55, 0x55, 181 | }, 182 | { 183 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x10, 0x00, 0x50, 184 | }, 185 | { 186 | 0x55, 0x45, 0x01, 0x00, 0x00, 0x55, 0x55, 0x51, 187 | }, 188 | { 189 | 0x55, 0x55, 0x15, 0x40, 0x55, 0x55, 0x55, 0x55, 190 | }, 191 | { 192 | 0x55, 0x55, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 193 | }, 194 | { 195 | 0x40, 0x15, 0x54, 0x55, 0x45, 0x55, 0x01, 0x55, 196 | }, 197 | { 198 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0x14, 0x55, 199 | }, 200 | { 201 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x00, 0x40, 202 | }, 203 | { 204 | 0x44, 0x01, 0x00, 0x54, 0x15, 0x00, 0x00, 0x14, 205 | }, 206 | { 207 | 0x55, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x40, 208 | }, 209 | { 210 | 0x00, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 211 | }, 212 | { 213 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x04, 0x40, 0x54, 214 | }, 215 | { 216 | 0x50, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 217 | }, 218 | { 219 | 0x05, 0x50, 0x10, 0x50, 0x55, 0x55, 0x55, 0x55, 220 | }, 221 | { 222 | 0x55, 0x45, 0x50, 0x11, 0x50, 0x55, 0x55, 0x55, 223 | }, 224 | { 225 | 0x55, 0x55, 0x55, 0x00, 0x00, 0x05, 0x55, 0x55, 226 | }, 227 | { 228 | 0x55, 0x55, 0x55, 0x55, 0x40, 0x00, 0x00, 0x00, 229 | }, 230 | { 231 | 0x04, 0x00, 0x54, 0x51, 0x55, 0x54, 0x50, 0x55, 232 | }, 233 | { 234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x55, 0x00, 235 | }, 236 | { 237 | 0x55, 0x55, 0x15, 0x00, 0x55, 0x55, 0x55, 0x55, 238 | }, 239 | { 240 | 0x55, 0x55, 0x05, 0x40, 0x55, 0x55, 0x55, 0x55, 241 | }, 242 | { 243 | 0x00, 0x04, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 244 | }, 245 | { 246 | 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0x55, 0x55, 247 | }, 248 | { 249 | 0x55, 0x55, 0x69, 0x55, 0x55, 0x55, 0x55, 0x55, 250 | }, 251 | { 252 | 0x55, 0x55, 0x55, 0x15, 0x50, 0x55, 0x55, 0x55, 253 | }, 254 | { 255 | 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x9A, 0xAA, 256 | }, 257 | { 258 | 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 259 | }, 260 | { 261 | 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x5A, 0x55, 0x55, 262 | }, 263 | { 264 | 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0x55, 265 | }, 266 | { 267 | 0xAA, 0xAA, 0x0A, 0xA0, 0xAA, 0xAA, 0xAA, 0x6A, 268 | }, 269 | { 270 | 0xA9, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 271 | }, 272 | { 273 | 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x6A, 0x81, 0xAA, 274 | }, 275 | { 276 | 0x55, 0xA9, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 277 | }, 278 | { 279 | 0xAA, 0xAA, 0xAA, 0x5A, 0xA9, 0xAA, 0xAA, 0xAA, 280 | }, 281 | { 282 | 0xAA, 0xAA, 0xAA, 0x6A, 0xAA, 0xAA, 0xAA, 0xAA, 283 | }, 284 | { 285 | 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x6A, 0x55, 286 | }, 287 | { 288 | 0xAA, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 289 | }, 290 | { 291 | 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x6A, 292 | }, 293 | { 294 | 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 295 | }, 296 | { 297 | 0xAA, 0xAA, 0xAA, 0x56, 0xAA, 0xAA, 0xAA, 0xAA, 298 | }, 299 | { 300 | 0xAA, 0x6A, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 301 | }, 302 | { 303 | 0x55, 0x55, 0x55, 0x15, 0x40, 0x00, 0x00, 0x50, 304 | }, 305 | { 306 | 0x55, 0x55, 0x55, 0x55, 0x50, 0x55, 0x55, 0x55, 307 | }, 308 | { 309 | 0x45, 0x45, 0x15, 0x55, 0x55, 0x55, 0x55, 0x55, 310 | }, 311 | { 312 | 0x55, 0x41, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 313 | }, 314 | { 315 | 0x55, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 316 | }, 317 | { 318 | 0x00, 0x00, 0x00, 0x00, 0x50, 0x55, 0x55, 0x55, 319 | }, 320 | { 321 | 0x55, 0x05, 0x00, 0x50, 0x55, 0x55, 0x55, 0x55, 322 | }, 323 | { 324 | 0x55, 0x15, 0x00, 0x00, 0x50, 0x55, 0x55, 0x55, 325 | }, 326 | { 327 | 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x56, 328 | }, 329 | { 330 | 0x55, 0x55, 0x55, 0x55, 0x15, 0x05, 0x50, 0x54, 331 | }, 332 | { 333 | 0x55, 0x51, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 334 | }, 335 | { 336 | 0x55, 0x55, 0x01, 0x40, 0x41, 0x41, 0x55, 0x55, 337 | }, 338 | { 339 | 0x15, 0x55, 0x55, 0x54, 0x55, 0x55, 0x55, 0x55, 340 | }, 341 | { 342 | 0x55, 0x55, 0x55, 0x55, 0x04, 0x14, 0x54, 0x05, 343 | }, 344 | { 345 | 0x55, 0x55, 0x55, 0x50, 0x55, 0x45, 0x55, 0x55, 346 | }, 347 | { 348 | 0x55, 0x51, 0x54, 0x51, 0x55, 0x55, 0x55, 0x55, 349 | }, 350 | { 351 | 0xAA, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 352 | }, 353 | { 354 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 355 | }, 356 | { 357 | 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x5A, 0x55, 358 | }, 359 | { 360 | 0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA, 361 | }, 362 | { 363 | 0xAA, 0xAA, 0xAA, 0xAA, 0x6A, 0xAA, 0xAA, 0xAA, 364 | }, 365 | { 366 | 0xAA, 0x6A, 0xAA, 0x55, 0x55, 0x55, 0x55, 0x55, 367 | }, 368 | { 369 | 0x56, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 370 | }, 371 | { 372 | 0xAA, 0x6A, 0x55, 0x55, 0x55, 0x55, 0x01, 0x55, 373 | }, 374 | { 375 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x51, 376 | }, 377 | { 378 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x05, 0x40, 0x55, 379 | }, 380 | { 381 | 0x01, 0x41, 0x55, 0x00, 0x55, 0x55, 0x55, 0x55, 382 | }, 383 | { 384 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x40, 0x15, 385 | }, 386 | { 387 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x00, 0x00, 388 | }, 389 | { 390 | 0x00, 0x40, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 391 | }, 392 | { 393 | 0x55, 0x55, 0x55, 0x55, 0x15, 0x40, 0x41, 0x51, 394 | }, 395 | { 396 | 0x55, 0x15, 0x00, 0x01, 0x00, 0x54, 0x55, 0x55, 397 | }, 398 | { 399 | 0x55, 0x55, 0x55, 0x55, 0x15, 0x55, 0x55, 0x55, 400 | }, 401 | { 402 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x05, 0x00, 0x40, 403 | }, 404 | { 405 | 0x55, 0x55, 0x05, 0x54, 0x55, 0x55, 0x55, 0x55, 406 | }, 407 | { 408 | 0x55, 0x55, 0x55, 0x15, 0x50, 0x04, 0x55, 0x55, 409 | }, 410 | { 411 | 0x15, 0x00, 0x40, 0x55, 0x55, 0x55, 0x55, 0x55, 412 | }, 413 | { 414 | 0x55, 0x05, 0x00, 0x54, 0x00, 0x54, 0x55, 0x55, 415 | }, 416 | { 417 | 0x55, 0x55, 0x55, 0x55, 0x15, 0x00, 0x44, 0x15, 418 | }, 419 | { 420 | 0x04, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 421 | }, 422 | { 423 | 0x55, 0x55, 0x55, 0x55, 0x05, 0x50, 0x55, 0x10, 424 | }, 425 | { 426 | 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, 427 | }, 428 | { 429 | 0x55, 0x55, 0x55, 0x55, 0x15, 0x00, 0x40, 0x11, 430 | }, 431 | { 432 | 0x55, 0x55, 0x15, 0x51, 0x00, 0x10, 0x55, 0x55, 433 | }, 434 | { 435 | 0x05, 0x10, 0x00, 0x55, 0x55, 0x55, 0x55, 0x55, 436 | }, 437 | { 438 | 0x55, 0x55, 0x55, 0x55, 0x00, 0x54, 0x55, 0x55, 439 | }, 440 | { 441 | 0x55, 0x55, 0x55, 0x55, 0x00, 0x40, 0x55, 0x55, 442 | }, 443 | { 444 | 0x55, 0x55, 0x55, 0x15, 0x40, 0x55, 0x55, 0x55, 445 | }, 446 | { 447 | 0x5A, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 448 | }, 449 | { 450 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x41, 451 | }, 452 | { 453 | 0x55, 0x15, 0x50, 0x55, 0x15, 0x00, 0x00, 0x00, 454 | }, 455 | { 456 | 0x40, 0x01, 0x00, 0x55, 0x55, 0x55, 0x55, 0x55, 457 | }, 458 | { 459 | 0x55, 0x55, 0x05, 0x50, 0x55, 0x55, 0x55, 0x55, 460 | }, 461 | { 462 | 0x05, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 463 | }, 464 | { 465 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0x00, 466 | }, 467 | { 468 | 0x00, 0x00, 0x00, 0x54, 0x55, 0x51, 0x55, 0x55, 469 | }, 470 | { 471 | 0x55, 0x54, 0x55, 0x55, 0x55, 0x55, 0x15, 0x00, 472 | }, 473 | { 474 | 0x01, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 475 | }, 476 | { 477 | 0x6A, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 478 | }, 479 | { 480 | 0xAA, 0xAA, 0x56, 0x55, 0x5A, 0x55, 0x55, 0x55, 481 | }, 482 | { 483 | 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x5A, 484 | }, 485 | }; 486 | 487 | static const uint8_t width1[][32] = { 488 | { 489 | 0, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 490 | 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 3, 1, 1, 1, 1, 491 | }, 492 | { 493 | 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 1, 494 | 8, 1, 9, 10, 1, 1, 11, 12, 13, 14, 15, 1, 1, 16, 1, 17, 495 | }, 496 | { 497 | 18, 19, 20, 1, 1, 1, 1, 21, 22, 23, 24, 25, 26, 27, 28, 25, 498 | 29, 27, 30, 31, 29, 27, 32, 25, 26, 33, 34, 25, 35, 1, 36, 1, 499 | }, 500 | { 501 | 37, 38, 39, 25, 26, 33, 40, 25, 26, 1, 28, 25, 1, 1, 41, 1, 502 | 1, 42, 43, 1, 1, 44, 45, 1, 46, 47, 1, 48, 49, 50, 51, 1, 503 | }, 504 | { 505 | 1, 52, 53, 54, 55, 1, 1, 1, 56, 56, 56, 1, 1, 1, 1, 1, 506 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 57, 1, 1, 1, 1, 1, 507 | }, 508 | { 509 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 510 | 1, 1, 1, 1, 1, 1, 1, 1, 58, 58, 59, 59, 1, 60, 61, 1, 511 | }, 512 | { 513 | 62, 1, 1, 1, 1, 63, 1, 1, 1, 64, 1, 1, 1, 1, 1, 1, 514 | 65, 1, 66, 67, 1, 68, 1, 1, 69, 70, 35, 17, 71, 72, 1, 73, 515 | }, 516 | { 517 | 1, 74, 1, 1, 1, 1, 75, 76, 1, 1, 1, 1, 1, 1, 0, 77, 518 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 519 | }, 520 | { 521 | 78, 79, 1, 80, 1, 1, 14, 81, 1, 1, 1, 1, 1, 1, 1, 1, 522 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 82, 1, 1, 1, 1, 1, 1, 523 | }, 524 | { 525 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 526 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 527 | }, 528 | { 529 | 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1, 2, 1, 1, 1, 0, 530 | 1, 1, 1, 1, 84, 56, 56, 85, 56, 56, 56, 56, 56, 56, 86, 87, 531 | }, 532 | { 533 | 56, 88, 89, 56, 90, 56, 56, 56, 91, 92, 56, 56, 93, 94, 56, 95, 534 | 96, 56, 97, 56, 56, 56, 56, 96, 56, 56, 56, 56, 56, 56, 56, 56, 535 | }, 536 | { 537 | 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 538 | 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 539 | }, 540 | { 541 | 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 1, 1, 542 | 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 543 | }, 544 | { 545 | 56, 56, 56, 56, 98, 56, 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 546 | 1, 1, 1, 100, 38, 1, 1, 101, 1, 1, 1, 1, 1, 1, 1, 1, 547 | }, 548 | { 549 | 102, 103, 1, 1, 1, 1, 104, 105, 1, 106, 107, 108, 22, 109, 1, 110, 550 | 1, 111, 112, 27, 1, 113, 26, 114, 1, 1, 1, 1, 1, 1, 1, 115, 551 | }, 552 | { 553 | 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 554 | 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 116, 1, 1, 555 | }, 556 | { 557 | 1, 1, 1, 1, 1, 1, 1, 1, 56, 56, 56, 56, 56, 56, 56, 56, 558 | 56, 56, 56, 56, 56, 56, 56, 56, 117, 1, 1, 1, 1, 1, 1, 1, 559 | }, 560 | { 561 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 562 | 118, 119, 120, 121, 1, 1, 1, 2, 89, 56, 56, 122, 1, 1, 1, 123, 563 | }, 564 | { 565 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 124, 566 | 1, 1, 1, 1, 1, 1, 1, 37, 1, 1, 1, 125, 1, 1, 1, 1, 567 | }, 568 | { 569 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 570 | 126, 127, 1, 1, 1, 1, 1, 103, 1, 1, 1, 1, 1, 1, 1, 1, 571 | }, 572 | { 573 | 26, 128, 129, 2, 71, 130, 1, 1, 22, 131, 1, 132, 71, 133, 134, 1, 574 | 1, 135, 1, 1, 1, 1, 2, 136, 71, 27, 37, 137, 1, 1, 1, 1, 575 | }, 576 | { 577 | 1, 1, 1, 1, 1, 138, 139, 1, 1, 1, 1, 1, 1, 140, 141, 1, 578 | 1, 142, 37, 1, 1, 143, 1, 1, 57, 144, 1, 1, 1, 1, 1, 1, 579 | }, 580 | { 581 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 582 | 1, 1, 1, 1, 1, 1, 1, 145, 1, 146, 1, 1, 1, 1, 1, 1, 583 | }, 584 | { 585 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 586 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 147, 1, 1, 1, 587 | }, 588 | { 589 | 148, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 590 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 591 | }, 592 | { 593 | 1, 1, 1, 1, 149, 69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 594 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 595 | }, 596 | { 597 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 150, 151, 152, 1, 1, 598 | 1, 1, 153, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 599 | }, 600 | { 601 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 602 | 0, 154, 0, 155, 156, 157, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 603 | }, 604 | { 605 | 1, 1, 1, 1, 1, 1, 146, 1, 1, 1, 1, 1, 1, 1, 1, 1, 606 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 607 | }, 608 | { 609 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 610 | 158, 94, 159, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 611 | }, 612 | { 613 | 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 614 | 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 160, 615 | }, 616 | { 617 | 26, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 618 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 619 | }, 620 | }; 621 | 622 | static const uint8_t width0[] = { 623 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 12, 12, 624 | 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 625 | 12, 12, 12, 12, 12, 12, 12, 12, 12, 14, 15, 12, 12, 12, 12, 12, 626 | 12, 12, 12, 12, 12, 16, 9, 9, 9, 9, 9, 9, 9, 9, 17, 18, 627 | 19, 9, 20, 9, 21, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 628 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 9, 9, 9, 9, 629 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, 9, 9, 26, 630 | 9, 9, 9, 9, 27, 9, 28, 9, 9, 9, 29, 9, 30, 9, 9, 9, 631 | 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 632 | 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 633 | 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 634 | 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 31, 635 | 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 636 | 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 637 | 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 638 | 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 31, 639 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 640 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 641 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 642 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 643 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 644 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 645 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 646 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 647 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 648 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 649 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 650 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 651 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 652 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 653 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 654 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 655 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 656 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 657 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 658 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 659 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 660 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 661 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 662 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 663 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 664 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 665 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 666 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 667 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 668 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 669 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 670 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 671 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 672 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 673 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 674 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 675 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 676 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 677 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 678 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 679 | 32, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 680 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 681 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 682 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 683 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 684 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 685 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 686 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 687 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 688 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 689 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 690 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 691 | }; 692 | 693 | static const int width0_shift = 10; 694 | static const int width1_shift = 5; 695 | static const int width2_shift = 2; 696 | static const int width1_mask = 0x1f; 697 | static const int width2_mask = 0x7; 698 | static const int width3_mask = 0x3; 699 | static const int width_val_shift = 2; 700 | static const int width_val_mask = 0x3; 701 | 702 | static const uint8_t grapheme_break2[][8] = { 703 | { 704 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 705 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 706 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 707 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 708 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 709 | (UTF8_GRAPHEME_BREAK_LF << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 710 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CR << 4), 711 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 712 | }, 713 | { 714 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 715 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 716 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 717 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 718 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 719 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 720 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 721 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 722 | }, 723 | { 724 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 725 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 726 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 727 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 728 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 729 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 730 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 731 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 732 | }, 733 | { 734 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 735 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 736 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 737 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 738 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 739 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 740 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 741 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 742 | }, 743 | { 744 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 745 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 746 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 747 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 748 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 749 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 750 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 751 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 752 | }, 753 | { 754 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 755 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 756 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 757 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 758 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 759 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 760 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 761 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 762 | }, 763 | { 764 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 765 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 766 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 767 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 768 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 769 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 770 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 771 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 772 | }, 773 | { 774 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 775 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 776 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 777 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 778 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 779 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 780 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 781 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 782 | }, 783 | { 784 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 785 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 786 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 787 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 788 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 789 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 790 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 791 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 792 | }, 793 | { 794 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 795 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 796 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 797 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 798 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 799 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 800 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 801 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 802 | }, 803 | { 804 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 805 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 806 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 807 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 808 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 809 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 810 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 811 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 812 | }, 813 | { 814 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 815 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 816 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 817 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 818 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 819 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 820 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 821 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 822 | }, 823 | { 824 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 825 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 826 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 827 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 828 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 829 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 830 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 831 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 832 | }, 833 | { 834 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 835 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 836 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 837 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 838 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 839 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 840 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 841 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 842 | }, 843 | { 844 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 845 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 846 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 847 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 848 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 849 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 850 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 851 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 852 | }, 853 | { 854 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 855 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 856 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 857 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 858 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 859 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 860 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 861 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 862 | }, 863 | { 864 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 865 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 866 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 867 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 868 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 869 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 870 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 871 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 872 | }, 873 | { 874 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 875 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 876 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 877 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 878 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 879 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 880 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 881 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 882 | }, 883 | { 884 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 885 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 886 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 887 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 888 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 889 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 890 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 891 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 892 | }, 893 | { 894 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 895 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 896 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 897 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 898 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 899 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 900 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 901 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 902 | }, 903 | { 904 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 905 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 906 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 907 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 908 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 909 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 910 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 911 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 912 | }, 913 | { 914 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 915 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 916 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 917 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 918 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 919 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 920 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 921 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 922 | }, 923 | { 924 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 925 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 926 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 927 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 928 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 929 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 930 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 931 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 932 | }, 933 | { 934 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 935 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 936 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 937 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 938 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 939 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 940 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 941 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 942 | }, 943 | { 944 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 945 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 946 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 947 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 948 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 949 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 950 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 951 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 952 | }, 953 | { 954 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 955 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 956 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 957 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 958 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 959 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 960 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 961 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 962 | }, 963 | { 964 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 965 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 966 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 967 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 968 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 969 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 970 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 971 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 972 | }, 973 | { 974 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 975 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 976 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 977 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 978 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 979 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 980 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 981 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 982 | }, 983 | { 984 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 985 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 986 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 987 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 988 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 989 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 990 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 991 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 992 | }, 993 | { 994 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 995 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 996 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 997 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 998 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 999 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1000 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1001 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1002 | }, 1003 | { 1004 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1005 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1006 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1007 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1008 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1009 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1010 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1011 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1012 | }, 1013 | { 1014 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1015 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1016 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1017 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1018 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1019 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1020 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1021 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1022 | }, 1023 | { 1024 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1025 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1026 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1027 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1028 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1029 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1030 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1031 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1032 | }, 1033 | { 1034 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1035 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1036 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1037 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1038 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1039 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1040 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1041 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1042 | }, 1043 | { 1044 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1045 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1046 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1047 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1048 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1049 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1050 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1051 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1052 | }, 1053 | { 1054 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1055 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1056 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1057 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1058 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1059 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1060 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1061 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1062 | }, 1063 | { 1064 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1065 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1066 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1067 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1068 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1069 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1070 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1071 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1072 | }, 1073 | { 1074 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1075 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1076 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1077 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1078 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1079 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1080 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1081 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1082 | }, 1083 | { 1084 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1085 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1086 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1087 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1088 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1089 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1090 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1091 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1092 | }, 1093 | { 1094 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1095 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1096 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1097 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1098 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1099 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1100 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1101 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1102 | }, 1103 | { 1104 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1105 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1106 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1107 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1108 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1109 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1110 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1111 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1112 | }, 1113 | { 1114 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1115 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1116 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1117 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1118 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1119 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1120 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1121 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1122 | }, 1123 | { 1124 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1125 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1126 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1127 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1128 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1129 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1130 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1131 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1132 | }, 1133 | { 1134 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1135 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1136 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1137 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1138 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1139 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1140 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1141 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1142 | }, 1143 | { 1144 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1145 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1146 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1147 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1148 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1149 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1150 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1151 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1152 | }, 1153 | { 1154 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1155 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1156 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1157 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1158 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1159 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1160 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1161 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1162 | }, 1163 | { 1164 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1165 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1166 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1167 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1168 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1169 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1170 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1171 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1172 | }, 1173 | { 1174 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1175 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1176 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1177 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1178 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1179 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1180 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1181 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1182 | }, 1183 | { 1184 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1185 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1186 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1187 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1188 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1189 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1190 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1191 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1192 | }, 1193 | { 1194 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1195 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1196 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1197 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1198 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1199 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1200 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1201 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1202 | }, 1203 | { 1204 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1205 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1206 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1207 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1208 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1209 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1210 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1211 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1212 | }, 1213 | { 1214 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1215 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1216 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1217 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1218 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1219 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1220 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1221 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1222 | }, 1223 | { 1224 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1225 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1226 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1227 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1228 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1229 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1230 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1231 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1232 | }, 1233 | { 1234 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1235 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1236 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1237 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1238 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1239 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1240 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1241 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1242 | }, 1243 | { 1244 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1245 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1246 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1247 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1248 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1249 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1250 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1251 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1252 | }, 1253 | { 1254 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1255 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1256 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1257 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1258 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1259 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1260 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1261 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1262 | }, 1263 | { 1264 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1265 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1266 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1267 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1268 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1269 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1270 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1271 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1272 | }, 1273 | { 1274 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1275 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1276 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1277 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1278 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1279 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1280 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1281 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1282 | }, 1283 | { 1284 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1285 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1286 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1287 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1288 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1289 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1290 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1291 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1292 | }, 1293 | { 1294 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1295 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1296 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1297 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1298 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1299 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1300 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1301 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1302 | }, 1303 | { 1304 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1305 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1306 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1307 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1308 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1309 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1310 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1311 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1312 | }, 1313 | { 1314 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1315 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1316 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1317 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1318 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1319 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1320 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1321 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1322 | }, 1323 | { 1324 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1325 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1326 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1327 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1328 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1329 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1330 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1331 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1332 | }, 1333 | { 1334 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1335 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1336 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1337 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1338 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1339 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1340 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1341 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1342 | }, 1343 | { 1344 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1345 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1346 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1347 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1348 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1349 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1350 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1351 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1352 | }, 1353 | { 1354 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1355 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1356 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1357 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1358 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1359 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1360 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1361 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1362 | }, 1363 | { 1364 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1365 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1366 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1367 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1368 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1369 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1370 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1371 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1372 | }, 1373 | { 1374 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1375 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1376 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1377 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1378 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1379 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1380 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1381 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1382 | }, 1383 | { 1384 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1385 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1386 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1387 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1388 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1389 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1390 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1391 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1392 | }, 1393 | { 1394 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1395 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1396 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1397 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1398 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1399 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1400 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1401 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1402 | }, 1403 | { 1404 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1405 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1406 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1407 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1408 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1409 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1410 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1411 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1412 | }, 1413 | { 1414 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1415 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1416 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1417 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1418 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1419 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1420 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1421 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1422 | }, 1423 | { 1424 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1425 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1426 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1427 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 1428 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1429 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1430 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1431 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1432 | }, 1433 | { 1434 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1435 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1436 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1437 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1438 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1439 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1440 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1441 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 1442 | }, 1443 | { 1444 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1445 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1446 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1447 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1448 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1449 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1450 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1451 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1452 | }, 1453 | { 1454 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1455 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1456 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1457 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1458 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1459 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1460 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1461 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1462 | }, 1463 | { 1464 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1465 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1466 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1467 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1468 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1469 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1470 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1471 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1472 | }, 1473 | { 1474 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1475 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1476 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1477 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1478 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1479 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1480 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1481 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1482 | }, 1483 | { 1484 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1485 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1486 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1487 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1488 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1489 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1490 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1491 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1492 | }, 1493 | { 1494 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1495 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1496 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1497 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1498 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1499 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1500 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1501 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1502 | }, 1503 | { 1504 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1505 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1506 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1507 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1508 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1509 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1510 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1511 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1512 | }, 1513 | { 1514 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1515 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1516 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1517 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1518 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1519 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1520 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1521 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1522 | }, 1523 | { 1524 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1525 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1526 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1527 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1528 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1529 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1530 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1531 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1532 | }, 1533 | { 1534 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1535 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1536 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1537 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1538 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1539 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1540 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1541 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1542 | }, 1543 | { 1544 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1545 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1546 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1547 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1548 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1549 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1550 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1551 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1552 | }, 1553 | { 1554 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1555 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1556 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1557 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1558 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1559 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1560 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1561 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1562 | }, 1563 | { 1564 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1565 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1566 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1567 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1568 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1569 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1570 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1571 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1572 | }, 1573 | { 1574 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1575 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1576 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1577 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1578 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1579 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1580 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1581 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1582 | }, 1583 | { 1584 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1585 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1586 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1587 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1588 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1589 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1590 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1591 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1592 | }, 1593 | { 1594 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1595 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1596 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1597 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1598 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1599 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1600 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1601 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1602 | }, 1603 | { 1604 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1605 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1606 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1607 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1608 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1609 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1610 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1611 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1612 | }, 1613 | { 1614 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1615 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1616 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1617 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1618 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1619 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1620 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1621 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1622 | }, 1623 | { 1624 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1625 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1626 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1627 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1628 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1629 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1630 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1631 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1632 | }, 1633 | { 1634 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1635 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1636 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1637 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1638 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1639 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1640 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1641 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1642 | }, 1643 | { 1644 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1645 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1646 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1647 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1648 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1649 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1650 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1651 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1652 | }, 1653 | { 1654 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1655 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1656 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1657 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1658 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1659 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1660 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1661 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1662 | }, 1663 | { 1664 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1665 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1666 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1667 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1668 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1669 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1670 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1671 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1672 | }, 1673 | { 1674 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1675 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1676 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1677 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1678 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1679 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1680 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1681 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1682 | }, 1683 | { 1684 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1685 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1686 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1687 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1688 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1689 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1690 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1691 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1692 | }, 1693 | { 1694 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1695 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1696 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1697 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1698 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1699 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1700 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1701 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1702 | }, 1703 | { 1704 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1705 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1706 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1707 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1708 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1709 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 1710 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1711 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 1712 | }, 1713 | { 1714 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1715 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1716 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1717 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1718 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 1719 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 1720 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 1721 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1722 | }, 1723 | { 1724 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1725 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1726 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1727 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1728 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1729 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1730 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1731 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1732 | }, 1733 | { 1734 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1735 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1736 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1737 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1738 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1739 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1740 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1741 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1742 | }, 1743 | { 1744 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1745 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1746 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1747 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1748 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1749 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1750 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1751 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1752 | }, 1753 | { 1754 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1755 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1756 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1757 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1758 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1759 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1760 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1761 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1762 | }, 1763 | { 1764 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1765 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1766 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1767 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1768 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1769 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1770 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1771 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1772 | }, 1773 | { 1774 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1775 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1776 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1777 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1778 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1779 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1780 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1781 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1782 | }, 1783 | { 1784 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1785 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1786 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1787 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1788 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1789 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1790 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1791 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1792 | }, 1793 | { 1794 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1795 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1796 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1797 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1798 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1799 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1800 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1801 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1802 | }, 1803 | { 1804 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1805 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1806 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1807 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1808 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1809 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1810 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1811 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1812 | }, 1813 | { 1814 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1815 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1816 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1817 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1818 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1819 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1820 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1821 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1822 | }, 1823 | { 1824 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1825 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1826 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1827 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1828 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1829 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1830 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1831 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1832 | }, 1833 | { 1834 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1835 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1836 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1837 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1838 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1839 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1840 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1841 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1842 | }, 1843 | { 1844 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1845 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1846 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1847 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1848 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1849 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_L << 4), 1850 | (UTF8_GRAPHEME_BREAK_L << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1851 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1852 | }, 1853 | { 1854 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1855 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1856 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1857 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1858 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1859 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1860 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1861 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1862 | }, 1863 | { 1864 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1865 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1866 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1867 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1868 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1869 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1870 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1871 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1872 | }, 1873 | { 1874 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1875 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1876 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1877 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1878 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1879 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1880 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1881 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1882 | }, 1883 | { 1884 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1885 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1886 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1887 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1888 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1889 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1890 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1891 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1892 | }, 1893 | { 1894 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1895 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1896 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1897 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1898 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1899 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1900 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1901 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1902 | }, 1903 | { 1904 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1905 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1906 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1907 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1908 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1909 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1910 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1911 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1912 | }, 1913 | { 1914 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1915 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1916 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1917 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1918 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1919 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1920 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1921 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1922 | }, 1923 | { 1924 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1925 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1926 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1927 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1928 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1929 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1930 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1931 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1932 | }, 1933 | { 1934 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1935 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1936 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1937 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1938 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1939 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1940 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1941 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1942 | }, 1943 | { 1944 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1945 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1946 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1947 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1948 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1949 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1950 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1951 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1952 | }, 1953 | { 1954 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1955 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1956 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1957 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1958 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 1959 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1960 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 1961 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 1962 | }, 1963 | { 1964 | (UTF8_GRAPHEME_BREAK_LV << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1965 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1966 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1967 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1968 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1969 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1970 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1971 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1972 | }, 1973 | { 1974 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1975 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1976 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1977 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1978 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1979 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1980 | (UTF8_GRAPHEME_BREAK_LV << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1981 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1982 | }, 1983 | { 1984 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1985 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1986 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1987 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1988 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1989 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1990 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1991 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1992 | }, 1993 | { 1994 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1995 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1996 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1997 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1998 | (UTF8_GRAPHEME_BREAK_LV << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 1999 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2000 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2001 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2002 | }, 2003 | { 2004 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2005 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2006 | (UTF8_GRAPHEME_BREAK_LV << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2007 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2008 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2009 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2010 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2011 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2012 | }, 2013 | { 2014 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2015 | (UTF8_GRAPHEME_BREAK_LVT << 0) | (UTF8_GRAPHEME_BREAK_LVT << 4), 2016 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2017 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2018 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2019 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2020 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2021 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2022 | }, 2023 | { 2024 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 2025 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 2026 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_V << 4), 2027 | (UTF8_GRAPHEME_BREAK_V << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2028 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2029 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 2030 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 2031 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 2032 | }, 2033 | { 2034 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 2035 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 2036 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 2037 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 2038 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 2039 | (UTF8_GRAPHEME_BREAK_T << 0) | (UTF8_GRAPHEME_BREAK_T << 4), 2040 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2041 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2042 | }, 2043 | { 2044 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2045 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2046 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2047 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2048 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2049 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2050 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2051 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2052 | }, 2053 | { 2054 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2055 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2056 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2057 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2058 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2059 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2060 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2061 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2062 | }, 2063 | { 2064 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2065 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2066 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2067 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2068 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2069 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2070 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2071 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2072 | }, 2073 | { 2074 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2075 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2076 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2077 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2078 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2079 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2080 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2081 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2082 | }, 2083 | { 2084 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2085 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2086 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2087 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2088 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2089 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2090 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2091 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2092 | }, 2093 | { 2094 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2095 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2096 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2097 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2098 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2099 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2100 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2101 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2102 | }, 2103 | { 2104 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2105 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2106 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2107 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2108 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2109 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2110 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2111 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2112 | }, 2113 | { 2114 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2115 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2116 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2117 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2118 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2119 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2120 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2121 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2122 | }, 2123 | { 2124 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2125 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2126 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2127 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2128 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2129 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2130 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2131 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2132 | }, 2133 | { 2134 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2135 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2136 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2137 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2138 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2139 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2140 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2141 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2142 | }, 2143 | { 2144 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2145 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2146 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2147 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2148 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2149 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2150 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2151 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2152 | }, 2153 | { 2154 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2155 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2156 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2157 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2158 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2159 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2160 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2161 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2162 | }, 2163 | { 2164 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2165 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2166 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2167 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2168 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2169 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2170 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2171 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2172 | }, 2173 | { 2174 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2175 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2176 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2177 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2178 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2179 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2180 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2181 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2182 | }, 2183 | { 2184 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2185 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2186 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2187 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2188 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2189 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2190 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2191 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2192 | }, 2193 | { 2194 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2195 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2196 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2197 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2198 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2199 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2200 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2201 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2202 | }, 2203 | { 2204 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2205 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2206 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2207 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2208 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2209 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2210 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2211 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2212 | }, 2213 | { 2214 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2215 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2216 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2217 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2218 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2219 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2220 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2221 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2222 | }, 2223 | { 2224 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2225 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2226 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2227 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2228 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2229 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2230 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2231 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2232 | }, 2233 | { 2234 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2235 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2236 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2237 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2238 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2239 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2240 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2241 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2242 | }, 2243 | { 2244 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2245 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2246 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2247 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2248 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2249 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2250 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2251 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2252 | }, 2253 | { 2254 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2255 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2256 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2257 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2258 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2259 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2260 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2261 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2262 | }, 2263 | { 2264 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2265 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2266 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2267 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2268 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2269 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2270 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2271 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2272 | }, 2273 | { 2274 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2275 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2276 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2277 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2278 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2279 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2280 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2281 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2282 | }, 2283 | { 2284 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2285 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2286 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2287 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2288 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2289 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2290 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2291 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2292 | }, 2293 | { 2294 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2295 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2296 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2297 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2298 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2299 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2300 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2301 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2302 | }, 2303 | { 2304 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2305 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2306 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2307 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2308 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2309 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2310 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2311 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2312 | }, 2313 | { 2314 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2315 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2316 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2317 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2318 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2319 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2320 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2321 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2322 | }, 2323 | { 2324 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2325 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2326 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2327 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2328 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2329 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2330 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2331 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2332 | }, 2333 | { 2334 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2335 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2336 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2337 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2338 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2339 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2340 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2341 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2342 | }, 2343 | { 2344 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2345 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2346 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2347 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2348 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2349 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2350 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2351 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2352 | }, 2353 | { 2354 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2355 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2356 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2357 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2358 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2359 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2360 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2361 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2362 | }, 2363 | { 2364 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2365 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2366 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2367 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2368 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2369 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2370 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2371 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2372 | }, 2373 | { 2374 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2375 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2376 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2377 | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2378 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2379 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2380 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_SPACINGMARK << 4), 2381 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2382 | }, 2383 | { 2384 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2385 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2386 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2387 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2388 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_CONTROL << 4), 2389 | (UTF8_GRAPHEME_BREAK_CONTROL << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2390 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2391 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2392 | }, 2393 | { 2394 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2395 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2396 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2397 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2398 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2399 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2400 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2401 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2402 | }, 2403 | { 2404 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2405 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2406 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2407 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2408 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2409 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2410 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2411 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2412 | }, 2413 | { 2414 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2415 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2416 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2417 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2418 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2419 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2420 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2421 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_EXTEND << 4), 2422 | }, 2423 | { 2424 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2425 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2426 | (UTF8_GRAPHEME_BREAK_EXTEND << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2427 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2428 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2429 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2430 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2431 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2432 | }, 2433 | { 2434 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2435 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2436 | (UTF8_GRAPHEME_BREAK_OTHER << 0) | (UTF8_GRAPHEME_BREAK_OTHER << 4), 2437 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2438 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2439 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2440 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2441 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2442 | }, 2443 | { 2444 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2445 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2446 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2447 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2448 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2449 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2450 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2451 | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 0) | (UTF8_GRAPHEME_BREAK_REGIONAL_INDICATOR << 4), 2452 | }, 2453 | }; 2454 | 2455 | static const uint8_t grapheme_break1[][64] = { 2456 | { 2457 | 0, 1, 2, 2, 2, 2, 2, 3, 1, 1, 4, 2, 2, 2, 2, 2, 2458 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2459 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2460 | 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2461 | }, 2462 | { 2463 | 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2464 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 5, 8, 9, 2, 2, 2, 2465 | 10, 11, 2, 2, 12, 5, 2, 13, 2, 2, 2, 2, 2, 14, 15, 2, 2466 | 3, 16, 2, 5, 17, 2, 2, 2, 2, 2, 18, 13, 2, 2, 12, 19, 2467 | }, 2468 | { 2469 | 2, 20, 21, 2, 2, 22, 2, 2, 2, 2, 2, 2, 2, 2, 23, 5, 2470 | 24, 2, 2, 25, 26, 27, 28, 2, 29, 2, 2, 30, 31, 32, 28, 2, 2471 | 33, 2, 2, 34, 35, 16, 2, 36, 33, 2, 2, 34, 37, 2, 28, 2, 2472 | 29, 2, 2, 38, 31, 39, 28, 2, 40, 2, 2, 41, 42, 32, 2, 2, 2473 | }, 2474 | { 2475 | 43, 2, 2, 44, 45, 46, 28, 2, 29, 2, 2, 47, 48, 46, 28, 2, 2476 | 29, 2, 2, 41, 49, 32, 28, 2, 50, 2, 2, 2, 51, 52, 2, 50, 2477 | 2, 2, 2, 53, 54, 2, 2, 2, 2, 2, 2, 55, 56, 2, 2, 2, 2478 | 2, 57, 2, 58, 2, 2, 2, 59, 60, 61, 5, 62, 63, 2, 2, 2, 2479 | }, 2480 | { 2481 | 2, 2, 64, 65, 2, 66, 13, 67, 68, 69, 2, 2, 2, 2, 2, 2, 2482 | 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 72, 73, 73, 73, 73, 73, 2483 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2484 | 2, 2, 2, 2, 2, 64, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2485 | }, 2486 | { 2487 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2488 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2489 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2490 | 2, 74, 2, 74, 2, 28, 2, 28, 2, 2, 2, 75, 76, 77, 2, 2, 2491 | }, 2492 | { 2493 | 78, 2, 2, 2, 2, 2, 2, 2, 2, 2, 79, 2, 2, 2, 2, 2, 2494 | 2, 2, 80, 81, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2495 | 2, 82, 2, 2, 2, 83, 84, 85, 2, 2, 2, 86, 2, 2, 2, 2, 2496 | 87, 2, 2, 88, 89, 2, 12, 19, 90, 2, 91, 2, 2, 2, 92, 93, 2497 | }, 2498 | { 2499 | 2, 2, 94, 95, 2, 2, 2, 2, 2, 2, 2, 2, 2, 96, 97, 98, 2500 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 99, 2501 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2502 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2503 | }, 2504 | { 2505 | 100, 2, 101, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 5, 5, 13, 2506 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2507 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2508 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2509 | }, 2510 | { 2511 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2512 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2513 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2514 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2515 | }, 2516 | { 2517 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 102, 103, 2518 | 2, 2, 2, 2, 2, 2, 2, 102, 2, 2, 2, 2, 2, 2, 5, 5, 2519 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2520 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2521 | }, 2522 | { 2523 | 2, 2, 104, 2, 2, 2, 2, 2, 2, 105, 2, 2, 2, 2, 2, 2, 2524 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2525 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2526 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2527 | }, 2528 | { 2529 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2530 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2531 | 2, 2, 2, 2, 2, 2, 102, 106, 2, 44, 2, 2, 2, 2, 2, 103, 2532 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2533 | }, 2534 | { 2535 | 107, 2, 108, 2, 2, 2, 2, 2, 109, 2, 2, 110, 111, 2, 5, 103, 2536 | 2, 2, 112, 2, 113, 93, 70, 114, 24, 2, 2, 115, 116, 2, 117, 2, 2537 | 2, 2, 118, 119, 120, 2, 2, 121, 2, 2, 2, 122, 16, 2, 123, 124, 2538 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 125, 2, 2539 | }, 2540 | { 2541 | 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 2542 | 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 2543 | 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 2544 | 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 2545 | }, 2546 | { 2547 | 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 2548 | 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 2549 | 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 2550 | 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 2551 | }, 2552 | { 2553 | 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 2554 | 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 2555 | 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 2556 | 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 2557 | }, 2558 | { 2559 | 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 2560 | 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 2561 | 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 2562 | 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 2563 | }, 2564 | { 2565 | 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 2566 | 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 2567 | 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 2568 | 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 2569 | }, 2570 | { 2571 | 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 2572 | 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 2573 | 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 2574 | 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 2575 | }, 2576 | { 2577 | 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 2578 | 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 2579 | 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 2580 | 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 2581 | }, 2582 | { 2583 | 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 2584 | 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 2585 | 126, 127, 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 130, 128, 126, 127, 2586 | 128, 129, 128, 130, 128, 126, 127, 128, 129, 128, 131, 71, 132, 73, 73, 133, 2587 | }, 2588 | { 2589 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2590 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2591 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2592 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2593 | }, 2594 | { 2595 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2596 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2597 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2598 | 2, 134, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2599 | }, 2600 | { 2601 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2602 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2603 | 5, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2604 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 44, 2, 2, 2, 2, 2, 135, 2605 | }, 2606 | { 2607 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2608 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 69, 2609 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, 2610 | 2, 2, 2, 2, 2, 2, 2, 136, 2, 2, 2, 2, 2, 2, 2, 2, 2611 | }, 2612 | { 2613 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2614 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2615 | 137, 2, 2, 138, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 46, 2, 2616 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2617 | }, 2618 | { 2619 | 139, 2, 2, 140, 141, 2, 2, 102, 90, 2, 2, 142, 2, 2, 2, 2, 2620 | 143, 2, 144, 145, 2, 2, 2, 146, 90, 2, 2, 147, 148, 2, 2, 2, 2621 | 2, 2, 149, 150, 2, 2, 2, 2, 2, 2, 2, 2, 2, 102, 151, 2, 2622 | 93, 2, 2, 30, 152, 32, 153, 145, 2, 2, 2, 2, 2, 2, 2, 2, 2623 | }, 2624 | { 2625 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 154, 155, 2, 2, 2, 2626 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 102, 156, 13, 157, 2, 2, 2627 | 2, 2, 2, 158, 13, 2, 2, 2, 2, 2, 159, 160, 2, 2, 2, 2, 2628 | 2, 64, 161, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2629 | }, 2630 | { 2631 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2632 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2633 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 145, 2634 | 2, 2, 2, 141, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2635 | }, 2636 | { 2637 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2638 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2639 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2640 | 2, 2, 2, 2, 2, 162, 163, 164, 102, 143, 2, 2, 2, 2, 2, 2, 2641 | }, 2642 | { 2643 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 165, 166, 2, 2, 2, 2, 2, 2644 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2645 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2646 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2647 | }, 2648 | { 2649 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2650 | 2, 2, 2, 2, 2, 2, 167, 168, 169, 2, 170, 2, 2, 2, 2, 2, 2651 | 2, 2, 2, 2, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2652 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2653 | }, 2654 | { 2655 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2656 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2657 | 5, 5, 5, 171, 5, 5, 62, 117, 172, 12, 7, 2, 2, 2, 2, 2, 2658 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2659 | }, 2660 | { 2661 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 141, 2, 2, 2662 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2663 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2664 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2665 | }, 2666 | { 2667 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2668 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 173, 174, 2669 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2670 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2671 | }, 2672 | { 2673 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2674 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 2675 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2676 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2677 | }, 2678 | }; 2679 | 2680 | static const uint8_t grapheme_break0[] = { 2681 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 9, 9, 9, 2682 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2683 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 13, 14, 15, 16, 17, 18, 2684 | 19, 20, 14, 15, 16, 21, 22, 22, 9, 9, 9, 9, 9, 9, 23, 24, 2685 | 25, 9, 26, 9, 27, 28, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2686 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 29, 30, 9, 9, 9, 9, 2687 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 31, 2688 | 9, 9, 9, 9, 32, 9, 33, 9, 9, 9, 34, 9, 35, 9, 9, 9, 2689 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2690 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2691 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2692 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2693 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2694 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2695 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2696 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2697 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2698 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2699 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2700 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2701 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2702 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2703 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2704 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2705 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2706 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2707 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2708 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2709 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2710 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2711 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2712 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2713 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2714 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2715 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2716 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2717 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2718 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2719 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2720 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2721 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2722 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2723 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2724 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2725 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2726 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2727 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2728 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2729 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2730 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2731 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2732 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2733 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2734 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2735 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2736 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2737 | 36, 22, 22, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2738 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2739 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2740 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2741 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2742 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2743 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2744 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2745 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2746 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2747 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2748 | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2749 | }; 2750 | 2751 | static const int grapheme_break0_shift = 10; 2752 | static const int grapheme_break1_shift = 4; 2753 | static const int grapheme_break2_shift = 1; 2754 | static const int grapheme_break1_mask = 0x3f; 2755 | static const int grapheme_break2_mask = 0x7; 2756 | static const int grapheme_break3_mask = 0x1; 2757 | static const int grapheme_break_val_shift = 4; 2758 | static const int grapheme_break_val_mask = 0xf; 2759 | -------------------------------------------------------------------------------- /utf8data.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # Build multi-stage lookup tables for character widths and grapheme break properties 3 | import re 4 | 5 | CatCode = dict() 6 | with open('UnicodeData.txt') as f: 7 | for line in f.readlines(): 8 | tokens = line.split(';') 9 | if len(tokens) < 3: 10 | continue 11 | 12 | c = int(tokens[0], 16) 13 | if re.match('^<.*, First>$', tokens[1]): 14 | start = c 15 | elif re.match('^<.*, Last>$', tokens[1]): 16 | end = c 17 | for c in range(start, end + 1): 18 | CatCode[c] = tokens[2] 19 | else: 20 | CatCode[c] = tokens[2] 21 | 22 | EastAsianWidth = dict() 23 | with open('EastAsianWidth.txt') as f: 24 | for line in f.readlines(): 25 | tokens = line.split('#')[0].split(';') 26 | if len(tokens) < 2: 27 | continue 28 | 29 | rangetokens = tokens[0].split('..') 30 | start = int(rangetokens[0], 16) 31 | if len(rangetokens) > 1: 32 | end = int(rangetokens[1], 16) 33 | else: 34 | end = start 35 | 36 | width = tokens[1].strip() 37 | for c in range(start, end + 1): 38 | if width=='W' or width=='F': 39 | EastAsianWidth[c] = 2 40 | elif width=='Na' or width=='H': 41 | EastAsianWidth[c] = 1 42 | 43 | GraphemeBreak = dict() 44 | with open('GraphemeBreakProperty.txt') as f: 45 | for line in f.readlines(): 46 | tokens = line.split('#')[0].split(';') 47 | if len(tokens) < 2: 48 | continue 49 | 50 | rangetokens = tokens[0].split('..') 51 | start = int(rangetokens[0], 16) 52 | if len(rangetokens) > 1: 53 | end = int(rangetokens[1], 16) 54 | else: 55 | end = start 56 | 57 | b = tokens[1].strip() 58 | for c in range(start, end + 1): 59 | GraphemeBreak[c] = b 60 | 61 | def width(c): 62 | if c == 0x00ad: 63 | return 1 64 | cat = CatCode.get(c, 'Cn') 65 | if cat == 'Mn' or cat == 'Me' or cat == 'Cc' or cat == 'Cf': 66 | return 0 67 | return EastAsianWidth.get(c, 1) 68 | 69 | def grapheme_break(c): 70 | return GraphemeBreak.get(c, 'Other') 71 | 72 | class LookupTable(object): 73 | def __init__(self, label, row_len, val_bits, display_val): 74 | self.label = label 75 | self.row_len = row_len 76 | self.val_len = 1 << val_bits 77 | self.val_shift = 8 / self.val_len 78 | self.display_val = display_val 79 | self.blocks = [] 80 | 81 | def append(self, block): 82 | try: 83 | index = self.blocks.index(block) 84 | except ValueError: 85 | index = len(self.blocks) 86 | self.blocks.append(block) 87 | return index 88 | 89 | def display(self): 90 | print 'static const uint8_t %s[][%d] = {' % (self.label, len(self.blocks[0])/self.val_len) 91 | for block in self.blocks: 92 | self.display_block(block) 93 | print '};\n' 94 | 95 | def display_block(self, block): 96 | print '\t{' 97 | for i in range(0, len(block), self.row_len): 98 | self.display_row(block[i:i+self.row_len]) 99 | print '\t},' 100 | 101 | def display_row(self, row): 102 | vals = [] 103 | for i in range(0, len(row), self.val_len): 104 | vals.append(self.display_val(row[i:i+self.val_len], self.val_shift)) 105 | print '\t\t' + ', '.join(vals) + ',' 106 | 107 | def display_index(val, val_shift): 108 | return '%d' % sum([v << (i * val_shift) for i,v in enumerate(val)]) 109 | 110 | def display_width(val, val_shift): 111 | return '0x%02X' % sum([v << (i * val_shift) for i,v in enumerate(val)]) 112 | 113 | def display_grapheme_break(val, val_shift): 114 | return ' | '.join(['(UTF8_GRAPHEME_BREAK_' + v.upper() + ' << ' + str(i * val_shift) + ')' for i,v in enumerate(val)]) 115 | 116 | def display_index_table(label, val): 117 | print 'static const uint8_t ' + label + '[] = {' 118 | for i in range(0, len(val), 0x10): 119 | print '\t' + ', '.join(map(str, val[i:i+0x10])) + ',' 120 | print '};\n' 121 | 122 | def table(label, f, display, row_len, count, block1_bits, block2_bits, val_bits): 123 | val_shift = 8 / (1 << val_bits) 124 | table1 = LookupTable(label + str(1), 16, 0, display_index) 125 | table2 = LookupTable(label + str(2), row_len, val_bits, display) 126 | block1_len = 1 << (block1_bits + block2_bits + val_bits); 127 | block2_len = 1 << (block2_bits + val_bits); 128 | indextable = [] 129 | for i in range(0, count, block1_len): 130 | block1 = [] 131 | for j in range(0, block1_len, block2_len): 132 | block2 = [] 133 | for c in range(block2_len): 134 | block2.append(f(i + j + c)) 135 | block1.append(table2.append(block2)) 136 | indextable.append(table1.append(block1)) 137 | 138 | table2.display() 139 | table1.display() 140 | display_index_table(label + str(0), indextable) 141 | print 'static const int %s0_shift = %d;' % (label, block1_bits + block2_bits + val_bits) 142 | print 'static const int %s1_shift = %d;' % (label, block2_bits + val_bits) 143 | print 'static const int %s2_shift = %d;' % (label, val_bits) 144 | print 'static const int %s1_mask = 0x%x;' % (label, (1 << block1_bits) - 1) 145 | print 'static const int %s2_mask = 0x%x;' % (label, (1 << block2_bits) - 1) 146 | print 'static const int %s3_mask = 0x%x;' % (label, (1 << val_bits) - 1) 147 | print 'static const int %s_val_shift = %d;' % (label, val_shift) 148 | print 'static const int %s_val_mask = 0x%x;' % (label, (1 << val_shift) - 1) 149 | 150 | table('width', width, display_width, 32, 0x110000, 5, 3, 2) 151 | print '' 152 | table('grapheme_break', grapheme_break, display_grapheme_break, 2, 0x110000, 6, 3, 1) 153 | --------------------------------------------------------------------------------