├── .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 |
--------------------------------------------------------------------------------