diff options
| author | Felix (xq) Queißner <git@mq32.de> | 2020-06-09 18:27:38 +0200 |
|---|---|---|
| committer | Felix (xq) Queißner <git@mq32.de> | 2020-06-09 18:27:38 +0200 |
| commit | de8fd9328e9deb0d1ec596d7486686ea3cb688c2 (patch) | |
| tree | 9c25d7568dee522c1d2ed7b6d238d1dad54163f6 /lib/cmark/src | |
| parent | 661ddc244793102ee0720871c4edcd64f80bc744 (diff) | |
| download | kristall-de8fd9328e9deb0d1ec596d7486686ea3cb688c2.tar.gz | |
Includes cmark markdown parser library.
Diffstat (limited to 'lib/cmark/src')
41 files changed, 29278 insertions, 0 deletions
diff --git a/lib/cmark/src/CMakeLists.txt b/lib/cmark/src/CMakeLists.txt new file mode 100644 index 0000000..48ddd01 --- /dev/null +++ b/lib/cmark/src/CMakeLists.txt @@ -0,0 +1,174 @@ +if(${CMAKE_VERSION} VERSION_GREATER "3.3") + cmake_policy(SET CMP0063 NEW) +endif() + +set(LIBRARY "libcmark") +set(STATICLIBRARY "libcmark_static") +set(HEADERS + cmark.h + parser.h + buffer.h + node.h + iterator.h + chunk.h + references.h + utf8.h + scanners.h + inlines.h + houdini.h + cmark_ctype.h + render.h + ) +set(LIBRARY_SOURCES + cmark.c + node.c + iterator.c + blocks.c + inlines.c + scanners.c + scanners.re + utf8.c + buffer.c + references.c + render.c + man.c + xml.c + html.c + commonmark.c + latex.c + houdini_href_e.c + houdini_html_e.c + houdini_html_u.c + cmark_ctype.c + ${HEADERS} + ) + +set(PROGRAM "cmark") +set(PROGRAM_SOURCES main.c) + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmark_version.h.in + ${CMAKE_CURRENT_BINARY_DIR}/cmark_version.h) + +include (GenerateExportHeader) + +add_executable(${PROGRAM} ${PROGRAM_SOURCES}) + +if (CMARK_STATIC) + target_link_libraries(${PROGRAM} ${STATICLIBRARY}) + # Disable the PUBLIC declarations when compiling the executable: + set_target_properties(${PROGRAM} PROPERTIES + COMPILE_FLAGS -DCMARK_STATIC_DEFINE) +elseif (CMARK_SHARED) + target_link_libraries(${PROGRAM} ${LIBRARY}) +endif() + +# -fvisibility=hidden +set(CMAKE_C_VISIBILITY_PRESET hidden) +set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) + +if (CMARK_SHARED) + add_library(${LIBRARY} SHARED ${LIBRARY_SOURCES}) + set_target_properties(${LIBRARY} PROPERTIES + MACOSX_RPATH TRUE + OUTPUT_NAME "cmark" + # Avoid name clash between PROGRAM and LIBRARY pdb files. + PDB_NAME cmark_dll + # Include minor version and patch level in soname for now. + SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} + VERSION ${PROJECT_VERSION}) + target_include_directories(${LIBRARY} INTERFACE + $<INSTALL_INTERFACE:include> + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>) + + generate_export_header(${LIBRARY} + BASE_NAME ${PROJECT_NAME}) + + list(APPEND CMARK_INSTALL ${LIBRARY}) +endif() + +if (CMARK_STATIC) + add_library(${STATICLIBRARY} STATIC ${LIBRARY_SOURCES}) + set_target_properties(${STATICLIBRARY} PROPERTIES + COMPILE_FLAGS -DCMARK_STATIC_DEFINE + OUTPUT_NAME "cmark$<$<BOOL:${MSVC}>:_static>" + POSITION_INDEPENDENT_CODE ON + VERSION ${PROJECT_VERSION}) + target_include_directories(${STATICLIBRARY} INTERFACE + $<INSTALL_INTERFACE:include> + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>) + + if (NOT CMARK_SHARED) + generate_export_header(${STATICLIBRARY} + BASE_NAME ${PROJECT_NAME}) + endif() + + list(APPEND CMARK_INSTALL ${STATICLIBRARY}) +endif() + +if (MSVC) + set_property(TARGET ${PROGRAM} + APPEND PROPERTY LINK_FLAGS /INCREMENTAL:NO) +endif(MSVC) + +if(NOT MSVC OR CMAKE_HOST_SYSTEM_NAME STREQUAL Windows) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON) + include(InstallRequiredSystemLibraries) +endif() + +set(libdir lib${LIB_SUFFIX}) + +install(TARGETS ${PROGRAM} ${CMARK_INSTALL} + EXPORT cmark + RUNTIME DESTINATION bin + LIBRARY DESTINATION ${libdir} + ARCHIVE DESTINATION ${libdir} + ) + +if(CMARK_SHARED OR CMARK_STATIC) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libcmark.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/libcmark.pc @ONLY) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libcmark.pc + DESTINATION ${libdir}/pkgconfig) + + install(FILES + cmark.h + ${CMAKE_CURRENT_BINARY_DIR}/cmark_export.h + ${CMAKE_CURRENT_BINARY_DIR}/cmark_version.h + DESTINATION include + ) + + install(EXPORT cmark DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake) + + set(CMARK_TARGETS_FILE ${CMAKE_CURRENT_BINARY_DIR}/cmarkTargets.cmake) + configure_file(cmarkConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/cmarkConfig.cmake) + export(TARGETS ${CMARK_INSTALL} FILE ${CMARK_TARGETS_FILE}) +endif() + +# Feature tests +include(CheckIncludeFile) +include(CheckCSourceCompiles) +CHECK_INCLUDE_FILE(stdbool.h HAVE_STDBOOL_H) +CHECK_C_SOURCE_COMPILES( + "int main() { __builtin_expect(0,0); return 0; }" + HAVE___BUILTIN_EXPECT) +CHECK_C_SOURCE_COMPILES(" + int f(void) __attribute__ (()); + int main() { return 0; } +" HAVE___ATTRIBUTE__) + +CONFIGURE_FILE( + ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/config.h) + +if(CMARK_LIB_FUZZER) + add_executable(cmark-fuzz ../test/cmark-fuzz.c ${LIBRARY_SOURCES}) + target_link_libraries(cmark-fuzz "${CMAKE_LIB_FUZZER_PATH}") + + # cmark is written in C but the libFuzzer runtime is written in C++ which + # needs to link against the C++ runtime. + set_target_properties(cmark-fuzz PROPERTIES + LINKER_LANGUAGE CXX) +endif() diff --git a/lib/cmark/src/blocks.c b/lib/cmark/src/blocks.c new file mode 100644 index 0000000..a979b3a --- /dev/null +++ b/lib/cmark/src/blocks.c @@ -0,0 +1,1300 @@ +/** + * Block parsing implementation. + * + * For a high-level overview of the block parsing process, + * see http://spec.commonmark.org/0.24/#phase-1-block-structure + */ + +#include <stdlib.h> +#include <assert.h> +#include <stdio.h> + +#include "cmark_ctype.h" +#include "config.h" +#include "parser.h" +#include "cmark.h" +#include "node.h" +#include "references.h" +#include "utf8.h" +#include "scanners.h" +#include "inlines.h" +#include "houdini.h" +#include "buffer.h" +#include "chunk.h" + +#define CODE_INDENT 4 +#define TAB_STOP 4 + +#ifndef MIN +#define MIN(x, y) ((x < y) ? x : y) +#endif + +#define peek_at(i, n) (i)->data[n] + +static bool S_last_line_blank(const cmark_node *node) { + return (node->flags & CMARK_NODE__LAST_LINE_BLANK) != 0; +} + +static bool S_last_line_checked(const cmark_node *node) { + return (node->flags & CMARK_NODE__LAST_LINE_CHECKED) != 0; +} + +static CMARK_INLINE cmark_node_type S_type(const cmark_node *node) { + return (cmark_node_type)node->type; +} + +static void S_set_last_line_blank(cmark_node *node, bool is_blank) { + if (is_blank) + node->flags |= CMARK_NODE__LAST_LINE_BLANK; + else + node->flags &= ~CMARK_NODE__LAST_LINE_BLANK; +} + +static void S_set_last_line_checked(cmark_node *node) { + node->flags |= CMARK_NODE__LAST_LINE_CHECKED; +} + +static CMARK_INLINE bool S_is_line_end_char(char c) { + return (c == '\n' || c == '\r'); +} + +static CMARK_INLINE bool S_is_space_or_tab(char c) { + return (c == ' ' || c == '\t'); +} + +static void S_parser_feed(cmark_parser *parser, const unsigned char *buffer, + size_t len, bool eof); + +static void S_process_line(cmark_parser *parser, const unsigned char *buffer, + bufsize_t bytes); + +static cmark_node *make_block(cmark_mem *mem, cmark_node_type tag, + int start_line, int start_column) { + cmark_node *e; + + e = (cmark_node *)mem->calloc(1, sizeof(*e)); + e->mem = mem; + e->type = (uint16_t)tag; + e->flags = CMARK_NODE__OPEN; + e->start_line = start_line; + e->start_column = start_column; + e->end_line = start_line; + + return e; +} + +// Create a root document node. +static cmark_node *make_document(cmark_mem *mem) { + cmark_node *e = make_block(mem, CMARK_NODE_DOCUMENT, 1, 1); + return e; +} + +cmark_parser *cmark_parser_new_with_mem(int options, cmark_mem *mem) { + cmark_parser *parser = (cmark_parser *)mem->calloc(1, sizeof(cmark_parser)); + parser->mem = mem; + + cmark_node *document = make_document(mem); + + cmark_strbuf_init(mem, &parser->curline, 256); + cmark_strbuf_init(mem, &parser->linebuf, 0); + cmark_strbuf_init(mem, &parser->content, 0); + + parser->refmap = cmark_reference_map_new(mem); + parser->root = document; + parser->current = document; + parser->line_number = 0; + parser->offset = 0; + parser->column = 0; + parser->first_nonspace = 0; + parser->first_nonspace_column = 0; + parser->thematic_break_kill_pos = 0; + parser->indent = 0; + parser->blank = false; + parser->partially_consumed_tab = false; + parser->last_line_length = 0; + parser->options = options; + parser->last_buffer_ended_with_cr = false; + + return parser; +} + +cmark_parser *cmark_parser_new(int options) { + extern cmark_mem DEFAULT_MEM_ALLOCATOR; + return cmark_parser_new_with_mem(options, &DEFAULT_MEM_ALLOCATOR); +} + +void cmark_parser_free(cmark_parser *parser) { + cmark_mem *mem = parser->mem; + cmark_strbuf_free(&parser->curline); + cmark_strbuf_free(&parser->linebuf); + cmark_reference_map_free(parser->refmap); + mem->free(parser); +} + +static cmark_node *finalize(cmark_parser *parser, cmark_node *b); + +// Returns true if line has only space characters, else false. +static bool is_blank(cmark_strbuf *s, bufsize_t offset) { + while (offset < s->size) { + switch (s->ptr[offset]) { + case '\r': + case '\n': + return true; + case ' ': + offset++; + break; + case '\t': + offset++; + break; + default: + return false; + } + } + + return true; +} + +static CMARK_INLINE bool can_contain(cmark_node_type parent_type, + cmark_node_type child_type) { + return (parent_type == CMARK_NODE_DOCUMENT || + parent_type == CMARK_NODE_BLOCK_QUOTE || + parent_type == CMARK_NODE_ITEM || + (parent_type == CMARK_NODE_LIST && child_type == CMARK_NODE_ITEM)); +} + +static CMARK_INLINE bool accepts_lines(cmark_node_type block_type) { + return (block_type == CMARK_NODE_PARAGRAPH || + block_type == CMARK_NODE_HEADING || + block_type == CMARK_NODE_CODE_BLOCK); +} + +static CMARK_INLINE bool contains_inlines(cmark_node_type block_type) { + return (block_type == CMARK_NODE_PARAGRAPH || + block_type == CMARK_NODE_HEADING); +} + +static void add_line(cmark_chunk *ch, cmark_parser *parser) { + int chars_to_tab; + int i; + if (parser->partially_consumed_tab) { + parser->offset += 1; // skip over tab + // add space characters: + chars_to_tab = TAB_STOP - (parser->column % TAB_STOP); + for (i = 0; i < chars_to_tab; i++) { + cmark_strbuf_putc(&parser->content, ' '); + } + } + cmark_strbuf_put(&parser->content, ch->data + parser->offset, + ch->len - parser->offset); +} + +static void remove_trailing_blank_lines(cmark_strbuf *ln) { + bufsize_t i; + unsigned char c; + + for (i = ln->size - 1; i >= 0; --i) { + c = ln->ptr[i]; + + if (c != ' ' && c != '\t' && !S_is_line_end_char(c)) + break; + } + + if (i < 0) { + cmark_strbuf_clear(ln); + return; + } + + for (; i < ln->size; ++i) { + c = ln->ptr[i]; + + if (!S_is_line_end_char(c)) + continue; + + cmark_strbuf_truncate(ln, i); + break; + } +} + +// Check to see if a node ends with a blank line, descending +// if needed into lists and sublists. +static bool S_ends_with_blank_line(cmark_node *node) { + if (S_last_line_checked(node)) { + return(S_last_line_blank(node)); + } else if ((S_type(node) == CMARK_NODE_LIST || + S_type(node) == CMARK_NODE_ITEM) && node->last_child) { + S_set_last_line_checked(node); + return(S_ends_with_blank_line(node->last_child)); + } else { + S_set_last_line_checked(node); + return (S_last_line_blank(node)); + } +} + +// returns true if content remains after link defs are resolved. +static bool resolve_reference_link_definitions(cmark_parser *parser) { + bufsize_t pos; + cmark_strbuf *node_content = &parser->content; + cmark_chunk chunk = {node_content->ptr, node_content->size}; + while (chunk.len && chunk.data[0] == '[' && + (pos = cmark_parse_reference_inline(parser->mem, &chunk, + parser->refmap))) { + + chunk.data += pos; + chunk.len -= pos; + } + cmark_strbuf_drop(node_content, (node_content->size - chunk.len)); + return !is_blank(node_content, 0); +} + +static cmark_node *finalize(cmark_parser *parser, cmark_node *b) { + bufsize_t pos; + cmark_node *item; + cmark_node *subitem; + cmark_node *parent; + bool has_content; + + parent = b->parent; + assert(b->flags & + CMARK_NODE__OPEN); // shouldn't call finalize on closed blocks + b->flags &= ~CMARK_NODE__OPEN; + + if (parser->curline.size == 0) { + // end of input - line number has not been incremented + b->end_line = parser->line_number; + b->end_column = parser->last_line_length; + } else if (S_type(b) == CMARK_NODE_DOCUMENT || + (S_type(b) == CMARK_NODE_CODE_BLOCK && b->as.code.fenced) || + (S_type(b) == CMARK_NODE_HEADING && b->as.heading.setext)) { + b->end_line = parser->line_number; + b->end_column = parser->curline.size; + if (b->end_column && parser->curline.ptr[b->end_column - 1] == '\n') + b->end_column -= 1; + if (b->end_column && parser->curline.ptr[b->end_column - 1] == '\r') + b->end_column -= 1; + } else { + b->end_line = parser->line_number - 1; + b->end_column = parser->last_line_length; + } + + cmark_strbuf *node_content = &parser->content; + + switch (S_type(b)) { + case CMARK_NODE_PARAGRAPH: + { + has_content = resolve_reference_link_definitions(parser); + if (!has_content) { + // remove blank node (former reference def) + cmark_node_free(b); + } else { + b->len = node_content->size; + b->data = cmark_strbuf_detach(node_content); + } + break; + } + + case CMARK_NODE_CODE_BLOCK: + if (!b->as.code.fenced) { // indented code + remove_trailing_blank_lines(node_content); + cmark_strbuf_putc(node_content, '\n'); + } else { + // first line of contents becomes info + for (pos = 0; pos < node_content->size; ++pos) { + if (S_is_line_end_char(node_content->ptr[pos])) + break; + } + assert(pos < node_content->size); + + if (pos == 0) { + b->as.code.info = NULL; + } else { + cmark_strbuf tmp = CMARK_BUF_INIT(parser->mem); + houdini_unescape_html_f(&tmp, node_content->ptr, pos); + cmark_strbuf_trim(&tmp); + cmark_strbuf_unescape(&tmp); + b->as.code.info = cmark_strbuf_detach(&tmp); + } + + if (node_content->ptr[pos] == '\r') + pos += 1; + if (node_content->ptr[pos] == '\n') + pos += 1; + cmark_strbuf_drop(node_content, pos); + } + b->len = node_content->size; + b->data = cmark_strbuf_detach(node_content); + break; + + case CMARK_NODE_HEADING: + case CMARK_NODE_HTML_BLOCK: + b->len = node_content->size; + b->data = cmark_strbuf_detach(node_content); + break; + + case CMARK_NODE_LIST: // determine tight/loose status + b->as.list.tight = true; // tight by default + item = b->first_child; + + while (item) { + // check for non-final non-empty list item ending with blank line: + if (S_last_line_blank(item) && item->next) { + b->as.list.tight = false; + break; + } + // recurse into children of list item, to see if there are + // spaces between them: + subitem = item->first_child; + while (subitem) { + if ((item->next || subitem->next) && + S_ends_with_blank_line(subitem)) { + b->as.list.tight = false; + break; + } + subitem = subitem->next; + } + if (!(b->as.list.tight)) { + break; + } + item = item->next; + } + + break; + + default: + break; + } + + return parent; +} + +// Add a node as child of another. Return pointer to child. +static cmark_node *add_child(cmark_parser *parser, cmark_node *parent, + cmark_node_type block_type, int start_column) { + assert(parent); + + // if 'parent' isn't the kind of node that can accept this child, + // then back up til we hit a node that can. + while (!can_contain(S_type(parent), block_type)) { + parent = finalize(parser, parent); + } + + cmark_node *child = + make_block(parser->mem, block_type, parser->line_number, start_column); + child->parent = parent; + + if (parent->last_child) { + parent->last_child->next = child; + child->prev = parent->last_child; + } else { + parent->first_child = child; + child->prev = NULL; + } + parent->last_child = child; + return child; +} + +// Walk through node and all children, recursively, parsing +// string content into inline content where appropriate. +static void process_inlines(cmark_mem *mem, cmark_node *root, + cmark_reference_map *refmap, int options) { + cmark_iter *iter = cmark_iter_new(root); + cmark_node *cur; + cmark_event_type ev_type; + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + if (ev_type == CMARK_EVENT_ENTER) { + if (contains_inlines(S_type(cur))) { + cmark_parse_inlines(mem, cur, refmap, options); + mem->free(cur->data); + cur->data = NULL; + cur->len = 0; + } + } + } + + cmark_iter_free(iter); +} + +// Attempts to parse a list item marker (bullet or enumerated). +// On success, returns length of the marker, and populates +// data with the details. On failure, returns 0. +static bufsize_t parse_list_marker(cmark_mem *mem, cmark_chunk *input, + bufsize_t pos, bool interrupts_paragraph, + cmark_list **dataptr) { + unsigned char c; + bufsize_t startpos; + cmark_list *data; + bufsize_t i; + + startpos = pos; + c = peek_at(input, pos); + + if (c == '*' || c == '-' || c == '+') { + pos++; + if (!cmark_isspace(peek_at(input, pos))) { + return 0; + } + + if (interrupts_paragraph) { + i = pos; + // require non-blank content after list marker: + while (S_is_space_or_tab(peek_at(input, i))) { + i++; + } + if (peek_at(input, i) == '\n') { + return 0; + } + } + + data = (cmark_list *)mem->calloc(1, sizeof(*data)); + data->marker_offset = 0; // will be adjusted later + data->list_type = CMARK_BULLET_LIST; + data->bullet_char = c; + data->start = 0; + data->delimiter = CMARK_NO_DELIM; + data->tight = false; + } else if (cmark_isdigit(c)) { + int start = 0; + int digits = 0; + + do { + start = (10 * start) + (peek_at(input, pos) - '0'); + pos++; + digits++; + // We limit to 9 digits to avoid overflow, + // assuming max int is 2^31 - 1 + // This also seems to be the limit for 'start' in some browsers. + } while (digits < 9 && cmark_isdigit(peek_at(input, pos))); + + if (interrupts_paragraph && start != 1) { + return 0; + } + c = peek_at(input, pos); + if (c == '.' || c == ')') { + pos++; + if (!cmark_isspace(peek_at(input, pos))) { + return 0; + } + if (interrupts_paragraph) { + // require non-blank content after list marker: + i = pos; + while (S_is_space_or_tab(peek_at(input, i))) { + i++; + } + if (S_is_line_end_char(peek_at(input, i))) { + return 0; + } + } + + data = (cmark_list *)mem->calloc(1, sizeof(*data)); + data->marker_offset = 0; // will be adjusted later + data->list_type = CMARK_ORDERED_LIST; + data->bullet_char = 0; + data->start = start; + data->delimiter = (c == '.' ? CMARK_PERIOD_DELIM : CMARK_PAREN_DELIM); + data->tight = false; + } else { + return 0; + } + } else { + return 0; + } + + *dataptr = data; + return (pos - startpos); +} + +// Return 1 if list item belongs in list, else 0. +static int lists_match(cmark_list *list_data, cmark_list *item_data) { + return (list_data->list_type == item_data->list_type && + list_data->delimiter == item_data->delimiter && + // list_data->marker_offset == item_data.marker_offset && + list_data->bullet_char == item_data->bullet_char); +} + +static cmark_node *finalize_document(cmark_parser *parser) { + while (parser->current != parser->root) { + parser->current = finalize(parser, parser->current); + } + + finalize(parser, parser->root); + process_inlines(parser->mem, parser->root, parser->refmap, parser->options); + + cmark_strbuf_free(&parser->content); + + return parser->root; +} + +cmark_node *cmark_parse_file(FILE *f, int options) { + unsigned char buffer[4096]; + cmark_parser *parser = cmark_parser_new(options); + size_t bytes; + cmark_node *document; + + while ((bytes = fread(buffer, 1, sizeof(buffer), f)) > 0) { + bool eof = bytes < sizeof(buffer); + S_parser_feed(parser, buffer, bytes, eof); + if (eof) { + break; + } + } + + document = cmark_parser_finish(parser); + cmark_parser_free(parser); + return document; +} + +cmark_node *cmark_parse_document(const char *buffer, size_t len, int options) { + cmark_parser *parser = cmark_parser_new(options); + cmark_node *document; + + S_parser_feed(parser, (const unsigned char *)buffer, len, true); + + document = cmark_parser_finish(parser); + cmark_parser_free(parser); + return document; +} + +void cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len) { + S_parser_feed(parser, (const unsigned char *)buffer, len, false); +} + +static void S_parser_feed(cmark_parser *parser, const unsigned char *buffer, + size_t len, bool eof) { + const unsigned char *end = buffer + len; + static const uint8_t repl[] = {239, 191, 189}; + + // Skip UTF-8 BOM if present; see #334 + if (parser->line_number == 0 && parser->column == 0 && len >= 3 && + *buffer == 0xEF && *(buffer + 1) == 0xBB && + *(buffer + 2) == 0xBF) { + buffer += 3; + } else if (parser->last_buffer_ended_with_cr && *buffer == '\n') { + // skip NL if last buffer ended with CR ; see #117 + buffer++; + } + + parser->last_buffer_ended_with_cr = false; + while (buffer < end) { + const unsigned char *eol; + bufsize_t chunk_len; + bool process = false; + for (eol = buffer; eol < end; ++eol) { + if (S_is_line_end_char(*eol)) { + process = true; + break; + } + if (*eol == '\0' && eol < end) { + break; + } + } + if (eol >= end && eof) { + process = true; + } + + chunk_len = (eol - buffer); + if (process) { + if (parser->linebuf.size > 0) { + cmark_strbuf_put(&parser->linebuf, buffer, chunk_len); + S_process_line(parser, parser->linebuf.ptr, parser->linebuf.size); + cmark_strbuf_clear(&parser->linebuf); + } else { + S_process_line(parser, buffer, chunk_len); + } + } else { + if (eol < end && *eol == '\0') { + // omit NULL byte + cmark_strbuf_put(&parser->linebuf, buffer, chunk_len); + // add replacement character + cmark_strbuf_put(&parser->linebuf, repl, 3); + } else { + cmark_strbuf_put(&parser->linebuf, buffer, chunk_len); + } + } + + buffer += chunk_len; + if (buffer < end) { + if (*buffer == '\0') { + // skip over NULL + buffer++; + } else { + // skip over line ending characters + if (*buffer == '\r') { + buffer++; + if (buffer == end) + parser->last_buffer_ended_with_cr = true; + } + if (buffer < end && *buffer == '\n') + buffer++; + } + } + } +} + +static void chop_trailing_hashtags(cmark_chunk *ch) { + bufsize_t n, orig_n; + + cmark_chunk_rtrim(ch); + orig_n = n = ch->len - 1; + + // if string ends in space followed by #s, remove these: + while (n >= 0 && peek_at(ch, n) == '#') + n--; + + // Check for a space before the final #s: + if (n != orig_n && n >= 0 && S_is_space_or_tab(peek_at(ch, n))) { + ch->len = n; + cmark_chunk_rtrim(ch); + } +} + +// Check for thematic break. On failure, return 0 and update +// thematic_break_kill_pos with the index at which the +// parse fails. On success, return length of match. +// "...three or more hyphens, asterisks, +// or underscores on a line by themselves. If you wish, you may use +// spaces between the hyphens or asterisks." +static int S_scan_thematic_break(cmark_parser *parser, cmark_chunk *input, + bufsize_t offset) { + bufsize_t i; + char c; + char nextc = '\0'; + int count; + i = offset; + c = peek_at(input, i); + if (!(c == '*' || c == '_' || c == '-')) { + parser->thematic_break_kill_pos = i; + return 0; + } + count = 1; + while ((nextc = peek_at(input, ++i))) { + if (nextc == c) { + count++; + } else if (nextc != ' ' && nextc != '\t') { + break; + } + } + if (count >= 3 && (nextc == '\r' || nextc == '\n')) { + return (i - offset) + 1; + } else { + parser->thematic_break_kill_pos = i; + return 0; + } +} + +// Find first nonspace character from current offset, setting +// parser->first_nonspace, parser->first_nonspace_column, +// parser->indent, and parser->blank. Does not advance parser->offset. +static void S_find_first_nonspace(cmark_parser *parser, cmark_chunk *input) { + char c; + int chars_to_tab = TAB_STOP - (parser->column % TAB_STOP); + + if (parser->first_nonspace <= parser->offset) { + parser->first_nonspace = parser->offset; + parser->first_nonspace_column = parser->column; + while ((c = peek_at(input, parser->first_nonspace))) { + if (c == ' ') { + parser->first_nonspace += 1; + parser->first_nonspace_column += 1; + chars_to_tab = chars_to_tab - 1; + if (chars_to_tab == 0) { + chars_to_tab = TAB_STOP; + } + } else if (c == '\t') { + parser->first_nonspace += 1; + parser->first_nonspace_column += chars_to_tab; + chars_to_tab = TAB_STOP; + } else { + break; + } + } + } + + parser->indent = parser->first_nonspace_column - parser->column; + parser->blank = S_is_line_end_char(peek_at(input, parser->first_nonspace)); +} + +// Advance parser->offset and parser->column. parser->offset is the +// byte position in input; parser->column is a virtual column number +// that takes into account tabs. (Multibyte characters are not taken +// into account, because the Markdown line prefixes we are interested in +// analyzing are entirely ASCII.) The count parameter indicates +// how far to advance the offset. If columns is true, then count +// indicates a number of columns; otherwise, a number of bytes. +// If advancing a certain number of columns partially consumes +// a tab character, parser->partially_consumed_tab is set to true. +static void S_advance_offset(cmark_parser *parser, cmark_chunk *input, + bufsize_t count, bool columns) { + char c; + int chars_to_tab; + int chars_to_advance; + while (count > 0 && (c = peek_at(input, parser->offset))) { + if (c == '\t') { + chars_to_tab = TAB_STOP - (parser->column % TAB_STOP); + if (columns) { + parser->partially_consumed_tab = chars_to_tab > count; + chars_to_advance = MIN(count, chars_to_tab); + parser->column += chars_to_advance; + parser->offset += (parser->partially_consumed_tab ? 0 : 1); + count -= chars_to_advance; + } else { + parser->partially_consumed_tab = false; + parser->column += chars_to_tab; + parser->offset += 1; + count -= 1; + } + } else { + parser->partially_consumed_tab = false; + parser->offset += 1; + parser->column += 1; // assume ascii; block starts are ascii + count -= 1; + } + } +} + +static bool S_last_child_is_open(cmark_node *container) { + return container->last_child && + (container->last_child->flags & CMARK_NODE__OPEN); +} + +static bool parse_block_quote_prefix(cmark_parser *parser, cmark_chunk *input) { + bool res = false; + bufsize_t matched = 0; + + matched = + parser->indent <= 3 && peek_at(input, parser->first_nonspace) == '>'; + if (matched) { + + S_advance_offset(parser, input, parser->indent + 1, true); + + if (S_is_space_or_tab(peek_at(input, parser->offset))) { + S_advance_offset(parser, input, 1, true); + } + + res = true; + } + return res; +} + +static bool parse_node_item_prefix(cmark_parser *parser, cmark_chunk *input, + cmark_node *container) { + bool res = false; + + if (parser->indent >= + container->as.list.marker_offset + container->as.list.padding) { + S_advance_offset(parser, input, container->as.list.marker_offset + + container->as.list.padding, + true); + res = true; + } else if (parser->blank && container->first_child != NULL) { + // if container->first_child is NULL, then the opening line + // of the list item was blank after the list marker; in this + // case, we are done with the list item. + S_advance_offset(parser, input, parser->first_nonspace - parser->offset, + false); + res = true; + } + return res; +} + +static bool parse_code_block_prefix(cmark_parser *parser, cmark_chunk *input, + cmark_node *container, + bool *should_continue) { + bool res = false; + + if (!container->as.code.fenced) { // indented + if (parser->indent >= CODE_INDENT) { + S_advance_offset(parser, input, CODE_INDENT, true); + res = true; + } else if (parser->blank) { + S_advance_offset(parser, input, parser->first_nonspace - parser->offset, + false); + res = true; + } + } else { // fenced + bufsize_t matched = 0; + + if (parser->indent <= 3 && (peek_at(input, parser->first_nonspace) == + container->as.code.fence_char)) { + matched = scan_close_code_fence(input, parser->first_nonspace); + } + + if (matched >= container->as.code.fence_length) { + // closing fence - and since we're at + // the end of a line, we can stop processing it: + *should_continue = false; + S_advance_offset(parser, input, matched, false); + parser->current = finalize(parser, container); + } else { + // skip opt. spaces of fence parser->offset + int i = container->as.code.fence_offset; + + while (i > 0 && S_is_space_or_tab(peek_at(input, parser->offset))) { + S_advance_offset(parser, input, 1, true); + i--; + } + res = true; + } + } + + return res; +} + +static bool parse_html_block_prefix(cmark_parser *parser, + cmark_node *container) { + bool res = false; + int html_block_type = container->as.html_block_type; + + assert(html_block_type >= 1 && html_block_type <= 7); + switch (html_block_type) { + case 1: + case 2: + case 3: + case 4: + case 5: + // these types of blocks can accept blanks + res = true; + break; + case 6: + case 7: + res = !parser->blank; + break; + } + + return res; +} + +/** + * For each containing node, try to parse the associated line start. + * + * Will not close unmatched blocks, as we may have a lazy continuation + * line -> http://spec.commonmark.org/0.24/#lazy-continuation-line + * + * Returns: The last matching node, or NULL + */ +static cmark_node *check_open_blocks(cmark_parser *parser, cmark_chunk *input, + bool *all_matched) { + bool should_continue = true; + *all_matched = false; + cmark_node *container = parser->root; + cmark_node_type cont_type; + + while (S_last_child_is_open(container)) { + container = container->last_child; + cont_type = S_type(container); + + S_find_first_nonspace(parser, input); + + switch (cont_type) { + case CMARK_NODE_BLOCK_QUOTE: + if (!parse_block_quote_prefix(parser, input)) + goto done; + break; + case CMARK_NODE_ITEM: + if (!parse_node_item_prefix(parser, input, container)) + goto done; + break; + case CMARK_NODE_CODE_BLOCK: + if (!parse_code_block_prefix(parser, input, container, &should_continue)) + goto done; + break; + case CMARK_NODE_HEADING: + // a heading can never contain more than one line + goto done; + case CMARK_NODE_HTML_BLOCK: + if (!parse_html_block_prefix(parser, container)) + goto done; + break; + case CMARK_NODE_PARAGRAPH: + if (parser->blank) + goto done; + break; + default: + break; + } + } + + *all_matched = true; + +done: + if (!*all_matched) { + container = container->parent; // back up to last matching node + } + + if (!should_continue) { + container = NULL; + } + + return container; +} + +static void open_new_blocks(cmark_parser *parser, cmark_node **container, + cmark_chunk *input, bool all_matched) { + bool indented; + cmark_list *data = NULL; + bool maybe_lazy = S_type(parser->current) == CMARK_NODE_PARAGRAPH; + cmark_node_type cont_type = S_type(*container); + bufsize_t matched = 0; + int lev = 0; + bool save_partially_consumed_tab; + bool has_content; + int save_offset; + int save_column; + + while (cont_type != CMARK_NODE_CODE_BLOCK && + cont_type != CMARK_NODE_HTML_BLOCK) { + + S_find_first_nonspace(parser, input); + indented = parser->indent >= CODE_INDENT; + + if (!indented && peek_at(input, parser->first_nonspace) == '>') { + + bufsize_t blockquote_startpos = parser->first_nonspace; + + S_advance_offset(parser, input, + parser->first_nonspace + 1 - parser->offset, false); + // optional following character + if (S_is_space_or_tab(peek_at(input, parser->offset))) { + S_advance_offset(parser, input, 1, true); + } + *container = add_child(parser, *container, CMARK_NODE_BLOCK_QUOTE, + blockquote_startpos + 1); + + } else if (!indented && (matched = scan_atx_heading_start( + input, parser->first_nonspace))) { + bufsize_t hashpos; + int level = 0; + bufsize_t heading_startpos = parser->first_nonspace; + + S_advance_offset(parser, input, + parser->first_nonspace + matched - parser->offset, + false); + *container = add_child(parser, *container, CMARK_NODE_HEADING, + heading_startpos + 1); + + hashpos = cmark_chunk_strchr(input, '#', parser->first_nonspace); + + while (peek_at(input, hashpos) == '#') { + level++; + hashpos++; + } + + (*container)->as.heading.level = level; + (*container)->as.heading.setext = false; + (*container)->internal_offset = matched; + + } else if (!indented && (matched = scan_open_code_fence( + input, parser->first_nonspace))) { + *container = add_child(parser, *container, CMARK_NODE_CODE_BLOCK, + parser->first_nonspace + 1); + (*container)->as.code.fenced = true; + (*container)->as.code.fence_char = peek_at(input, parser->first_nonspace); + (*container)->as.code.fence_length = (matched > 255) ? 255 : matched; + (*container)->as.code.fence_offset = + (int8_t)(parser->first_nonspace - parser->offset); + (*container)->as.code.info = NULL; + S_advance_offset(parser, input, + parser->first_nonspace + matched - parser->offset, + false); + + } else if (!indented && ((matched = scan_html_block_start( + input, parser->first_nonspace)) || + (cont_type != CMARK_NODE_PARAGRAPH && + (matched = scan_html_block_start_7( + input, parser->first_nonspace))))) { + *container = add_child(parser, *container, CMARK_NODE_HTML_BLOCK, + parser->first_nonspace + 1); + (*container)->as.html_block_type = matched; + // note, we don't adjust parser->offset because the tag is part of the + // text + } else if (!indented && cont_type == CMARK_NODE_PARAGRAPH && + (lev = + scan_setext_heading_line(input, parser->first_nonspace))) { + // finalize paragraph, resolving reference links + has_content = resolve_reference_link_definitions(parser); + + if (has_content) { + + (*container)->type = (uint16_t)CMARK_NODE_HEADING; + (*container)->as.heading.level = lev; + (*container)->as.heading.setext = true; + S_advance_offset(parser, input, input->len - 1 - parser->offset, false); + } + } else if (!indented && + !(cont_type == CMARK_NODE_PARAGRAPH && !all_matched) && + (parser->thematic_break_kill_pos <= parser->first_nonspace) && + (matched = S_scan_thematic_break(parser, input, parser->first_nonspace))) { + // it's only now that we know the line is not part of a setext heading: + *container = add_child(parser, *container, CMARK_NODE_THEMATIC_BREAK, + parser->first_nonspace + 1); + S_advance_offset(parser, input, input->len - 1 - parser->offset, false); + } else if ((!indented || cont_type == CMARK_NODE_LIST) && + parser->indent < 4 && + (matched = parse_list_marker( + parser->mem, input, parser->first_nonspace, + (*container)->type == CMARK_NODE_PARAGRAPH, &data))) { + + // Note that we can have new list items starting with >= 4 + // spaces indent, as long as the list container is still open. + int i = 0; + + // compute padding: + S_advance_offset(parser, input, + parser->first_nonspace + matched - parser->offset, + false); + + save_partially_consumed_tab = parser->partially_consumed_tab; + save_offset = parser->offset; + save_column = parser->column; + + while (parser->column - save_column <= 5 && + S_is_space_or_tab(peek_at(input, parser->offset))) { + S_advance_offset(parser, input, 1, true); + } + + i = parser->column - save_column; + if (i >= 5 || i < 1 || + // only spaces after list marker: + S_is_line_end_char(peek_at(input, parser->offset))) { + data->padding = matched + 1; + parser->offset = save_offset; + parser->column = save_column; + parser->partially_consumed_tab = save_partially_consumed_tab; + if (i > 0) { + S_advance_offset(parser, input, 1, true); + } + } else { + data->padding = matched + i; + } + + // check container; if it's a list, see if this list item + // can continue the list; otherwise, create a list container. + + data->marker_offset = parser->indent; + + if (cont_type != CMARK_NODE_LIST || + !lists_match(&((*container)->as.list), data)) { + *container = add_child(parser, *container, CMARK_NODE_LIST, + parser->first_nonspace + 1); + + memcpy(&((*container)->as.list), data, sizeof(*data)); + } + + // add the list item + *container = add_child(parser, *container, CMARK_NODE_ITEM, + parser->first_nonspace + 1); + /* TODO: static */ + memcpy(&((*container)->as.list), data, sizeof(*data)); + parser->mem->free(data); + } else if (indented && !maybe_lazy && !parser->blank) { + S_advance_offset(parser, input, CODE_INDENT, true); + *container = add_child(parser, *container, CMARK_NODE_CODE_BLOCK, + parser->offset + 1); + (*container)->as.code.fenced = false; + (*container)->as.code.fence_char = 0; + (*container)->as.code.fence_length = 0; + (*container)->as.code.fence_offset = 0; + (*container)->as.code.info = NULL; + + } else { + break; + } + + if (accepts_lines(S_type(*container))) { + // if it's a line container, it can't contain other containers + break; + } + + cont_type = S_type(*container); + maybe_lazy = false; + } +} + +static void add_text_to_container(cmark_parser *parser, cmark_node *container, + cmark_node *last_matched_container, + cmark_chunk *input) { + cmark_node *tmp; + // what remains at parser->offset is a text line. add the text to the + // appropriate container. + + S_find_first_nonspace(parser, input); + + if (parser->blank && container->last_child) + S_set_last_line_blank(container->last_child, true); + + // block quote lines are never blank as they start with > + // and we don't count blanks in fenced code for purposes of tight/loose + // lists or breaking out of lists. we also don't set last_line_blank + // on an empty list item. + const cmark_node_type ctype = S_type(container); + const bool last_line_blank = + (parser->blank && ctype != CMARK_NODE_BLOCK_QUOTE && + ctype != CMARK_NODE_HEADING && ctype != CMARK_NODE_THEMATIC_BREAK && + !(ctype == CMARK_NODE_CODE_BLOCK && container->as.code.fenced) && + !(ctype == CMARK_NODE_ITEM && container->first_child == NULL && + container->start_line == parser->line_number)); + + S_set_last_line_blank(container, last_line_blank); + + tmp = container; + while (tmp->parent) { + S_set_last_line_blank(tmp->parent, false); + tmp = tmp->parent; + } + + // If the last line processed belonged to a paragraph node, + // and we didn't match all of the line prefixes for the open containers, + // and we didn't start any new containers, + // and the line isn't blank, + // then treat this as a "lazy continuation line" and add it to + // the open paragraph. + if (parser->current != last_matched_container && + container == last_matched_container && !parser->blank && + S_type(parser->current) == CMARK_NODE_PARAGRAPH) { + add_line(input, parser); + } else { // not a lazy continuation + // Finalize any blocks that were not matched and set cur to container: + while (parser->current != last_matched_container) { + parser->current = finalize(parser, parser->current); + assert(parser->current != NULL); + } + + if (S_type(container) == CMARK_NODE_CODE_BLOCK) { + add_line(input, parser); + } else if (S_type(container) == CMARK_NODE_HTML_BLOCK) { + add_line(input, parser); + + int matches_end_condition; + switch (container->as.html_block_type) { + case 1: + // </script>, </style>, </pre> + matches_end_condition = + scan_html_block_end_1(input, parser->first_nonspace); + break; + case 2: + // --> + matches_end_condition = + scan_html_block_end_2(input, parser->first_nonspace); + break; + case 3: + // ?> + matches_end_condition = + scan_html_block_end_3(input, parser->first_nonspace); + break; + case 4: + // > + matches_end_condition = + scan_html_block_end_4(input, parser->first_nonspace); + break; + case 5: + // ]]> + matches_end_condition = + scan_html_block_end_5(input, parser->first_nonspace); + break; + default: + matches_end_condition = 0; + break; + } + + if (matches_end_condition) { + container = finalize(parser, container); + assert(parser->current != NULL); + } + } else if (parser->blank) { + // ??? do nothing + } else if (accepts_lines(S_type(container))) { + if (S_type(container) == CMARK_NODE_HEADING && + container->as.heading.setext == false) { + chop_trailing_hashtags(input); + } + S_advance_offset(parser, input, parser->first_nonspace - parser->offset, + false); + add_line(input, parser); + } else { + // create paragraph container for line + container = add_child(parser, container, CMARK_NODE_PARAGRAPH, + parser->first_nonspace + 1); + S_advance_offset(parser, input, parser->first_nonspace - parser->offset, + false); + add_line(input, parser); + } + + parser->current = container; + } +} + +/* See http://spec.commonmark.org/0.24/#phase-1-block-structure */ +static void S_process_line(cmark_parser *parser, const unsigned char *buffer, + bufsize_t bytes) { + cmark_node *last_matched_container; + bool all_matched = true; + cmark_node *container; + cmark_chunk input; + + if (parser->options & CMARK_OPT_VALIDATE_UTF8) + cmark_utf8proc_check(&parser->curline, buffer, bytes); + else + cmark_strbuf_put(&parser->curline, buffer, bytes); + + bytes = parser->curline.size; + + // ensure line ends with a newline: + if (bytes == 0 || !S_is_line_end_char(parser->curline.ptr[bytes - 1])) + cmark_strbuf_putc(&parser->curline, '\n'); + + parser->offset = 0; + parser->column = 0; + parser->first_nonspace = 0; + parser->first_nonspace_column = 0; + parser->thematic_break_kill_pos = 0; + parser->indent = 0; + parser->blank = false; + parser->partially_consumed_tab = false; + + input.data = parser->curline.ptr; + input.len = parser->curline.size; + + parser->line_number++; + + last_matched_container = check_open_blocks(parser, &input, &all_matched); + + if (!last_matched_container) + goto finished; + + container = last_matched_container; + + open_new_blocks(parser, &container, &input, all_matched); + + add_text_to_container(parser, container, last_matched_container, &input); + +finished: + parser->last_line_length = input.len; + if (parser->last_line_length && + input.data[parser->last_line_length - 1] == '\n') + parser->last_line_length -= 1; + if (parser->last_line_length && + input.data[parser->last_line_length - 1] == '\r') + parser->last_line_length -= 1; + + cmark_strbuf_clear(&parser->curline); +} + +cmark_node *cmark_parser_finish(cmark_parser *parser) { + if (parser->linebuf.size) { + S_process_line(parser, parser->linebuf.ptr, parser->linebuf.size); + cmark_strbuf_clear(&parser->linebuf); + } + + finalize_document(parser); + + cmark_consolidate_text_nodes(parser->root); + + cmark_strbuf_free(&parser->curline); + +#if CMARK_DEBUG_NODES + if (cmark_node_check(parser->root, stderr)) { + abort(); + } +#endif + return parser->root; +} diff --git a/lib/cmark/src/buffer.c b/lib/cmark/src/buffer.c new file mode 100644 index 0000000..d946493 --- /dev/null +++ b/lib/cmark/src/buffer.c @@ -0,0 +1,278 @@ +#include <stdarg.h> +#include <string.h> +#include <assert.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <limits.h> + +#include "config.h" +#include "cmark_ctype.h" +#include "buffer.h" + +/* Used as default value for cmark_strbuf->ptr so that people can always + * assume ptr is non-NULL and zero terminated even for new cmark_strbufs. + */ +unsigned char cmark_strbuf__initbuf[1]; + +#ifndef MIN +#define MIN(x, y) ((x < y) ? x : y) +#endif + +void cmark_strbuf_init(cmark_mem *mem, cmark_strbuf *buf, + bufsize_t initial_size) { + buf->mem = mem; + buf->asize = 0; + buf->size = 0; + buf->ptr = cmark_strbuf__initbuf; + + if (initial_size > 0) + cmark_strbuf_grow(buf, initial_size); +} + +static CMARK_INLINE void S_strbuf_grow_by(cmark_strbuf *buf, bufsize_t add) { + cmark_strbuf_grow(buf, buf->size + add); +} + +void cmark_strbuf_grow(cmark_strbuf *buf, bufsize_t target_size) { + assert(target_size > 0); + + if (target_size < buf->asize) + return; + + if (target_size > (bufsize_t)(INT32_MAX / 2)) { + fprintf(stderr, + "[cmark] cmark_strbuf_grow requests buffer with size > %d, aborting\n", + (INT32_MAX / 2)); + abort(); + } + + /* Oversize the buffer by 50% to guarantee amortized linear time + * complexity on append operations. */ + bufsize_t new_size = target_size + target_size / 2; + new_size += 1; + new_size = (new_size + 7) & ~7; + + buf->ptr = (unsigned char *)buf->mem->realloc(buf->asize ? buf->ptr : NULL, + new_size); + buf->asize = new_size; +} + +bufsize_t cmark_strbuf_len(const cmark_strbuf *buf) { return buf->size; } + +void cmark_strbuf_free(cmark_strbuf *buf) { + if (!buf) + return; + + if (buf->ptr != cmark_strbuf__initbuf) + buf->mem->free(buf->ptr); + + cmark_strbuf_init(buf->mem, buf, 0); +} + +void cmark_strbuf_clear(cmark_strbuf *buf) { + buf->size = 0; + + if (buf->asize > 0) + buf->ptr[0] = '\0'; +} + +void cmark_strbuf_set(cmark_strbuf *buf, const unsigned char *data, + bufsize_t len) { + if (len <= 0 || data == NULL) { + cmark_strbuf_clear(buf); + } else { + if (data != buf->ptr) { + if (len >= buf->asize) + cmark_strbuf_grow(buf, len); + memmove(buf->ptr, data, len); + } + buf->size = len; + buf->ptr[buf->size] = '\0'; + } +} + +void cmark_strbuf_sets(cmark_strbuf *buf, const char *string) { + cmark_strbuf_set(buf, (const unsigned char *)string, + string ? strlen(string) : 0); +} + +void cmark_strbuf_putc(cmark_strbuf *buf, int c) { + S_strbuf_grow_by(buf, 1); + buf->ptr[buf->size++] = (unsigned char)(c & 0xFF); + buf->ptr[buf->size] = '\0'; +} + +void cmark_strbuf_put(cmark_strbuf *buf, const unsigned char *data, + bufsize_t len) { + if (len <= 0) + return; + + S_strbuf_grow_by(buf, len); + memmove(buf->ptr + buf->size, data, len); + buf->size += len; + buf->ptr[buf->size] = '\0'; +} + +void cmark_strbuf_puts(cmark_strbuf *buf, const char *string) { + cmark_strbuf_put(buf, (const unsigned char *)string, strlen(string)); +} + +void cmark_strbuf_copy_cstr(char *data, bufsize_t datasize, + const cmark_strbuf *buf) { + bufsize_t copylen; + + assert(buf); + if (!data || datasize <= 0) + return; + + data[0] = '\0'; + + if (buf->size == 0 || buf->asize <= 0) + return; + + copylen = buf->size; + if (copylen > datasize - 1) + copylen = datasize - 1; + memmove(data, buf->ptr, copylen); + data[copylen] = '\0'; +} + +void cmark_strbuf_swap(cmark_strbuf *buf_a, cmark_strbuf *buf_b) { + cmark_strbuf t = *buf_a; + *buf_a = *buf_b; + *buf_b = t; +} + +unsigned char *cmark_strbuf_detach(cmark_strbuf *buf) { + unsigned char *data = buf->ptr; + + if (buf->asize == 0) { + /* return an empty string */ + return (unsigned char *)buf->mem->calloc(1, 1); + } + + cmark_strbuf_init(buf->mem, buf, 0); + return data; +} + +int cmark_strbuf_cmp(const cmark_strbuf *a, const cmark_strbuf *b) { + int result = memcmp(a->ptr, b->ptr, MIN(a->size, b->size)); + return (result != 0) ? result + : (a->size < b->size) ? -1 : (a->size > b->size) ? 1 : 0; +} + +bufsize_t cmark_strbuf_strchr(const cmark_strbuf *buf, int c, bufsize_t pos) { + if (pos >= buf->size) + return -1; + if (pos < 0) + pos = 0; + + const unsigned char *p = + (unsigned char *)memchr(buf->ptr + pos, c, buf->size - pos); + if (!p) + return -1; + + return (bufsize_t)(p - (const unsigned char *)buf->ptr); +} + +bufsize_t cmark_strbuf_strrchr(const cmark_strbuf *buf, int c, bufsize_t pos) { + if (pos < 0 || buf->size == 0) + return -1; + if (pos >= buf->size) + pos = buf->size - 1; + + bufsize_t i; + for (i = pos; i >= 0; i--) { + if (buf->ptr[i] == (unsigned char)c) + return i; + } + + return -1; +} + +void cmark_strbuf_truncate(cmark_strbuf *buf, bufsize_t len) { + if (len < 0) + len = 0; + + if (len < buf->size) { + buf->size = len; + buf->ptr[buf->size] = '\0'; + } +} + +void cmark_strbuf_drop(cmark_strbuf *buf, bufsize_t n) { + if (n > 0) { + if (n > buf->size) + n = buf->size; + buf->size = buf->size - n; + if (buf->size) + memmove(buf->ptr, buf->ptr + n, buf->size); + + buf->ptr[buf->size] = '\0'; + } +} + +void cmark_strbuf_rtrim(cmark_strbuf *buf) { + if (!buf->size) + return; + + while (buf->size > 0) { + if (!cmark_isspace(buf->ptr[buf->size - 1])) + break; + + buf->size--; + } + + buf->ptr[buf->size] = '\0'; +} + +void cmark_strbuf_trim(cmark_strbuf *buf) { + bufsize_t i = 0; + + if (!buf->size) + return; + + while (i < buf->size && cmark_isspace(buf->ptr[i])) + i++; + + cmark_strbuf_drop(buf, i); + + cmark_strbuf_rtrim(buf); +} + +// Destructively modify string, collapsing consecutive +// space and newline characters into a single space. +void cmark_strbuf_normalize_whitespace(cmark_strbuf *s) { + bool last_char_was_space = false; + bufsize_t r, w; + + for (r = 0, w = 0; r < s->size; ++r) { + if (cmark_isspace(s->ptr[r])) { + if (!last_char_was_space) { + s->ptr[w++] = ' '; + last_char_was_space = true; + } + } else { + s->ptr[w++] = s->ptr[r]; + last_char_was_space = false; + } + } + + cmark_strbuf_truncate(s, w); +} + +// Destructively unescape a string: remove backslashes before punctuation chars. +extern void cmark_strbuf_unescape(cmark_strbuf *buf) { + bufsize_t r, w; + + for (r = 0, w = 0; r < buf->size; ++r) { + if (buf->ptr[r] == '\\' && cmark_ispunct(buf->ptr[r + 1])) + r++; + + buf->ptr[w++] = buf->ptr[r]; + } + + cmark_strbuf_truncate(buf, w); +} diff --git a/lib/cmark/src/buffer.h b/lib/cmark/src/buffer.h new file mode 100644 index 0000000..55b552f --- /dev/null +++ b/lib/cmark/src/buffer.h @@ -0,0 +1,84 @@ +#ifndef CMARK_BUFFER_H +#define CMARK_BUFFER_H + +#include <stddef.h> +#include <stdarg.h> +#include <string.h> +#include <limits.h> +#include <stdint.h> +#include "config.h" +#include "cmark.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef int32_t bufsize_t; + +typedef struct { + cmark_mem *mem; + unsigned char *ptr; + bufsize_t asize, size; +} cmark_strbuf; + +extern unsigned char cmark_strbuf__initbuf[]; + +#define CMARK_BUF_INIT(mem) \ + { mem, cmark_strbuf__initbuf, 0, 0 } + +/** + * Initialize a cmark_strbuf structure. + * + * For the cases where CMARK_BUF_INIT cannot be used to do static + * initialization. + */ +void cmark_strbuf_init(cmark_mem *mem, cmark_strbuf *buf, + bufsize_t initial_size); + +/** + * Grow the buffer to hold at least `target_size` bytes. + */ +void cmark_strbuf_grow(cmark_strbuf *buf, bufsize_t target_size); + +void cmark_strbuf_free(cmark_strbuf *buf); +void cmark_strbuf_swap(cmark_strbuf *buf_a, cmark_strbuf *buf_b); + +bufsize_t cmark_strbuf_len(const cmark_strbuf *buf); + +int cmark_strbuf_cmp(const cmark_strbuf *a, const cmark_strbuf *b); + +unsigned char *cmark_strbuf_detach(cmark_strbuf *buf); +void cmark_strbuf_copy_cstr(char *data, bufsize_t datasize, + const cmark_strbuf *buf); + +/* +static CMARK_INLINE const char *cmark_strbuf_cstr(const cmark_strbuf *buf) { + return (char *)buf->ptr; +} +*/ + +#define cmark_strbuf_at(buf, n) ((buf)->ptr[n]) + +void cmark_strbuf_set(cmark_strbuf *buf, const unsigned char *data, + bufsize_t len); +void cmark_strbuf_sets(cmark_strbuf *buf, const char *string); +void cmark_strbuf_putc(cmark_strbuf *buf, int c); +void cmark_strbuf_put(cmark_strbuf *buf, const unsigned char *data, + bufsize_t len); +void cmark_strbuf_puts(cmark_strbuf *buf, const char *string); +void cmark_strbuf_clear(cmark_strbuf *buf); + +bufsize_t cmark_strbuf_strchr(const cmark_strbuf *buf, int c, bufsize_t pos); +bufsize_t cmark_strbuf_strrchr(const cmark_strbuf *buf, int c, bufsize_t pos); +void cmark_strbuf_drop(cmark_strbuf *buf, bufsize_t n); +void cmark_strbuf_truncate(cmark_strbuf *buf, bufsize_t len); +void cmark_strbuf_rtrim(cmark_strbuf *buf); +void cmark_strbuf_trim(cmark_strbuf *buf); +void cmark_strbuf_normalize_whitespace(cmark_strbuf *s); +void cmark_strbuf_unescape(cmark_strbuf *s); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/case_fold_switch.inc b/lib/cmark/src/case_fold_switch.inc new file mode 100644 index 0000000..fc1b6d8 --- /dev/null +++ b/lib/cmark/src/case_fold_switch.inc @@ -0,0 +1,4594 @@ + switch (c) { + case 0x0041: + bufpush(0x0061); + break; + case 0x0042: + bufpush(0x0062); + break; + case 0x0043: + bufpush(0x0063); + break; + case 0x0044: + bufpush(0x0064); + break; + case 0x0045: + bufpush(0x0065); + break; + case 0x0046: + bufpush(0x0066); + break; + case 0x0047: + bufpush(0x0067); + break; + case 0x0048: + bufpush(0x0068); + break; + case 0x0049: + bufpush(0x0069); + break; + case 0x004A: + bufpush(0x006A); + break; + case 0x004B: + bufpush(0x006B); + break; + case 0x004C: + bufpush(0x006C); + break; + case 0x004D: + bufpush(0x006D); + break; + case 0x004E: + bufpush(0x006E); + break; + case 0x004F: + bufpush(0x006F); + break; + case 0x0050: + bufpush(0x0070); + break; + case 0x0051: + bufpush(0x0071); + break; + case 0x0052: + bufpush(0x0072); + break; + case 0x0053: + bufpush(0x0073); + break; + case 0x0054: + bufpush(0x0074); + break; + case 0x0055: + bufpush(0x0075); + break; + case 0x0056: + bufpush(0x0076); + break; + case 0x0057: + bufpush(0x0077); + break; + case 0x0058: + bufpush(0x0078); + break; + case 0x0059: + bufpush(0x0079); + break; + case 0x005A: + bufpush(0x007A); + break; + case 0x00B5: + bufpush(0x03BC); + break; + case 0x00C0: + bufpush(0x00E0); + break; + case 0x00C1: + bufpush(0x00E1); + break; + case 0x00C2: + bufpush(0x00E2); + break; + case 0x00C3: + bufpush(0x00E3); + break; + case 0x00C4: + bufpush(0x00E4); + break; + case 0x00C5: + bufpush(0x00E5); + break; + case 0x00C6: + bufpush(0x00E6); + break; + case 0x00C7: + bufpush(0x00E7); + break; + case 0x00C8: + bufpush(0x00E8); + break; + case 0x00C9: + bufpush(0x00E9); + break; + case 0x00CA: + bufpush(0x00EA); + break; + case 0x00CB: + bufpush(0x00EB); + break; + case 0x00CC: + bufpush(0x00EC); + break; + case 0x00CD: + bufpush(0x00ED); + break; + case 0x00CE: + bufpush(0x00EE); + break; + case 0x00CF: + bufpush(0x00EF); + break; + case 0x00D0: + bufpush(0x00F0); + break; + case 0x00D1: + bufpush(0x00F1); + break; + case 0x00D2: + bufpush(0x00F2); + break; + case 0x00D3: + bufpush(0x00F3); + break; + case 0x00D4: + bufpush(0x00F4); + break; + case 0x00D5: + bufpush(0x00F5); + break; + case 0x00D6: + bufpush(0x00F6); + break; + case 0x00D8: + bufpush(0x00F8); + break; + case 0x00D9: + bufpush(0x00F9); + break; + case 0x00DA: + bufpush(0x00FA); + break; + case 0x00DB: + bufpush(0x00FB); + break; + case 0x00DC: + bufpush(0x00FC); + break; + case 0x00DD: + bufpush(0x00FD); + break; + case 0x00DE: + bufpush(0x00FE); + break; + case 0x00DF: + bufpush(0x0073); + bufpush(0x0073); + break; + case 0x0100: + bufpush(0x0101); + break; + case 0x0102: + bufpush(0x0103); + break; + case 0x0104: + bufpush(0x0105); + break; + case 0x0106: + bufpush(0x0107); + break; + case 0x0108: + bufpush(0x0109); + break; + case 0x010A: + bufpush(0x010B); + break; + case 0x010C: + bufpush(0x010D); + break; + case 0x010E: + bufpush(0x010F); + break; + case 0x0110: + bufpush(0x0111); + break; + case 0x0112: + bufpush(0x0113); + break; + case 0x0114: + bufpush(0x0115); + break; + case 0x0116: + bufpush(0x0117); + break; + case 0x0118: + bufpush(0x0119); + break; + case 0x011A: + bufpush(0x011B); + break; + case 0x011C: + bufpush(0x011D); + break; + case 0x011E: + bufpush(0x011F); + break; + case 0x0120: + bufpush(0x0121); + break; + case 0x0122: + bufpush(0x0123); + break; + case 0x0124: + bufpush(0x0125); + break; + case 0x0126: + bufpush(0x0127); + break; + case 0x0128: + bufpush(0x0129); + break; + case 0x012A: + bufpush(0x012B); + break; + case 0x012C: + bufpush(0x012D); + break; + case 0x012E: + bufpush(0x012F); + break; + case 0x0130: + bufpush(0x0069); + bufpush(0x0307); + break; + case 0x0132: + bufpush(0x0133); + break; + case 0x0134: + bufpush(0x0135); + break; + case 0x0136: + bufpush(0x0137); + break; + case 0x0139: + bufpush(0x013A); + break; + case 0x013B: + bufpush(0x013C); + break; + case 0x013D: + bufpush(0x013E); + break; + case 0x013F: + bufpush(0x0140); + break; + case 0x0141: + bufpush(0x0142); + break; + case 0x0143: + bufpush(0x0144); + break; + case 0x0145: + bufpush(0x0146); + break; + case 0x0147: + bufpush(0x0148); + break; + case 0x0149: + bufpush(0x02BC); + bufpush(0x006E); + break; + case 0x014A: + bufpush(0x014B); + break; + case 0x014C: + bufpush(0x014D); + break; + case 0x014E: + bufpush(0x014F); + break; + case 0x0150: + bufpush(0x0151); + break; + case 0x0152: + bufpush(0x0153); + break; + case 0x0154: + bufpush(0x0155); + break; + case 0x0156: + bufpush(0x0157); + break; + case 0x0158: + bufpush(0x0159); + break; + case 0x015A: + bufpush(0x015B); + break; + case 0x015C: + bufpush(0x015D); + break; + case 0x015E: + bufpush(0x015F); + break; + case 0x0160: + bufpush(0x0161); + break; + case 0x0162: + bufpush(0x0163); + break; + case 0x0164: + bufpush(0x0165); + break; + case 0x0166: + bufpush(0x0167); + break; + case 0x0168: + bufpush(0x0169); + break; + case 0x016A: + bufpush(0x016B); + break; + case 0x016C: + bufpush(0x016D); + break; + case 0x016E: + bufpush(0x016F); + break; + case 0x0170: + bufpush(0x0171); + break; + case 0x0172: + bufpush(0x0173); + break; + case 0x0174: + bufpush(0x0175); + break; + case 0x0176: + bufpush(0x0177); + break; + case 0x0178: + bufpush(0x00FF); + break; + case 0x0179: + bufpush(0x017A); + break; + case 0x017B: + bufpush(0x017C); + break; + case 0x017D: + bufpush(0x017E); + break; + case 0x017F: + bufpush(0x0073); + break; + case 0x0181: + bufpush(0x0253); + break; + case 0x0182: + bufpush(0x0183); + break; + case 0x0184: + bufpush(0x0185); + break; + case 0x0186: + bufpush(0x0254); + break; + case 0x0187: + bufpush(0x0188); + break; + case 0x0189: + bufpush(0x0256); + break; + case 0x018A: + bufpush(0x0257); + break; + case 0x018B: + bufpush(0x018C); + break; + case 0x018E: + bufpush(0x01DD); + break; + case 0x018F: + bufpush(0x0259); + break; + case 0x0190: + bufpush(0x025B); + break; + case 0x0191: + bufpush(0x0192); + break; + case 0x0193: + bufpush(0x0260); + break; + case 0x0194: + bufpush(0x0263); + break; + case 0x0196: + bufpush(0x0269); + break; + case 0x0197: + bufpush(0x0268); + break; + case 0x0198: + bufpush(0x0199); + break; + case 0x019C: + bufpush(0x026F); + break; + case 0x019D: + bufpush(0x0272); + break; + case 0x019F: + bufpush(0x0275); + break; + case 0x01A0: + bufpush(0x01A1); + break; + case 0x01A2: + bufpush(0x01A3); + break; + case 0x01A4: + bufpush(0x01A5); + break; + case 0x01A6: + bufpush(0x0280); + break; + case 0x01A7: + bufpush(0x01A8); + break; + case 0x01A9: + bufpush(0x0283); + break; + case 0x01AC: + bufpush(0x01AD); + break; + case 0x01AE: + bufpush(0x0288); + break; + case 0x01AF: + bufpush(0x01B0); + break; + case 0x01B1: + bufpush(0x028A); + break; + case 0x01B2: + bufpush(0x028B); + break; + case 0x01B3: + bufpush(0x01B4); + break; + case 0x01B5: + bufpush(0x01B6); + break; + case 0x01B7: + bufpush(0x0292); + break; + case 0x01B8: + bufpush(0x01B9); + break; + case 0x01BC: + bufpush(0x01BD); + break; + case 0x01C4: + bufpush(0x01C6); + break; + case 0x01C5: + bufpush(0x01C6); + break; + case 0x01C7: + bufpush(0x01C9); + break; + case 0x01C8: + bufpush(0x01C9); + break; + case 0x01CA: + bufpush(0x01CC); + break; + case 0x01CB: + bufpush(0x01CC); + break; + case 0x01CD: + bufpush(0x01CE); + break; + case 0x01CF: + bufpush(0x01D0); + break; + case 0x01D1: + bufpush(0x01D2); + break; + case 0x01D3: + bufpush(0x01D4); + break; + case 0x01D5: + bufpush(0x01D6); + break; + case 0x01D7: + bufpush(0x01D8); + break; + case 0x01D9: + bufpush(0x01DA); + break; + case 0x01DB: + bufpush(0x01DC); + break; + case 0x01DE: + bufpush(0x01DF); + break; + case 0x01E0: + bufpush(0x01E1); + break; + case 0x01E2: + bufpush(0x01E3); + break; + case 0x01E4: + bufpush(0x01E5); + break; + case 0x01E6: + bufpush(0x01E7); + break; + case 0x01E8: + bufpush(0x01E9); + break; + case 0x01EA: + bufpush(0x01EB); + break; + case 0x01EC: + bufpush(0x01ED); + break; + case 0x01EE: + bufpush(0x01EF); + break; + case 0x01F0: + bufpush(0x006A); + bufpush(0x030C); + break; + case 0x01F1: + bufpush(0x01F3); + break; + case 0x01F2: + bufpush(0x01F3); + break; + case 0x01F4: + bufpush(0x01F5); + break; + case 0x01F6: + bufpush(0x0195); + break; + case 0x01F7: + bufpush(0x01BF); + break; + case 0x01F8: + bufpush(0x01F9); + break; + case 0x01FA: + bufpush(0x01FB); + break; + case 0x01FC: + bufpush(0x01FD); + break; + case 0x01FE: + bufpush(0x01FF); + break; + case 0x0200: + bufpush(0x0201); + break; + case 0x0202: + bufpush(0x0203); + break; + case 0x0204: + bufpush(0x0205); + break; + case 0x0206: + bufpush(0x0207); + break; + case 0x0208: + bufpush(0x0209); + break; + case 0x020A: + bufpush(0x020B); + break; + case 0x020C: + bufpush(0x020D); + break; + case 0x020E: + bufpush(0x020F); + break; + case 0x0210: + bufpush(0x0211); + break; + case 0x0212: + bufpush(0x0213); + break; + case 0x0214: + bufpush(0x0215); + break; + case 0x0216: + bufpush(0x0217); + break; + case 0x0218: + bufpush(0x0219); + break; + case 0x021A: + bufpush(0x021B); + break; + case 0x021C: + bufpush(0x021D); + break; + case 0x021E: + bufpush(0x021F); + break; + case 0x0220: + bufpush(0x019E); + break; + case 0x0222: + bufpush(0x0223); + break; + case 0x0224: + bufpush(0x0225); + break; + case 0x0226: + bufpush(0x0227); + break; + case 0x0228: + bufpush(0x0229); + break; + case 0x022A: + bufpush(0x022B); + break; + case 0x022C: + bufpush(0x022D); + break; + case 0x022E: + bufpush(0x022F); + break; + case 0x0230: + bufpush(0x0231); + break; + case 0x0232: + bufpush(0x0233); + break; + case 0x023A: + bufpush(0x2C65); + break; + case 0x023B: + bufpush(0x023C); + break; + case 0x023D: + bufpush(0x019A); + break; + case 0x023E: + bufpush(0x2C66); + break; + case 0x0241: + bufpush(0x0242); + break; + case 0x0243: + bufpush(0x0180); + break; + case 0x0244: + bufpush(0x0289); + break; + case 0x0245: + bufpush(0x028C); + break; + case 0x0246: + bufpush(0x0247); + break; + case 0x0248: + bufpush(0x0249); + break; + case 0x024A: + bufpush(0x024B); + break; + case 0x024C: + bufpush(0x024D); + break; + case 0x024E: + bufpush(0x024F); + break; + case 0x0345: + bufpush(0x03B9); + break; + case 0x0370: + bufpush(0x0371); + break; + case 0x0372: + bufpush(0x0373); + break; + case 0x0376: + bufpush(0x0377); + break; + case 0x037F: + bufpush(0x03F3); + break; + case 0x0386: + bufpush(0x03AC); + break; + case 0x0388: + bufpush(0x03AD); + break; + case 0x0389: + bufpush(0x03AE); + break; + case 0x038A: + bufpush(0x03AF); + break; + case 0x038C: + bufpush(0x03CC); + break; + case 0x038E: + bufpush(0x03CD); + break; + case 0x038F: + bufpush(0x03CE); + break; + case 0x0390: + bufpush(0x03B9); + bufpush(0x0308); + bufpush(0x0301); + break; + case 0x0391: + bufpush(0x03B1); + break; + case 0x0392: + bufpush(0x03B2); + break; + case 0x0393: + bufpush(0x03B3); + break; + case 0x0394: + bufpush(0x03B4); + break; + case 0x0395: + bufpush(0x03B5); + break; + case 0x0396: + bufpush(0x03B6); + break; + case 0x0397: + bufpush(0x03B7); + break; + case 0x0398: + bufpush(0x03B8); + break; + case 0x0399: + bufpush(0x03B9); + break; + case 0x039A: + bufpush(0x03BA); + break; + case 0x039B: + bufpush(0x03BB); + break; + case 0x039C: + bufpush(0x03BC); + break; + case 0x039D: + bufpush(0x03BD); + break; + case 0x039E: + bufpush(0x03BE); + break; + case 0x039F: + bufpush(0x03BF); + break; + case 0x03A0: + bufpush(0x03C0); + break; + case 0x03A1: + bufpush(0x03C1); + break; + case 0x03A3: + bufpush(0x03C3); + break; + case 0x03A4: + bufpush(0x03C4); + break; + case 0x03A5: + bufpush(0x03C5); + break; + case 0x03A6: + bufpush(0x03C6); + break; + case 0x03A7: + bufpush(0x03C7); + break; + case 0x03A8: + bufpush(0x03C8); + break; + case 0x03A9: + bufpush(0x03C9); + break; + case 0x03AA: + bufpush(0x03CA); + break; + case 0x03AB: + bufpush(0x03CB); + break; + case 0x03B0: + bufpush(0x03C5); + bufpush(0x0308); + bufpush(0x0301); + break; + case 0x03C2: + bufpush(0x03C3); + break; + case 0x03CF: + bufpush(0x03D7); + break; + case 0x03D0: + bufpush(0x03B2); + break; + case 0x03D1: + bufpush(0x03B8); + break; + case 0x03D5: + bufpush(0x03C6); + break; + case 0x03D6: + bufpush(0x03C0); + break; + case 0x03D8: + bufpush(0x03D9); + break; + case 0x03DA: + bufpush(0x03DB); + break; + case 0x03DC: + bufpush(0x03DD); + break; + case 0x03DE: + bufpush(0x03DF); + break; + case 0x03E0: + bufpush(0x03E1); + break; + case 0x03E2: + bufpush(0x03E3); + break; + case 0x03E4: + bufpush(0x03E5); + break; + case 0x03E6: + bufpush(0x03E7); + break; + case 0x03E8: + bufpush(0x03E9); + break; + case 0x03EA: + bufpush(0x03EB); + break; + case 0x03EC: + bufpush(0x03ED); + break; + case 0x03EE: + bufpush(0x03EF); + break; + case 0x03F0: + bufpush(0x03BA); + break; + case 0x03F1: + bufpush(0x03C1); + break; + case 0x03F4: + bufpush(0x03B8); + break; + case 0x03F5: + bufpush(0x03B5); + break; + case 0x03F7: + bufpush(0x03F8); + break; + case 0x03F9: + bufpush(0x03F2); + break; + case 0x03FA: + bufpush(0x03FB); + break; + case 0x03FD: + bufpush(0x037B); + break; + case 0x03FE: + bufpush(0x037C); + break; + case 0x03FF: + bufpush(0x037D); + break; + case 0x0400: + bufpush(0x0450); + break; + case 0x0401: + bufpush(0x0451); + break; + case 0x0402: + bufpush(0x0452); + break; + case 0x0403: + bufpush(0x0453); + break; + case 0x0404: + bufpush(0x0454); + break; + case 0x0405: + bufpush(0x0455); + break; + case 0x0406: + bufpush(0x0456); + break; + case 0x0407: + bufpush(0x0457); + break; + case 0x0408: + bufpush(0x0458); + break; + case 0x0409: + bufpush(0x0459); + break; + case 0x040A: + bufpush(0x045A); + break; + case 0x040B: + bufpush(0x045B); + break; + case 0x040C: + bufpush(0x045C); + break; + case 0x040D: + bufpush(0x045D); + break; + case 0x040E: + bufpush(0x045E); + break; + case 0x040F: + bufpush(0x045F); + break; + case 0x0410: + bufpush(0x0430); + break; + case 0x0411: + bufpush(0x0431); + break; + case 0x0412: + bufpush(0x0432); + break; + case 0x0413: + bufpush(0x0433); + break; + case 0x0414: + bufpush(0x0434); + break; + case 0x0415: + bufpush(0x0435); + break; + case 0x0416: + bufpush(0x0436); + break; + case 0x0417: + bufpush(0x0437); + break; + case 0x0418: + bufpush(0x0438); + break; + case 0x0419: + bufpush(0x0439); + break; + case 0x041A: + bufpush(0x043A); + break; + case 0x041B: + bufpush(0x043B); + break; + case 0x041C: + bufpush(0x043C); + break; + case 0x041D: + bufpush(0x043D); + break; + case 0x041E: + bufpush(0x043E); + break; + case 0x041F: + bufpush(0x043F); + break; + case 0x0420: + bufpush(0x0440); + break; + case 0x0421: + bufpush(0x0441); + break; + case 0x0422: + bufpush(0x0442); + break; + case 0x0423: + bufpush(0x0443); + break; + case 0x0424: + bufpush(0x0444); + break; + case 0x0425: + bufpush(0x0445); + break; + case 0x0426: + bufpush(0x0446); + break; + case 0x0427: + bufpush(0x0447); + break; + case 0x0428: + bufpush(0x0448); + break; + case 0x0429: + bufpush(0x0449); + break; + case 0x042A: + bufpush(0x044A); + break; + case 0x042B: + bufpush(0x044B); + break; + case 0x042C: + bufpush(0x044C); + break; + case 0x042D: + bufpush(0x044D); + break; + case 0x042E: + bufpush(0x044E); + break; + case 0x042F: + bufpush(0x044F); + break; + case 0x0460: + bufpush(0x0461); + break; + case 0x0462: + bufpush(0x0463); + break; + case 0x0464: + bufpush(0x0465); + break; + case 0x0466: + bufpush(0x0467); + break; + case 0x0468: + bufpush(0x0469); + break; + case 0x046A: + bufpush(0x046B); + break; + case 0x046C: + bufpush(0x046D); + break; + case 0x046E: + bufpush(0x046F); + break; + case 0x0470: + bufpush(0x0471); + break; + case 0x0472: + bufpush(0x0473); + break; + case 0x0474: + bufpush(0x0475); + break; + case 0x0476: + bufpush(0x0477); + break; + case 0x0478: + bufpush(0x0479); + break; + case 0x047A: + bufpush(0x047B); + break; + case 0x047C: + bufpush(0x047D); + break; + case 0x047E: + bufpush(0x047F); + break; + case 0x0480: + bufpush(0x0481); + break; + case 0x048A: + bufpush(0x048B); + break; + case 0x048C: + bufpush(0x048D); + break; + case 0x048E: + bufpush(0x048F); + break; + case 0x0490: + bufpush(0x0491); + break; + case 0x0492: + bufpush(0x0493); + break; + case 0x0494: + bufpush(0x0495); + break; + case 0x0496: + bufpush(0x0497); + break; + case 0x0498: + bufpush(0x0499); + break; + case 0x049A: + bufpush(0x049B); + break; + case 0x049C: + bufpush(0x049D); + break; + case 0x049E: + bufpush(0x049F); + break; + case 0x04A0: + bufpush(0x04A1); + break; + case 0x04A2: + bufpush(0x04A3); + break; + case 0x04A4: + bufpush(0x04A5); + break; + case 0x04A6: + bufpush(0x04A7); + break; + case 0x04A8: + bufpush(0x04A9); + break; + case 0x04AA: + bufpush(0x04AB); + break; + case 0x04AC: + bufpush(0x04AD); + break; + case 0x04AE: + bufpush(0x04AF); + break; + case 0x04B0: + bufpush(0x04B1); + break; + case 0x04B2: + bufpush(0x04B3); + break; + case 0x04B4: + bufpush(0x04B5); + break; + case 0x04B6: + bufpush(0x04B7); + break; + case 0x04B8: + bufpush(0x04B9); + break; + case 0x04BA: + bufpush(0x04BB); + break; + case 0x04BC: + bufpush(0x04BD); + break; + case 0x04BE: + bufpush(0x04BF); + break; + case 0x04C0: + bufpush(0x04CF); + break; + case 0x04C1: + bufpush(0x04C2); + break; + case 0x04C3: + bufpush(0x04C4); + break; + case 0x04C5: + bufpush(0x04C6); + break; + case 0x04C7: + bufpush(0x04C8); + break; + case 0x04C9: + bufpush(0x04CA); + break; + case 0x04CB: + bufpush(0x04CC); + break; + case 0x04CD: + bufpush(0x04CE); + break; + case 0x04D0: + bufpush(0x04D1); + break; + case 0x04D2: + bufpush(0x04D3); + break; + case 0x04D4: + bufpush(0x04D5); + break; + case 0x04D6: + bufpush(0x04D7); + break; + case 0x04D8: + bufpush(0x04D9); + break; + case 0x04DA: + bufpush(0x04DB); + break; + case 0x04DC: + bufpush(0x04DD); + break; + case 0x04DE: + bufpush(0x04DF); + break; + case 0x04E0: + bufpush(0x04E1); + break; + case 0x04E2: + bufpush(0x04E3); + break; + case 0x04E4: + bufpush(0x04E5); + break; + case 0x04E6: + bufpush(0x04E7); + break; + case 0x04E8: + bufpush(0x04E9); + break; + case 0x04EA: + bufpush(0x04EB); + break; + case 0x04EC: + bufpush(0x04ED); + break; + case 0x04EE: + bufpush(0x04EF); + break; + case 0x04F0: + bufpush(0x04F1); + break; + case 0x04F2: + bufpush(0x04F3); + break; + case 0x04F4: + bufpush(0x04F5); + break; + case 0x04F6: + bufpush(0x04F7); + break; + case 0x04F8: + bufpush(0x04F9); + break; + case 0x04FA: + bufpush(0x04FB); + break; + case 0x04FC: + bufpush(0x04FD); + break; + case 0x04FE: + bufpush(0x04FF); + break; + case 0x0500: + bufpush(0x0501); + break; + case 0x0502: + bufpush(0x0503); + break; + case 0x0504: + bufpush(0x0505); + break; + case 0x0506: + bufpush(0x0507); + break; + case 0x0508: + bufpush(0x0509); + break; + case 0x050A: + bufpush(0x050B); + break; + case 0x050C: + bufpush(0x050D); + break; + case 0x050E: + bufpush(0x050F); + break; + case 0x0510: + bufpush(0x0511); + break; + case 0x0512: + bufpush(0x0513); + break; + case 0x0514: + bufpush(0x0515); + break; + case 0x0516: + bufpush(0x0517); + break; + case 0x0518: + bufpush(0x0519); + break; + case 0x051A: + bufpush(0x051B); + break; + case 0x051C: + bufpush(0x051D); + break; + case 0x051E: + bufpush(0x051F); + break; + case 0x0520: + bufpush(0x0521); + break; + case 0x0522: + bufpush(0x0523); + break; + case 0x0524: + bufpush(0x0525); + break; + case 0x0526: + bufpush(0x0527); + break; + case 0x0528: + bufpush(0x0529); + break; + case 0x052A: + bufpush(0x052B); + break; + case 0x052C: + bufpush(0x052D); + break; + case 0x052E: + bufpush(0x052F); + break; + case 0x0531: + bufpush(0x0561); + break; + case 0x0532: + bufpush(0x0562); + break; + case 0x0533: + bufpush(0x0563); + break; + case 0x0534: + bufpush(0x0564); + break; + case 0x0535: + bufpush(0x0565); + break; + case 0x0536: + bufpush(0x0566); + break; + case 0x0537: + bufpush(0x0567); + break; + case 0x0538: + bufpush(0x0568); + break; + case 0x0539: + bufpush(0x0569); + break; + case 0x053A: + bufpush(0x056A); + break; + case 0x053B: + bufpush(0x056B); + break; + case 0x053C: + bufpush(0x056C); + break; + case 0x053D: + bufpush(0x056D); + break; + case 0x053E: + bufpush(0x056E); + break; + case 0x053F: + bufpush(0x056F); + break; + case 0x0540: + bufpush(0x0570); + break; + case 0x0541: + bufpush(0x0571); + break; + case 0x0542: + bufpush(0x0572); + break; + case 0x0543: + bufpush(0x0573); + break; + case 0x0544: + bufpush(0x0574); + break; + case 0x0545: + bufpush(0x0575); + break; + case 0x0546: + bufpush(0x0576); + break; + case 0x0547: + bufpush(0x0577); + break; + case 0x0548: + bufpush(0x0578); + break; + case 0x0549: + bufpush(0x0579); + break; + case 0x054A: + bufpush(0x057A); + break; + case 0x054B: + bufpush(0x057B); + break; + case 0x054C: + bufpush(0x057C); + break; + case 0x054D: + bufpush(0x057D); + break; + case 0x054E: + bufpush(0x057E); + break; + case 0x054F: + bufpush(0x057F); + break; + case 0x0550: + bufpush(0x0580); + break; + case 0x0551: + bufpush(0x0581); + break; + case 0x0552: + bufpush(0x0582); + break; + case 0x0553: + bufpush(0x0583); + break; + case 0x0554: + bufpush(0x0584); + break; + case 0x0555: + bufpush(0x0585); + break; + case 0x0556: + bufpush(0x0586); + break; + case 0x0587: + bufpush(0x0565); + bufpush(0x0582); + break; + case 0x10A0: + bufpush(0x2D00); + break; + case 0x10A1: + bufpush(0x2D01); + break; + case 0x10A2: + bufpush(0x2D02); + break; + case 0x10A3: + bufpush(0x2D03); + break; + case 0x10A4: + bufpush(0x2D04); + break; + case 0x10A5: + bufpush(0x2D05); + break; + case 0x10A6: + bufpush(0x2D06); + break; + case 0x10A7: + bufpush(0x2D07); + break; + case 0x10A8: + bufpush(0x2D08); + break; + case 0x10A9: + bufpush(0x2D09); + break; + case 0x10AA: + bufpush(0x2D0A); + break; + case 0x10AB: + bufpush(0x2D0B); + break; + case 0x10AC: + bufpush(0x2D0C); + break; + case 0x10AD: + bufpush(0x2D0D); + break; + case 0x10AE: + bufpush(0x2D0E); + break; + case 0x10AF: + bufpush(0x2D0F); + break; + case 0x10B0: + bufpush(0x2D10); + break; + case 0x10B1: + bufpush(0x2D11); + break; + case 0x10B2: + bufpush(0x2D12); + break; + case 0x10B3: + bufpush(0x2D13); + break; + case 0x10B4: + bufpush(0x2D14); + break; + case 0x10B5: + bufpush(0x2D15); + break; + case 0x10B6: + bufpush(0x2D16); + break; + case 0x10B7: + bufpush(0x2D17); + break; + case 0x10B8: + bufpush(0x2D18); + break; + case 0x10B9: + bufpush(0x2D19); + break; + case 0x10BA: + bufpush(0x2D1A); + break; + case 0x10BB: + bufpush(0x2D1B); + break; + case 0x10BC: + bufpush(0x2D1C); + break; + case 0x10BD: + bufpush(0x2D1D); + break; + case 0x10BE: + bufpush(0x2D1E); + break; + case 0x10BF: + bufpush(0x2D1F); + break; + case 0x10C0: + bufpush(0x2D20); + break; + case 0x10C1: + bufpush(0x2D21); + break; + case 0x10C2: + bufpush(0x2D22); + break; + case 0x10C3: + bufpush(0x2D23); + break; + case 0x10C4: + bufpush(0x2D24); + break; + case 0x10C5: + bufpush(0x2D25); + break; + case 0x10C7: + bufpush(0x2D27); + break; + case 0x10CD: + bufpush(0x2D2D); + break; + case 0x13F8: + bufpush(0x13F0); + break; + case 0x13F9: + bufpush(0x13F1); + break; + case 0x13FA: + bufpush(0x13F2); + break; + case 0x13FB: + bufpush(0x13F3); + break; + case 0x13FC: + bufpush(0x13F4); + break; + case 0x13FD: + bufpush(0x13F5); + break; + case 0x1C80: + bufpush(0x0432); + break; + case 0x1C81: + bufpush(0x0434); + break; + case 0x1C82: + bufpush(0x043E); + break; + case 0x1C83: + bufpush(0x0441); + break; + case 0x1C84: + bufpush(0x0442); + break; + case 0x1C85: + bufpush(0x0442); + break; + case 0x1C86: + bufpush(0x044A); + break; + case 0x1C87: + bufpush(0x0463); + break; + case 0x1C88: + bufpush(0xA64B); + break; + case 0x1C90: + bufpush(0x10D0); + break; + case 0x1C91: + bufpush(0x10D1); + break; + case 0x1C92: + bufpush(0x10D2); + break; + case 0x1C93: + bufpush(0x10D3); + break; + case 0x1C94: + bufpush(0x10D4); + break; + case 0x1C95: + bufpush(0x10D5); + break; + case 0x1C96: + bufpush(0x10D6); + break; + case 0x1C97: + bufpush(0x10D7); + break; + case 0x1C98: + bufpush(0x10D8); + break; + case 0x1C99: + bufpush(0x10D9); + break; + case 0x1C9A: + bufpush(0x10DA); + break; + case 0x1C9B: + bufpush(0x10DB); + break; + case 0x1C9C: + bufpush(0x10DC); + break; + case 0x1C9D: + bufpush(0x10DD); + break; + case 0x1C9E: + bufpush(0x10DE); + break; + case 0x1C9F: + bufpush(0x10DF); + break; + case 0x1CA0: + bufpush(0x10E0); + break; + case 0x1CA1: + bufpush(0x10E1); + break; + case 0x1CA2: + bufpush(0x10E2); + break; + case 0x1CA3: + bufpush(0x10E3); + break; + case 0x1CA4: + bufpush(0x10E4); + break; + case 0x1CA5: + bufpush(0x10E5); + break; + case 0x1CA6: + bufpush(0x10E6); + break; + case 0x1CA7: + bufpush(0x10E7); + break; + case 0x1CA8: + bufpush(0x10E8); + break; + case 0x1CA9: + bufpush(0x10E9); + break; + case 0x1CAA: + bufpush(0x10EA); + break; + case 0x1CAB: + bufpush(0x10EB); + break; + case 0x1CAC: + bufpush(0x10EC); + break; + case 0x1CAD: + bufpush(0x10ED); + break; + case 0x1CAE: + bufpush(0x10EE); + break; + case 0x1CAF: + bufpush(0x10EF); + break; + case 0x1CB0: + bufpush(0x10F0); + break; + case 0x1CB1: + bufpush(0x10F1); + break; + case 0x1CB2: + bufpush(0x10F2); + break; + case 0x1CB3: + bufpush(0x10F3); + break; + case 0x1CB4: + bufpush(0x10F4); + break; + case 0x1CB5: + bufpush(0x10F5); + break; + case 0x1CB6: + bufpush(0x10F6); + break; + case 0x1CB7: + bufpush(0x10F7); + break; + case 0x1CB8: + bufpush(0x10F8); + break; + case 0x1CB9: + bufpush(0x10F9); + break; + case 0x1CBA: + bufpush(0x10FA); + break; + case 0x1CBD: + bufpush(0x10FD); + break; + case 0x1CBE: + bufpush(0x10FE); + break; + case 0x1CBF: + bufpush(0x10FF); + break; + case 0x1E00: + bufpush(0x1E01); + break; + case 0x1E02: + bufpush(0x1E03); + break; + case 0x1E04: + bufpush(0x1E05); + break; + case 0x1E06: + bufpush(0x1E07); + break; + case 0x1E08: + bufpush(0x1E09); + break; + case 0x1E0A: + bufpush(0x1E0B); + break; + case 0x1E0C: + bufpush(0x1E0D); + break; + case 0x1E0E: + bufpush(0x1E0F); + break; + case 0x1E10: + bufpush(0x1E11); + break; + case 0x1E12: + bufpush(0x1E13); + break; + case 0x1E14: + bufpush(0x1E15); + break; + case 0x1E16: + bufpush(0x1E17); + break; + case 0x1E18: + bufpush(0x1E19); + break; + case 0x1E1A: + bufpush(0x1E1B); + break; + case 0x1E1C: + bufpush(0x1E1D); + break; + case 0x1E1E: + bufpush(0x1E1F); + break; + case 0x1E20: + bufpush(0x1E21); + break; + case 0x1E22: + bufpush(0x1E23); + break; + case 0x1E24: + bufpush(0x1E25); + break; + case 0x1E26: + bufpush(0x1E27); + break; + case 0x1E28: + bufpush(0x1E29); + break; + case 0x1E2A: + bufpush(0x1E2B); + break; + case 0x1E2C: + bufpush(0x1E2D); + break; + case 0x1E2E: + bufpush(0x1E2F); + break; + case 0x1E30: + bufpush(0x1E31); + break; + case 0x1E32: + bufpush(0x1E33); + break; + case 0x1E34: + bufpush(0x1E35); + break; + case 0x1E36: + bufpush(0x1E37); + break; + case 0x1E38: + bufpush(0x1E39); + break; + case 0x1E3A: + bufpush(0x1E3B); + break; + case 0x1E3C: + bufpush(0x1E3D); + break; + case 0x1E3E: + bufpush(0x1E3F); + break; + case 0x1E40: + bufpush(0x1E41); + break; + case 0x1E42: + bufpush(0x1E43); + break; + case 0x1E44: + bufpush(0x1E45); + break; + case 0x1E46: + bufpush(0x1E47); + break; + case 0x1E48: + bufpush(0x1E49); + break; + case 0x1E4A: + bufpush(0x1E4B); + break; + case 0x1E4C: + bufpush(0x1E4D); + break; + case 0x1E4E: + bufpush(0x1E4F); + break; + case 0x1E50: + bufpush(0x1E51); + break; + case 0x1E52: + bufpush(0x1E53); + break; + case 0x1E54: + bufpush(0x1E55); + break; + case 0x1E56: + bufpush(0x1E57); + break; + case 0x1E58: + bufpush(0x1E59); + break; + case 0x1E5A: + bufpush(0x1E5B); + break; + case 0x1E5C: + bufpush(0x1E5D); + break; + case 0x1E5E: + bufpush(0x1E5F); + break; + case 0x1E60: + bufpush(0x1E61); + break; + case 0x1E62: + bufpush(0x1E63); + break; + case 0x1E64: + bufpush(0x1E65); + break; + case 0x1E66: + bufpush(0x1E67); + break; + case 0x1E68: + bufpush(0x1E69); + break; + case 0x1E6A: + bufpush(0x1E6B); + break; + case 0x1E6C: + bufpush(0x1E6D); + break; + case 0x1E6E: + bufpush(0x1E6F); + break; + case 0x1E70: + bufpush(0x1E71); + break; + case 0x1E72: + bufpush(0x1E73); + break; + case 0x1E74: + bufpush(0x1E75); + break; + case 0x1E76: + bufpush(0x1E77); + break; + case 0x1E78: + bufpush(0x1E79); + break; + case 0x1E7A: + bufpush(0x1E7B); + break; + case 0x1E7C: + bufpush(0x1E7D); + break; + case 0x1E7E: + bufpush(0x1E7F); + break; + case 0x1E80: + bufpush(0x1E81); + break; + case 0x1E82: + bufpush(0x1E83); + break; + case 0x1E84: + bufpush(0x1E85); + break; + case 0x1E86: + bufpush(0x1E87); + break; + case 0x1E88: + bufpush(0x1E89); + break; + case 0x1E8A: + bufpush(0x1E8B); + break; + case 0x1E8C: + bufpush(0x1E8D); + break; + case 0x1E8E: + bufpush(0x1E8F); + break; + case 0x1E90: + bufpush(0x1E91); + break; + case 0x1E92: + bufpush(0x1E93); + break; + case 0x1E94: + bufpush(0x1E95); + break; + case 0x1E96: + bufpush(0x0068); + bufpush(0x0331); + break; + case 0x1E97: + bufpush(0x0074); + bufpush(0x0308); + break; + case 0x1E98: + bufpush(0x0077); + bufpush(0x030A); + break; + case 0x1E99: + bufpush(0x0079); + bufpush(0x030A); + break; + case 0x1E9A: + bufpush(0x0061); + bufpush(0x02BE); + break; + case 0x1E9B: + bufpush(0x1E61); + break; + case 0x1E9E: + bufpush(0x0073); + bufpush(0x0073); + break; + case 0x1EA0: + bufpush(0x1EA1); + break; + case 0x1EA2: + bufpush(0x1EA3); + break; + case 0x1EA4: + bufpush(0x1EA5); + break; + case 0x1EA6: + bufpush(0x1EA7); + break; + case 0x1EA8: + bufpush(0x1EA9); + break; + case 0x1EAA: + bufpush(0x1EAB); + break; + case 0x1EAC: + bufpush(0x1EAD); + break; + case 0x1EAE: + bufpush(0x1EAF); + break; + case 0x1EB0: + bufpush(0x1EB1); + break; + case 0x1EB2: + bufpush(0x1EB3); + break; + case 0x1EB4: + bufpush(0x1EB5); + break; + case 0x1EB6: + bufpush(0x1EB7); + break; + case 0x1EB8: + bufpush(0x1EB9); + break; + case 0x1EBA: + bufpush(0x1EBB); + break; + case 0x1EBC: + bufpush(0x1EBD); + break; + case 0x1EBE: + bufpush(0x1EBF); + break; + case 0x1EC0: + bufpush(0x1EC1); + break; + case 0x1EC2: + bufpush(0x1EC3); + break; + case 0x1EC4: + bufpush(0x1EC5); + break; + case 0x1EC6: + bufpush(0x1EC7); + break; + case 0x1EC8: + bufpush(0x1EC9); + break; + case 0x1ECA: + bufpush(0x1ECB); + break; + case 0x1ECC: + bufpush(0x1ECD); + break; + case 0x1ECE: + bufpush(0x1ECF); + break; + case 0x1ED0: + bufpush(0x1ED1); + break; + case 0x1ED2: + bufpush(0x1ED3); + break; + case 0x1ED4: + bufpush(0x1ED5); + break; + case 0x1ED6: + bufpush(0x1ED7); + break; + case 0x1ED8: + bufpush(0x1ED9); + break; + case 0x1EDA: + bufpush(0x1EDB); + break; + case 0x1EDC: + bufpush(0x1EDD); + break; + case 0x1EDE: + bufpush(0x1EDF); + break; + case 0x1EE0: + bufpush(0x1EE1); + break; + case 0x1EE2: + bufpush(0x1EE3); + break; + case 0x1EE4: + bufpush(0x1EE5); + break; + case 0x1EE6: + bufpush(0x1EE7); + break; + case 0x1EE8: + bufpush(0x1EE9); + break; + case 0x1EEA: + bufpush(0x1EEB); + break; + case 0x1EEC: + bufpush(0x1EED); + break; + case 0x1EEE: + bufpush(0x1EEF); + break; + case 0x1EF0: + bufpush(0x1EF1); + break; + case 0x1EF2: + bufpush(0x1EF3); + break; + case 0x1EF4: + bufpush(0x1EF5); + break; + case 0x1EF6: + bufpush(0x1EF7); + break; + case 0x1EF8: + bufpush(0x1EF9); + break; + case 0x1EFA: + bufpush(0x1EFB); + break; + case 0x1EFC: + bufpush(0x1EFD); + break; + case 0x1EFE: + bufpush(0x1EFF); + break; + case 0x1F08: + bufpush(0x1F00); + break; + case 0x1F09: + bufpush(0x1F01); + break; + case 0x1F0A: + bufpush(0x1F02); + break; + case 0x1F0B: + bufpush(0x1F03); + break; + case 0x1F0C: + bufpush(0x1F04); + break; + case 0x1F0D: + bufpush(0x1F05); + break; + case 0x1F0E: + bufpush(0x1F06); + break; + case 0x1F0F: + bufpush(0x1F07); + break; + case 0x1F18: + bufpush(0x1F10); + break; + case 0x1F19: + bufpush(0x1F11); + break; + case 0x1F1A: + bufpush(0x1F12); + break; + case 0x1F1B: + bufpush(0x1F13); + break; + case 0x1F1C: + bufpush(0x1F14); + break; + case 0x1F1D: + bufpush(0x1F15); + break; + case 0x1F28: + bufpush(0x1F20); + break; + case 0x1F29: + bufpush(0x1F21); + break; + case 0x1F2A: + bufpush(0x1F22); + break; + case 0x1F2B: + bufpush(0x1F23); + break; + case 0x1F2C: + bufpush(0x1F24); + break; + case 0x1F2D: + bufpush(0x1F25); + break; + case 0x1F2E: + bufpush(0x1F26); + break; + case 0x1F2F: + bufpush(0x1F27); + break; + case 0x1F38: + bufpush(0x1F30); + break; + case 0x1F39: + bufpush(0x1F31); + break; + case 0x1F3A: + bufpush(0x1F32); + break; + case 0x1F3B: + bufpush(0x1F33); + break; + case 0x1F3C: + bufpush(0x1F34); + break; + case 0x1F3D: + bufpush(0x1F35); + break; + case 0x1F3E: + bufpush(0x1F36); + break; + case 0x1F3F: + bufpush(0x1F37); + break; + case 0x1F48: + bufpush(0x1F40); + break; + case 0x1F49: + bufpush(0x1F41); + break; + case 0x1F4A: + bufpush(0x1F42); + break; + case 0x1F4B: + bufpush(0x1F43); + break; + case 0x1F4C: + bufpush(0x1F44); + break; + case 0x1F4D: + bufpush(0x1F45); + break; + case 0x1F50: + bufpush(0x03C5); + bufpush(0x0313); + break; + case 0x1F52: + bufpush(0x03C5); + bufpush(0x0313); + bufpush(0x0300); + break; + case 0x1F54: + bufpush(0x03C5); + bufpush(0x0313); + bufpush(0x0301); + break; + case 0x1F56: + bufpush(0x03C5); + bufpush(0x0313); + bufpush(0x0342); + break; + case 0x1F59: + bufpush(0x1F51); + break; + case 0x1F5B: + bufpush(0x1F53); + break; + case 0x1F5D: + bufpush(0x1F55); + break; + case 0x1F5F: + bufpush(0x1F57); + break; + case 0x1F68: + bufpush(0x1F60); + break; + case 0x1F69: + bufpush(0x1F61); + break; + case 0x1F6A: + bufpush(0x1F62); + break; + case 0x1F6B: + bufpush(0x1F63); + break; + case 0x1F6C: + bufpush(0x1F64); + break; + case 0x1F6D: + bufpush(0x1F65); + break; + case 0x1F6E: + bufpush(0x1F66); + break; + case 0x1F6F: + bufpush(0x1F67); + break; + case 0x1F80: + bufpush(0x1F00); + bufpush(0x03B9); + break; + case 0x1F81: + bufpush(0x1F01); + bufpush(0x03B9); + break; + case 0x1F82: + bufpush(0x1F02); + bufpush(0x03B9); + break; + case 0x1F83: + bufpush(0x1F03); + bufpush(0x03B9); + break; + case 0x1F84: + bufpush(0x1F04); + bufpush(0x03B9); + break; + case 0x1F85: + bufpush(0x1F05); + bufpush(0x03B9); + break; + case 0x1F86: + bufpush(0x1F06); + bufpush(0x03B9); + break; + case 0x1F87: + bufpush(0x1F07); + bufpush(0x03B9); + break; + case 0x1F88: + bufpush(0x1F00); + bufpush(0x03B9); + break; + case 0x1F89: + bufpush(0x1F01); + bufpush(0x03B9); + break; + case 0x1F8A: + bufpush(0x1F02); + bufpush(0x03B9); + break; + case 0x1F8B: + bufpush(0x1F03); + bufpush(0x03B9); + break; + case 0x1F8C: + bufpush(0x1F04); + bufpush(0x03B9); + break; + case 0x1F8D: + bufpush(0x1F05); + bufpush(0x03B9); + break; + case 0x1F8E: + bufpush(0x1F06); + bufpush(0x03B9); + break; + case 0x1F8F: + bufpush(0x1F07); + bufpush(0x03B9); + break; + case 0x1F90: + bufpush(0x1F20); + bufpush(0x03B9); + break; + case 0x1F91: + bufpush(0x1F21); + bufpush(0x03B9); + break; + case 0x1F92: + bufpush(0x1F22); + bufpush(0x03B9); + break; + case 0x1F93: + bufpush(0x1F23); + bufpush(0x03B9); + break; + case 0x1F94: + bufpush(0x1F24); + bufpush(0x03B9); + break; + case 0x1F95: + bufpush(0x1F25); + bufpush(0x03B9); + break; + case 0x1F96: + bufpush(0x1F26); + bufpush(0x03B9); + break; + case 0x1F97: + bufpush(0x1F27); + bufpush(0x03B9); + break; + case 0x1F98: + bufpush(0x1F20); + bufpush(0x03B9); + break; + case 0x1F99: + bufpush(0x1F21); + bufpush(0x03B9); + break; + case 0x1F9A: + bufpush(0x1F22); + bufpush(0x03B9); + break; + case 0x1F9B: + bufpush(0x1F23); + bufpush(0x03B9); + break; + case 0x1F9C: + bufpush(0x1F24); + bufpush(0x03B9); + break; + case 0x1F9D: + bufpush(0x1F25); + bufpush(0x03B9); + break; + case 0x1F9E: + bufpush(0x1F26); + bufpush(0x03B9); + break; + case 0x1F9F: + bufpush(0x1F27); + bufpush(0x03B9); + break; + case 0x1FA0: + bufpush(0x1F60); + bufpush(0x03B9); + break; + case 0x1FA1: + bufpush(0x1F61); + bufpush(0x03B9); + break; + case 0x1FA2: + bufpush(0x1F62); + bufpush(0x03B9); + break; + case 0x1FA3: + bufpush(0x1F63); + bufpush(0x03B9); + break; + case 0x1FA4: + bufpush(0x1F64); + bufpush(0x03B9); + break; + case 0x1FA5: + bufpush(0x1F65); + bufpush(0x03B9); + break; + case 0x1FA6: + bufpush(0x1F66); + bufpush(0x03B9); + break; + case 0x1FA7: + bufpush(0x1F67); + bufpush(0x03B9); + break; + case 0x1FA8: + bufpush(0x1F60); + bufpush(0x03B9); + break; + case 0x1FA9: + bufpush(0x1F61); + bufpush(0x03B9); + break; + case 0x1FAA: + bufpush(0x1F62); + bufpush(0x03B9); + break; + case 0x1FAB: + bufpush(0x1F63); + bufpush(0x03B9); + break; + case 0x1FAC: + bufpush(0x1F64); + bufpush(0x03B9); + break; + case 0x1FAD: + bufpush(0x1F65); + bufpush(0x03B9); + break; + case 0x1FAE: + bufpush(0x1F66); + bufpush(0x03B9); + break; + case 0x1FAF: + bufpush(0x1F67); + bufpush(0x03B9); + break; + case 0x1FB2: + bufpush(0x1F70); + bufpush(0x03B9); + break; + case 0x1FB3: + bufpush(0x03B1); + bufpush(0x03B9); + break; + case 0x1FB4: + bufpush(0x03AC); + bufpush(0x03B9); + break; + case 0x1FB6: + bufpush(0x03B1); + bufpush(0x0342); + break; + case 0x1FB7: + bufpush(0x03B1); + bufpush(0x0342); + bufpush(0x03B9); + break; + case 0x1FB8: + bufpush(0x1FB0); + break; + case 0x1FB9: + bufpush(0x1FB1); + break; + case 0x1FBA: + bufpush(0x1F70); + break; + case 0x1FBB: + bufpush(0x1F71); + break; + case 0x1FBC: + bufpush(0x03B1); + bufpush(0x03B9); + break; + case 0x1FBE: + bufpush(0x03B9); + break; + case 0x1FC2: + bufpush(0x1F74); + bufpush(0x03B9); + break; + case 0x1FC3: + bufpush(0x03B7); + bufpush(0x03B9); + break; + case 0x1FC4: + bufpush(0x03AE); + bufpush(0x03B9); + break; + case 0x1FC6: + bufpush(0x03B7); + bufpush(0x0342); + break; + case 0x1FC7: + bufpush(0x03B7); + bufpush(0x0342); + bufpush(0x03B9); + break; + case 0x1FC8: + bufpush(0x1F72); + break; + case 0x1FC9: + bufpush(0x1F73); + break; + case 0x1FCA: + bufpush(0x1F74); + break; + case 0x1FCB: + bufpush(0x1F75); + break; + case 0x1FCC: + bufpush(0x03B7); + bufpush(0x03B9); + break; + case 0x1FD2: + bufpush(0x03B9); + bufpush(0x0308); + bufpush(0x0300); + break; + case 0x1FD3: + bufpush(0x03B9); + bufpush(0x0308); + bufpush(0x0301); + break; + case 0x1FD6: + bufpush(0x03B9); + bufpush(0x0342); + break; + case 0x1FD7: + bufpush(0x03B9); + bufpush(0x0308); + bufpush(0x0342); + break; + case 0x1FD8: + bufpush(0x1FD0); + break; + case 0x1FD9: + bufpush(0x1FD1); + break; + case 0x1FDA: + bufpush(0x1F76); + break; + case 0x1FDB: + bufpush(0x1F77); + break; + case 0x1FE2: + bufpush(0x03C5); + bufpush(0x0308); + bufpush(0x0300); + break; + case 0x1FE3: + bufpush(0x03C5); + bufpush(0x0308); + bufpush(0x0301); + break; + case 0x1FE4: + bufpush(0x03C1); + bufpush(0x0313); + break; + case 0x1FE6: + bufpush(0x03C5); + bufpush(0x0342); + break; + case 0x1FE7: + bufpush(0x03C5); + bufpush(0x0308); + bufpush(0x0342); + break; + case 0x1FE8: + bufpush(0x1FE0); + break; + case 0x1FE9: + bufpush(0x1FE1); + break; + case 0x1FEA: + bufpush(0x1F7A); + break; + case 0x1FEB: + bufpush(0x1F7B); + break; + case 0x1FEC: + bufpush(0x1FE5); + break; + case 0x1FF2: + bufpush(0x1F7C); + bufpush(0x03B9); + break; + case 0x1FF3: + bufpush(0x03C9); + bufpush(0x03B9); + break; + case 0x1FF4: + bufpush(0x03CE); + bufpush(0x03B9); + break; + case 0x1FF6: + bufpush(0x03C9); + bufpush(0x0342); + break; + case 0x1FF7: + bufpush(0x03C9); + bufpush(0x0342); + bufpush(0x03B9); + break; + case 0x1FF8: + bufpush(0x1F78); + break; + case 0x1FF9: + bufpush(0x1F79); + break; + case 0x1FFA: + bufpush(0x1F7C); + break; + case 0x1FFB: + bufpush(0x1F7D); + break; + case 0x1FFC: + bufpush(0x03C9); + bufpush(0x03B9); + break; + case 0x2126: + bufpush(0x03C9); + break; + case 0x212A: + bufpush(0x006B); + break; + case 0x212B: + bufpush(0x00E5); + break; + case 0x2132: + bufpush(0x214E); + break; + case 0x2160: + bufpush(0x2170); + break; + case 0x2161: + bufpush(0x2171); + break; + case 0x2162: + bufpush(0x2172); + break; + case 0x2163: + bufpush(0x2173); + break; + case 0x2164: + bufpush(0x2174); + break; + case 0x2165: + bufpush(0x2175); + break; + case 0x2166: + bufpush(0x2176); + break; + case 0x2167: + bufpush(0x2177); + break; + case 0x2168: + bufpush(0x2178); + break; + case 0x2169: + bufpush(0x2179); + break; + case 0x216A: + bufpush(0x217A); + break; + case 0x216B: + bufpush(0x217B); + break; + case 0x216C: + bufpush(0x217C); + break; + case 0x216D: + bufpush(0x217D); + break; + case 0x216E: + bufpush(0x217E); + break; + case 0x216F: + bufpush(0x217F); + break; + case 0x2183: + bufpush(0x2184); + break; + case 0x24B6: + bufpush(0x24D0); + break; + case 0x24B7: + bufpush(0x24D1); + break; + case 0x24B8: + bufpush(0x24D2); + break; + case 0x24B9: + bufpush(0x24D3); + break; + case 0x24BA: + bufpush(0x24D4); + break; + case 0x24BB: + bufpush(0x24D5); + break; + case 0x24BC: + bufpush(0x24D6); + break; + case 0x24BD: + bufpush(0x24D7); + break; + case 0x24BE: + bufpush(0x24D8); + break; + case 0x24BF: + bufpush(0x24D9); + break; + case 0x24C0: + bufpush(0x24DA); + break; + case 0x24C1: + bufpush(0x24DB); + break; + case 0x24C2: + bufpush(0x24DC); + break; + case 0x24C3: + bufpush(0x24DD); + break; + case 0x24C4: + bufpush(0x24DE); + break; + case 0x24C5: + bufpush(0x24DF); + break; + case 0x24C6: + bufpush(0x24E0); + break; + case 0x24C7: + bufpush(0x24E1); + break; + case 0x24C8: + bufpush(0x24E2); + break; + case 0x24C9: + bufpush(0x24E3); + break; + case 0x24CA: + bufpush(0x24E4); + break; + case 0x24CB: + bufpush(0x24E5); + break; + case 0x24CC: + bufpush(0x24E6); + break; + case 0x24CD: + bufpush(0x24E7); + break; + case 0x24CE: + bufpush(0x24E8); + break; + case 0x24CF: + bufpush(0x24E9); + break; + case 0x2C00: + bufpush(0x2C30); + break; + case 0x2C01: + bufpush(0x2C31); + break; + case 0x2C02: + bufpush(0x2C32); + break; + case 0x2C03: + bufpush(0x2C33); + break; + case 0x2C04: + bufpush(0x2C34); + break; + case 0x2C05: + bufpush(0x2C35); + break; + case 0x2C06: + bufpush(0x2C36); + break; + case 0x2C07: + bufpush(0x2C37); + break; + case 0x2C08: + bufpush(0x2C38); + break; + case 0x2C09: + bufpush(0x2C39); + break; + case 0x2C0A: + bufpush(0x2C3A); + break; + case 0x2C0B: + bufpush(0x2C3B); + break; + case 0x2C0C: + bufpush(0x2C3C); + break; + case 0x2C0D: + bufpush(0x2C3D); + break; + case 0x2C0E: + bufpush(0x2C3E); + break; + case 0x2C0F: + bufpush(0x2C3F); + break; + case 0x2C10: + bufpush(0x2C40); + break; + case 0x2C11: + bufpush(0x2C41); + break; + case 0x2C12: + bufpush(0x2C42); + break; + case 0x2C13: + bufpush(0x2C43); + break; + case 0x2C14: + bufpush(0x2C44); + break; + case 0x2C15: + bufpush(0x2C45); + break; + case 0x2C16: + bufpush(0x2C46); + break; + case 0x2C17: + bufpush(0x2C47); + break; + case 0x2C18: + bufpush(0x2C48); + break; + case 0x2C19: + bufpush(0x2C49); + break; + case 0x2C1A: + bufpush(0x2C4A); + break; + case 0x2C1B: + bufpush(0x2C4B); + break; + case 0x2C1C: + bufpush(0x2C4C); + break; + case 0x2C1D: + bufpush(0x2C4D); + break; + case 0x2C1E: + bufpush(0x2C4E); + break; + case 0x2C1F: + bufpush(0x2C4F); + break; + case 0x2C20: + bufpush(0x2C50); + break; + case 0x2C21: + bufpush(0x2C51); + break; + case 0x2C22: + bufpush(0x2C52); + break; + case 0x2C23: + bufpush(0x2C53); + break; + case 0x2C24: + bufpush(0x2C54); + break; + case 0x2C25: + bufpush(0x2C55); + break; + case 0x2C26: + bufpush(0x2C56); + break; + case 0x2C27: + bufpush(0x2C57); + break; + case 0x2C28: + bufpush(0x2C58); + break; + case 0x2C29: + bufpush(0x2C59); + break; + case 0x2C2A: + bufpush(0x2C5A); + break; + case 0x2C2B: + bufpush(0x2C5B); + break; + case 0x2C2C: + bufpush(0x2C5C); + break; + case 0x2C2D: + bufpush(0x2C5D); + break; + case 0x2C2E: + bufpush(0x2C5E); + break; + case 0x2C60: + bufpush(0x2C61); + break; + case 0x2C62: + bufpush(0x026B); + break; + case 0x2C63: + bufpush(0x1D7D); + break; + case 0x2C64: + bufpush(0x027D); + break; + case 0x2C67: + bufpush(0x2C68); + break; + case 0x2C69: + bufpush(0x2C6A); + break; + case 0x2C6B: + bufpush(0x2C6C); + break; + case 0x2C6D: + bufpush(0x0251); + break; + case 0x2C6E: + bufpush(0x0271); + break; + case 0x2C6F: + bufpush(0x0250); + break; + case 0x2C70: + bufpush(0x0252); + break; + case 0x2C72: + bufpush(0x2C73); + break; + case 0x2C75: + bufpush(0x2C76); + break; + case 0x2C7E: + bufpush(0x023F); + break; + case 0x2C7F: + bufpush(0x0240); + break; + case 0x2C80: + bufpush(0x2C81); + break; + case 0x2C82: + bufpush(0x2C83); + break; + case 0x2C84: + bufpush(0x2C85); + break; + case 0x2C86: + bufpush(0x2C87); + break; + case 0x2C88: + bufpush(0x2C89); + break; + case 0x2C8A: + bufpush(0x2C8B); + break; + case 0x2C8C: + bufpush(0x2C8D); + break; + case 0x2C8E: + bufpush(0x2C8F); + break; + case 0x2C90: + bufpush(0x2C91); + break; + case 0x2C92: + bufpush(0x2C93); + break; + case 0x2C94: + bufpush(0x2C95); + break; + case 0x2C96: + bufpush(0x2C97); + break; + case 0x2C98: + bufpush(0x2C99); + break; + case 0x2C9A: + bufpush(0x2C9B); + break; + case 0x2C9C: + bufpush(0x2C9D); + break; + case 0x2C9E: + bufpush(0x2C9F); + break; + case 0x2CA0: + bufpush(0x2CA1); + break; + case 0x2CA2: + bufpush(0x2CA3); + break; + case 0x2CA4: + bufpush(0x2CA5); + break; + case 0x2CA6: + bufpush(0x2CA7); + break; + case 0x2CA8: + bufpush(0x2CA9); + break; + case 0x2CAA: + bufpush(0x2CAB); + break; + case 0x2CAC: + bufpush(0x2CAD); + break; + case 0x2CAE: + bufpush(0x2CAF); + break; + case 0x2CB0: + bufpush(0x2CB1); + break; + case 0x2CB2: + bufpush(0x2CB3); + break; + case 0x2CB4: + bufpush(0x2CB5); + break; + case 0x2CB6: + bufpush(0x2CB7); + break; + case 0x2CB8: + bufpush(0x2CB9); + break; + case 0x2CBA: + bufpush(0x2CBB); + break; + case 0x2CBC: + bufpush(0x2CBD); + break; + case 0x2CBE: + bufpush(0x2CBF); + break; + case 0x2CC0: + bufpush(0x2CC1); + break; + case 0x2CC2: + bufpush(0x2CC3); + break; + case 0x2CC4: + bufpush(0x2CC5); + break; + case 0x2CC6: + bufpush(0x2CC7); + break; + case 0x2CC8: + bufpush(0x2CC9); + break; + case 0x2CCA: + bufpush(0x2CCB); + break; + case 0x2CCC: + bufpush(0x2CCD); + break; + case 0x2CCE: + bufpush(0x2CCF); + break; + case 0x2CD0: + bufpush(0x2CD1); + break; + case 0x2CD2: + bufpush(0x2CD3); + break; + case 0x2CD4: + bufpush(0x2CD5); + break; + case 0x2CD6: + bufpush(0x2CD7); + break; + case 0x2CD8: + bufpush(0x2CD9); + break; + case 0x2CDA: + bufpush(0x2CDB); + break; + case 0x2CDC: + bufpush(0x2CDD); + break; + case 0x2CDE: + bufpush(0x2CDF); + break; + case 0x2CE0: + bufpush(0x2CE1); + break; + case 0x2CE2: + bufpush(0x2CE3); + break; + case 0x2CEB: + bufpush(0x2CEC); + break; + case 0x2CED: + bufpush(0x2CEE); + break; + case 0x2CF2: + bufpush(0x2CF3); + break; + case 0xA640: + bufpush(0xA641); + break; + case 0xA642: + bufpush(0xA643); + break; + case 0xA644: + bufpush(0xA645); + break; + case 0xA646: + bufpush(0xA647); + break; + case 0xA648: + bufpush(0xA649); + break; + case 0xA64A: + bufpush(0xA64B); + break; + case 0xA64C: + bufpush(0xA64D); + break; + case 0xA64E: + bufpush(0xA64F); + break; + case 0xA650: + bufpush(0xA651); + break; + case 0xA652: + bufpush(0xA653); + break; + case 0xA654: + bufpush(0xA655); + break; + case 0xA656: + bufpush(0xA657); + break; + case 0xA658: + bufpush(0xA659); + break; + case 0xA65A: + bufpush(0xA65B); + break; + case 0xA65C: + bufpush(0xA65D); + break; + case 0xA65E: + bufpush(0xA65F); + break; + case 0xA660: + bufpush(0xA661); + break; + case 0xA662: + bufpush(0xA663); + break; + case 0xA664: + bufpush(0xA665); + break; + case 0xA666: + bufpush(0xA667); + break; + case 0xA668: + bufpush(0xA669); + break; + case 0xA66A: + bufpush(0xA66B); + break; + case 0xA66C: + bufpush(0xA66D); + break; + case 0xA680: + bufpush(0xA681); + break; + case 0xA682: + bufpush(0xA683); + break; + case 0xA684: + bufpush(0xA685); + break; + case 0xA686: + bufpush(0xA687); + break; + case 0xA688: + bufpush(0xA689); + break; + case 0xA68A: + bufpush(0xA68B); + break; + case 0xA68C: + bufpush(0xA68D); + break; + case 0xA68E: + bufpush(0xA68F); + break; + case 0xA690: + bufpush(0xA691); + break; + case 0xA692: + bufpush(0xA693); + break; + case 0xA694: + bufpush(0xA695); + break; + case 0xA696: + bufpush(0xA697); + break; + case 0xA698: + bufpush(0xA699); + break; + case 0xA69A: + bufpush(0xA69B); + break; + case 0xA722: + bufpush(0xA723); + break; + case 0xA724: + bufpush(0xA725); + break; + case 0xA726: + bufpush(0xA727); + break; + case 0xA728: + bufpush(0xA729); + break; + case 0xA72A: + bufpush(0xA72B); + break; + case 0xA72C: + bufpush(0xA72D); + break; + case 0xA72E: + bufpush(0xA72F); + break; + case 0xA732: + bufpush(0xA733); + break; + case 0xA734: + bufpush(0xA735); + break; + case 0xA736: + bufpush(0xA737); + break; + case 0xA738: + bufpush(0xA739); + break; + case 0xA73A: + bufpush(0xA73B); + break; + case 0xA73C: + bufpush(0xA73D); + break; + case 0xA73E: + bufpush(0xA73F); + break; + case 0xA740: + bufpush(0xA741); + break; + case 0xA742: + bufpush(0xA743); + break; + case 0xA744: + bufpush(0xA745); + break; + case 0xA746: + bufpush(0xA747); + break; + case 0xA748: + bufpush(0xA749); + break; + case 0xA74A: + bufpush(0xA74B); + break; + case 0xA74C: + bufpush(0xA74D); + break; + case 0xA74E: + bufpush(0xA74F); + break; + case 0xA750: + bufpush(0xA751); + break; + case 0xA752: + bufpush(0xA753); + break; + case 0xA754: + bufpush(0xA755); + break; + case 0xA756: + bufpush(0xA757); + break; + case 0xA758: + bufpush(0xA759); + break; + case 0xA75A: + bufpush(0xA75B); + break; + case 0xA75C: + bufpush(0xA75D); + break; + case 0xA75E: + bufpush(0xA75F); + break; + case 0xA760: + bufpush(0xA761); + break; + case 0xA762: + bufpush(0xA763); + break; + case 0xA764: + bufpush(0xA765); + break; + case 0xA766: + bufpush(0xA767); + break; + case 0xA768: + bufpush(0xA769); + break; + case 0xA76A: + bufpush(0xA76B); + break; + case 0xA76C: + bufpush(0xA76D); + break; + case 0xA76E: + bufpush(0xA76F); + break; + case 0xA779: + bufpush(0xA77A); + break; + case 0xA77B: + bufpush(0xA77C); + break; + case 0xA77D: + bufpush(0x1D79); + break; + case 0xA77E: + bufpush(0xA77F); + break; + case 0xA780: + bufpush(0xA781); + break; + case 0xA782: + bufpush(0xA783); + break; + case 0xA784: + bufpush(0xA785); + break; + case 0xA786: + bufpush(0xA787); + break; + case 0xA78B: + bufpush(0xA78C); + break; + case 0xA78D: + bufpush(0x0265); + break; + case 0xA790: + bufpush(0xA791); + break; + case 0xA792: + bufpush(0xA793); + break; + case 0xA796: + bufpush(0xA797); + break; + case 0xA798: + bufpush(0xA799); + break; + case 0xA79A: + bufpush(0xA79B); + break; + case 0xA79C: + bufpush(0xA79D); + break; + case 0xA79E: + bufpush(0xA79F); + break; + case 0xA7A0: + bufpush(0xA7A1); + break; + case 0xA7A2: + bufpush(0xA7A3); + break; + case 0xA7A4: + bufpush(0xA7A5); + break; + case 0xA7A6: + bufpush(0xA7A7); + break; + case 0xA7A8: + bufpush(0xA7A9); + break; + case 0xA7AA: + bufpush(0x0266); + break; + case 0xA7AB: + bufpush(0x025C); + break; + case 0xA7AC: + bufpush(0x0261); + break; + case 0xA7AD: + bufpush(0x026C); + break; + case 0xA7AE: + bufpush(0x026A); + break; + case 0xA7B0: + bufpush(0x029E); + break; + case 0xA7B1: + bufpush(0x0287); + break; + case 0xA7B2: + bufpush(0x029D); + break; + case 0xA7B3: + bufpush(0xAB53); + break; + case 0xA7B4: + bufpush(0xA7B5); + break; + case 0xA7B6: + bufpush(0xA7B7); + break; + case 0xA7B8: + bufpush(0xA7B9); + break; + case 0xA7BA: + bufpush(0xA7BB); + break; + case 0xA7BC: + bufpush(0xA7BD); + break; + case 0xA7BE: + bufpush(0xA7BF); + break; + case 0xA7C2: + bufpush(0xA7C3); + break; + case 0xA7C4: + bufpush(0xA794); + break; + case 0xA7C5: + bufpush(0x0282); + break; + case 0xA7C6: + bufpush(0x1D8E); + break; + case 0xA7C7: + bufpush(0xA7C8); + break; + case 0xA7C9: + bufpush(0xA7CA); + break; + case 0xA7F5: + bufpush(0xA7F6); + break; + case 0xAB70: + bufpush(0x13A0); + break; + case 0xAB71: + bufpush(0x13A1); + break; + case 0xAB72: + bufpush(0x13A2); + break; + case 0xAB73: + bufpush(0x13A3); + break; + case 0xAB74: + bufpush(0x13A4); + break; + case 0xAB75: + bufpush(0x13A5); + break; + case 0xAB76: + bufpush(0x13A6); + break; + case 0xAB77: + bufpush(0x13A7); + break; + case 0xAB78: + bufpush(0x13A8); + break; + case 0xAB79: + bufpush(0x13A9); + break; + case 0xAB7A: + bufpush(0x13AA); + break; + case 0xAB7B: + bufpush(0x13AB); + break; + case 0xAB7C: + bufpush(0x13AC); + break; + case 0xAB7D: + bufpush(0x13AD); + break; + case 0xAB7E: + bufpush(0x13AE); + break; + case 0xAB7F: + bufpush(0x13AF); + break; + case 0xAB80: + bufpush(0x13B0); + break; + case 0xAB81: + bufpush(0x13B1); + break; + case 0xAB82: + bufpush(0x13B2); + break; + case 0xAB83: + bufpush(0x13B3); + break; + case 0xAB84: + bufpush(0x13B4); + break; + case 0xAB85: + bufpush(0x13B5); + break; + case 0xAB86: + bufpush(0x13B6); + break; + case 0xAB87: + bufpush(0x13B7); + break; + case 0xAB88: + bufpush(0x13B8); + break; + case 0xAB89: + bufpush(0x13B9); + break; + case 0xAB8A: + bufpush(0x13BA); + break; + case 0xAB8B: + bufpush(0x13BB); + break; + case 0xAB8C: + bufpush(0x13BC); + break; + case 0xAB8D: + bufpush(0x13BD); + break; + case 0xAB8E: + bufpush(0x13BE); + break; + case 0xAB8F: + bufpush(0x13BF); + break; + case 0xAB90: + bufpush(0x13C0); + break; + case 0xAB91: + bufpush(0x13C1); + break; + case 0xAB92: + bufpush(0x13C2); + break; + case 0xAB93: + bufpush(0x13C3); + break; + case 0xAB94: + bufpush(0x13C4); + break; + case 0xAB95: + bufpush(0x13C5); + break; + case 0xAB96: + bufpush(0x13C6); + break; + case 0xAB97: + bufpush(0x13C7); + break; + case 0xAB98: + bufpush(0x13C8); + break; + case 0xAB99: + bufpush(0x13C9); + break; + case 0xAB9A: + bufpush(0x13CA); + break; + case 0xAB9B: + bufpush(0x13CB); + break; + case 0xAB9C: + bufpush(0x13CC); + break; + case 0xAB9D: + bufpush(0x13CD); + break; + case 0xAB9E: + bufpush(0x13CE); + break; + case 0xAB9F: + bufpush(0x13CF); + break; + case 0xABA0: + bufpush(0x13D0); + break; + case 0xABA1: + bufpush(0x13D1); + break; + case 0xABA2: + bufpush(0x13D2); + break; + case 0xABA3: + bufpush(0x13D3); + break; + case 0xABA4: + bufpush(0x13D4); + break; + case 0xABA5: + bufpush(0x13D5); + break; + case 0xABA6: + bufpush(0x13D6); + break; + case 0xABA7: + bufpush(0x13D7); + break; + case 0xABA8: + bufpush(0x13D8); + break; + case 0xABA9: + bufpush(0x13D9); + break; + case 0xABAA: + bufpush(0x13DA); + break; + case 0xABAB: + bufpush(0x13DB); + break; + case 0xABAC: + bufpush(0x13DC); + break; + case 0xABAD: + bufpush(0x13DD); + break; + case 0xABAE: + bufpush(0x13DE); + break; + case 0xABAF: + bufpush(0x13DF); + break; + case 0xABB0: + bufpush(0x13E0); + break; + case 0xABB1: + bufpush(0x13E1); + break; + case 0xABB2: + bufpush(0x13E2); + break; + case 0xABB3: + bufpush(0x13E3); + break; + case 0xABB4: + bufpush(0x13E4); + break; + case 0xABB5: + bufpush(0x13E5); + break; + case 0xABB6: + bufpush(0x13E6); + break; + case 0xABB7: + bufpush(0x13E7); + break; + case 0xABB8: + bufpush(0x13E8); + break; + case 0xABB9: + bufpush(0x13E9); + break; + case 0xABBA: + bufpush(0x13EA); + break; + case 0xABBB: + bufpush(0x13EB); + break; + case 0xABBC: + bufpush(0x13EC); + break; + case 0xABBD: + bufpush(0x13ED); + break; + case 0xABBE: + bufpush(0x13EE); + break; + case 0xABBF: + bufpush(0x13EF); + break; + case 0xFB00: + bufpush(0x0066); + bufpush(0x0066); + break; + case 0xFB01: + bufpush(0x0066); + bufpush(0x0069); + break; + case 0xFB02: + bufpush(0x0066); + bufpush(0x006C); + break; + case 0xFB03: + bufpush(0x0066); + bufpush(0x0066); + bufpush(0x0069); + break; + case 0xFB04: + bufpush(0x0066); + bufpush(0x0066); + bufpush(0x006C); + break; + case 0xFB05: + bufpush(0x0073); + bufpush(0x0074); + break; + case 0xFB06: + bufpush(0x0073); + bufpush(0x0074); + break; + case 0xFB13: + bufpush(0x0574); + bufpush(0x0576); + break; + case 0xFB14: + bufpush(0x0574); + bufpush(0x0565); + break; + case 0xFB15: + bufpush(0x0574); + bufpush(0x056B); + break; + case 0xFB16: + bufpush(0x057E); + bufpush(0x0576); + break; + case 0xFB17: + bufpush(0x0574); + bufpush(0x056D); + break; + case 0xFF21: + bufpush(0xFF41); + break; + case 0xFF22: + bufpush(0xFF42); + break; + case 0xFF23: + bufpush(0xFF43); + break; + case 0xFF24: + bufpush(0xFF44); + break; + case 0xFF25: + bufpush(0xFF45); + break; + case 0xFF26: + bufpush(0xFF46); + break; + case 0xFF27: + bufpush(0xFF47); + break; + case 0xFF28: + bufpush(0xFF48); + break; + case 0xFF29: + bufpush(0xFF49); + break; + case 0xFF2A: + bufpush(0xFF4A); + break; + case 0xFF2B: + bufpush(0xFF4B); + break; + case 0xFF2C: + bufpush(0xFF4C); + break; + case 0xFF2D: + bufpush(0xFF4D); + break; + case 0xFF2E: + bufpush(0xFF4E); + break; + case 0xFF2F: + bufpush(0xFF4F); + break; + case 0xFF30: + bufpush(0xFF50); + break; + case 0xFF31: + bufpush(0xFF51); + break; + case 0xFF32: + bufpush(0xFF52); + break; + case 0xFF33: + bufpush(0xFF53); + break; + case 0xFF34: + bufpush(0xFF54); + break; + case 0xFF35: + bufpush(0xFF55); + break; + case 0xFF36: + bufpush(0xFF56); + break; + case 0xFF37: + bufpush(0xFF57); + break; + case 0xFF38: + bufpush(0xFF58); + break; + case 0xFF39: + bufpush(0xFF59); + break; + case 0xFF3A: + bufpush(0xFF5A); + break; + case 0x10400: + bufpush(0x10428); + break; + case 0x10401: + bufpush(0x10429); + break; + case 0x10402: + bufpush(0x1042A); + break; + case 0x10403: + bufpush(0x1042B); + break; + case 0x10404: + bufpush(0x1042C); + break; + case 0x10405: + bufpush(0x1042D); + break; + case 0x10406: + bufpush(0x1042E); + break; + case 0x10407: + bufpush(0x1042F); + break; + case 0x10408: + bufpush(0x10430); + break; + case 0x10409: + bufpush(0x10431); + break; + case 0x1040A: + bufpush(0x10432); + break; + case 0x1040B: + bufpush(0x10433); + break; + case 0x1040C: + bufpush(0x10434); + break; + case 0x1040D: + bufpush(0x10435); + break; + case 0x1040E: + bufpush(0x10436); + break; + case 0x1040F: + bufpush(0x10437); + break; + case 0x10410: + bufpush(0x10438); + break; + case 0x10411: + bufpush(0x10439); + break; + case 0x10412: + bufpush(0x1043A); + break; + case 0x10413: + bufpush(0x1043B); + break; + case 0x10414: + bufpush(0x1043C); + break; + case 0x10415: + bufpush(0x1043D); + break; + case 0x10416: + bufpush(0x1043E); + break; + case 0x10417: + bufpush(0x1043F); + break; + case 0x10418: + bufpush(0x10440); + break; + case 0x10419: + bufpush(0x10441); + break; + case 0x1041A: + bufpush(0x10442); + break; + case 0x1041B: + bufpush(0x10443); + break; + case 0x1041C: + bufpush(0x10444); + break; + case 0x1041D: + bufpush(0x10445); + break; + case 0x1041E: + bufpush(0x10446); + break; + case 0x1041F: + bufpush(0x10447); + break; + case 0x10420: + bufpush(0x10448); + break; + case 0x10421: + bufpush(0x10449); + break; + case 0x10422: + bufpush(0x1044A); + break; + case 0x10423: + bufpush(0x1044B); + break; + case 0x10424: + bufpush(0x1044C); + break; + case 0x10425: + bufpush(0x1044D); + break; + case 0x10426: + bufpush(0x1044E); + break; + case 0x10427: + bufpush(0x1044F); + break; + case 0x104B0: + bufpush(0x104D8); + break; + case 0x104B1: + bufpush(0x104D9); + break; + case 0x104B2: + bufpush(0x104DA); + break; + case 0x104B3: + bufpush(0x104DB); + break; + case 0x104B4: + bufpush(0x104DC); + break; + case 0x104B5: + bufpush(0x104DD); + break; + case 0x104B6: + bufpush(0x104DE); + break; + case 0x104B7: + bufpush(0x104DF); + break; + case 0x104B8: + bufpush(0x104E0); + break; + case 0x104B9: + bufpush(0x104E1); + break; + case 0x104BA: + bufpush(0x104E2); + break; + case 0x104BB: + bufpush(0x104E3); + break; + case 0x104BC: + bufpush(0x104E4); + break; + case 0x104BD: + bufpush(0x104E5); + break; + case 0x104BE: + bufpush(0x104E6); + break; + case 0x104BF: + bufpush(0x104E7); + break; + case 0x104C0: + bufpush(0x104E8); + break; + case 0x104C1: + bufpush(0x104E9); + break; + case 0x104C2: + bufpush(0x104EA); + break; + case 0x104C3: + bufpush(0x104EB); + break; + case 0x104C4: + bufpush(0x104EC); + break; + case 0x104C5: + bufpush(0x104ED); + break; + case 0x104C6: + bufpush(0x104EE); + break; + case 0x104C7: + bufpush(0x104EF); + break; + case 0x104C8: + bufpush(0x104F0); + break; + case 0x104C9: + bufpush(0x104F1); + break; + case 0x104CA: + bufpush(0x104F2); + break; + case 0x104CB: + bufpush(0x104F3); + break; + case 0x104CC: + bufpush(0x104F4); + break; + case 0x104CD: + bufpush(0x104F5); + break; + case 0x104CE: + bufpush(0x104F6); + break; + case 0x104CF: + bufpush(0x104F7); + break; + case 0x104D0: + bufpush(0x104F8); + break; + case 0x104D1: + bufpush(0x104F9); + break; + case 0x104D2: + bufpush(0x104FA); + break; + case 0x104D3: + bufpush(0x104FB); + break; + case 0x10C80: + bufpush(0x10CC0); + break; + case 0x10C81: + bufpush(0x10CC1); + break; + case 0x10C82: + bufpush(0x10CC2); + break; + case 0x10C83: + bufpush(0x10CC3); + break; + case 0x10C84: + bufpush(0x10CC4); + break; + case 0x10C85: + bufpush(0x10CC5); + break; + case 0x10C86: + bufpush(0x10CC6); + break; + case 0x10C87: + bufpush(0x10CC7); + break; + case 0x10C88: + bufpush(0x10CC8); + break; + case 0x10C89: + bufpush(0x10CC9); + break; + case 0x10C8A: + bufpush(0x10CCA); + break; + case 0x10C8B: + bufpush(0x10CCB); + break; + case 0x10C8C: + bufpush(0x10CCC); + break; + case 0x10C8D: + bufpush(0x10CCD); + break; + case 0x10C8E: + bufpush(0x10CCE); + break; + case 0x10C8F: + bufpush(0x10CCF); + break; + case 0x10C90: + bufpush(0x10CD0); + break; + case 0x10C91: + bufpush(0x10CD1); + break; + case 0x10C92: + bufpush(0x10CD2); + break; + case 0x10C93: + bufpush(0x10CD3); + break; + case 0x10C94: + bufpush(0x10CD4); + break; + case 0x10C95: + bufpush(0x10CD5); + break; + case 0x10C96: + bufpush(0x10CD6); + break; + case 0x10C97: + bufpush(0x10CD7); + break; + case 0x10C98: + bufpush(0x10CD8); + break; + case 0x10C99: + bufpush(0x10CD9); + break; + case 0x10C9A: + bufpush(0x10CDA); + break; + case 0x10C9B: + bufpush(0x10CDB); + break; + case 0x10C9C: + bufpush(0x10CDC); + break; + case 0x10C9D: + bufpush(0x10CDD); + break; + case 0x10C9E: + bufpush(0x10CDE); + break; + case 0x10C9F: + bufpush(0x10CDF); + break; + case 0x10CA0: + bufpush(0x10CE0); + break; + case 0x10CA1: + bufpush(0x10CE1); + break; + case 0x10CA2: + bufpush(0x10CE2); + break; + case 0x10CA3: + bufpush(0x10CE3); + break; + case 0x10CA4: + bufpush(0x10CE4); + break; + case 0x10CA5: + bufpush(0x10CE5); + break; + case 0x10CA6: + bufpush(0x10CE6); + break; + case 0x10CA7: + bufpush(0x10CE7); + break; + case 0x10CA8: + bufpush(0x10CE8); + break; + case 0x10CA9: + bufpush(0x10CE9); + break; + case 0x10CAA: + bufpush(0x10CEA); + break; + case 0x10CAB: + bufpush(0x10CEB); + break; + case 0x10CAC: + bufpush(0x10CEC); + break; + case 0x10CAD: + bufpush(0x10CED); + break; + case 0x10CAE: + bufpush(0x10CEE); + break; + case 0x10CAF: + bufpush(0x10CEF); + break; + case 0x10CB0: + bufpush(0x10CF0); + break; + case 0x10CB1: + bufpush(0x10CF1); + break; + case 0x10CB2: + bufpush(0x10CF2); + break; + case 0x118A0: + bufpush(0x118C0); + break; + case 0x118A1: + bufpush(0x118C1); + break; + case 0x118A2: + bufpush(0x118C2); + break; + case 0x118A3: + bufpush(0x118C3); + break; + case 0x118A4: + bufpush(0x118C4); + break; + case 0x118A5: + bufpush(0x118C5); + break; + case 0x118A6: + bufpush(0x118C6); + break; + case 0x118A7: + bufpush(0x118C7); + break; + case 0x118A8: + bufpush(0x118C8); + break; + case 0x118A9: + bufpush(0x118C9); + break; + case 0x118AA: + bufpush(0x118CA); + break; + case 0x118AB: + bufpush(0x118CB); + break; + case 0x118AC: + bufpush(0x118CC); + break; + case 0x118AD: + bufpush(0x118CD); + break; + case 0x118AE: + bufpush(0x118CE); + break; + case 0x118AF: + bufpush(0x118CF); + break; + case 0x118B0: + bufpush(0x118D0); + break; + case 0x118B1: + bufpush(0x118D1); + break; + case 0x118B2: + bufpush(0x118D2); + break; + case 0x118B3: + bufpush(0x118D3); + break; + case 0x118B4: + bufpush(0x118D4); + break; + case 0x118B5: + bufpush(0x118D5); + break; + case 0x118B6: + bufpush(0x118D6); + break; + case 0x118B7: + bufpush(0x118D7); + break; + case 0x118B8: + bufpush(0x118D8); + break; + case 0x118B9: + bufpush(0x118D9); + break; + case 0x118BA: + bufpush(0x118DA); + break; + case 0x118BB: + bufpush(0x118DB); + break; + case 0x118BC: + bufpush(0x118DC); + break; + case 0x118BD: + bufpush(0x118DD); + break; + case 0x118BE: + bufpush(0x118DE); + break; + case 0x118BF: + bufpush(0x118DF); + break; + case 0x16E40: + bufpush(0x16E60); + break; + case 0x16E41: + bufpush(0x16E61); + break; + case 0x16E42: + bufpush(0x16E62); + break; + case 0x16E43: + bufpush(0x16E63); + break; + case 0x16E44: + bufpush(0x16E64); + break; + case 0x16E45: + bufpush(0x16E65); + break; + case 0x16E46: + bufpush(0x16E66); + break; + case 0x16E47: + bufpush(0x16E67); + break; + case 0x16E48: + bufpush(0x16E68); + break; + case 0x16E49: + bufpush(0x16E69); + break; + case 0x16E4A: + bufpush(0x16E6A); + break; + case 0x16E4B: + bufpush(0x16E6B); + break; + case 0x16E4C: + bufpush(0x16E6C); + break; + case 0x16E4D: + bufpush(0x16E6D); + break; + case 0x16E4E: + bufpush(0x16E6E); + break; + case 0x16E4F: + bufpush(0x16E6F); + break; + case 0x16E50: + bufpush(0x16E70); + break; + case 0x16E51: + bufpush(0x16E71); + break; + case 0x16E52: + bufpush(0x16E72); + break; + case 0x16E53: + bufpush(0x16E73); + break; + case 0x16E54: + bufpush(0x16E74); + break; + case 0x16E55: + bufpush(0x16E75); + break; + case 0x16E56: + bufpush(0x16E76); + break; + case 0x16E57: + bufpush(0x16E77); + break; + case 0x16E58: + bufpush(0x16E78); + break; + case 0x16E59: + bufpush(0x16E79); + break; + case 0x16E5A: + bufpush(0x16E7A); + break; + case 0x16E5B: + bufpush(0x16E7B); + break; + case 0x16E5C: + bufpush(0x16E7C); + break; + case 0x16E5D: + bufpush(0x16E7D); + break; + case 0x16E5E: + bufpush(0x16E7E); + break; + case 0x16E5F: + bufpush(0x16E7F); + break; + case 0x1E900: + bufpush(0x1E922); + break; + case 0x1E901: + bufpush(0x1E923); + break; + case 0x1E902: + bufpush(0x1E924); + break; + case 0x1E903: + bufpush(0x1E925); + break; + case 0x1E904: + bufpush(0x1E926); + break; + case 0x1E905: + bufpush(0x1E927); + break; + case 0x1E906: + bufpush(0x1E928); + break; + case 0x1E907: + bufpush(0x1E929); + break; + case 0x1E908: + bufpush(0x1E92A); + break; + case 0x1E909: + bufpush(0x1E92B); + break; + case 0x1E90A: + bufpush(0x1E92C); + break; + case 0x1E90B: + bufpush(0x1E92D); + break; + case 0x1E90C: + bufpush(0x1E92E); + break; + case 0x1E90D: + bufpush(0x1E92F); + break; + case 0x1E90E: + bufpush(0x1E930); + break; + case 0x1E90F: + bufpush(0x1E931); + break; + case 0x1E910: + bufpush(0x1E932); + break; + case 0x1E911: + bufpush(0x1E933); + break; + case 0x1E912: + bufpush(0x1E934); + break; + case 0x1E913: + bufpush(0x1E935); + break; + case 0x1E914: + bufpush(0x1E936); + break; + case 0x1E915: + bufpush(0x1E937); + break; + case 0x1E916: + bufpush(0x1E938); + break; + case 0x1E917: + bufpush(0x1E939); + break; + case 0x1E918: + bufpush(0x1E93A); + break; + case 0x1E919: + bufpush(0x1E93B); + break; + case 0x1E91A: + bufpush(0x1E93C); + break; + case 0x1E91B: + bufpush(0x1E93D); + break; + case 0x1E91C: + bufpush(0x1E93E); + break; + case 0x1E91D: + bufpush(0x1E93F); + break; + case 0x1E91E: + bufpush(0x1E940); + break; + case 0x1E91F: + bufpush(0x1E941); + break; + case 0x1E920: + bufpush(0x1E942); + break; + case 0x1E921: + bufpush(0x1E943); + break; + default: + bufpush(c); + } diff --git a/lib/cmark/src/chunk.h b/lib/cmark/src/chunk.h new file mode 100644 index 0000000..bf3c42e --- /dev/null +++ b/lib/cmark/src/chunk.h @@ -0,0 +1,69 @@ +#ifndef CMARK_CHUNK_H +#define CMARK_CHUNK_H + +#include <string.h> +#include <stdlib.h> +#include <assert.h> +#include "cmark.h" +#include "buffer.h" +#include "cmark_ctype.h" + +#define CMARK_CHUNK_EMPTY \ + { NULL, 0 } + +typedef struct { + const unsigned char *data; + bufsize_t len; +} cmark_chunk; + +// NOLINTNEXTLINE(clang-diagnostic-unused-function) +static CMARK_INLINE void cmark_chunk_free(cmark_chunk *c) { + c->data = NULL; + c->len = 0; +} + +static CMARK_INLINE void cmark_chunk_ltrim(cmark_chunk *c) { + while (c->len && cmark_isspace(c->data[0])) { + c->data++; + c->len--; + } +} + +static CMARK_INLINE void cmark_chunk_rtrim(cmark_chunk *c) { + while (c->len > 0) { + if (!cmark_isspace(c->data[c->len - 1])) + break; + + c->len--; + } +} + +// NOLINTNEXTLINE(clang-diagnostic-unused-function) +static CMARK_INLINE void cmark_chunk_trim(cmark_chunk *c) { + cmark_chunk_ltrim(c); + cmark_chunk_rtrim(c); +} + +// NOLINTNEXTLINE(clang-diagnostic-unused-function) +static CMARK_INLINE bufsize_t cmark_chunk_strchr(cmark_chunk *ch, int c, + bufsize_t offset) { + const unsigned char *p = + (unsigned char *)memchr(ch->data + offset, c, ch->len - offset); + return p ? (bufsize_t)(p - ch->data) : ch->len; +} + +// NOLINTNEXTLINE(clang-diagnostic-unused-function) +static CMARK_INLINE cmark_chunk cmark_chunk_literal(const char *data) { + bufsize_t len = data ? (bufsize_t)strlen(data) : 0; + cmark_chunk c = {(unsigned char *)data, len}; + return c; +} + +// NOLINTNEXTLINE(clang-diagnostic-unused-function) +static CMARK_INLINE cmark_chunk cmark_chunk_dup(const cmark_chunk *ch, + bufsize_t pos, bufsize_t len) { + cmark_chunk c = {ch->data + pos, len}; + return c; +} + +#endif diff --git a/lib/cmark/src/cmark.c b/lib/cmark/src/cmark.c new file mode 100644 index 0000000..8bbca03 --- /dev/null +++ b/lib/cmark/src/cmark.c @@ -0,0 +1,48 @@ +#include <stdlib.h> +#include <assert.h> +#include <stdio.h> +#include "node.h" +#include "houdini.h" +#include "cmark.h" +#include "buffer.h" + +int cmark_version() { return CMARK_VERSION; } + +const char *cmark_version_string() { return CMARK_VERSION_STRING; } + +static void *xcalloc(size_t nmem, size_t size) { + void *ptr = calloc(nmem, size); + if (!ptr) { + fprintf(stderr, "[cmark] calloc returned null pointer, aborting\n"); + abort(); + } + return ptr; +} + +static void *xrealloc(void *ptr, size_t size) { + void *new_ptr = realloc(ptr, size); + if (!new_ptr) { + fprintf(stderr, "[cmark] realloc returned null pointer, aborting\n"); + abort(); + } + return new_ptr; +} + +cmark_mem DEFAULT_MEM_ALLOCATOR = {xcalloc, xrealloc, free}; + +cmark_mem *cmark_get_default_mem_allocator() { + return &DEFAULT_MEM_ALLOCATOR; +} + + +char *cmark_markdown_to_html(const char *text, size_t len, int options) { + cmark_node *doc; + char *result; + + doc = cmark_parse_document(text, len, options); + + result = cmark_render_html(doc, options); + cmark_node_free(doc); + + return result; +} diff --git a/lib/cmark/src/cmark.h b/lib/cmark/src/cmark.h new file mode 100644 index 0000000..a37c185 --- /dev/null +++ b/lib/cmark/src/cmark.h @@ -0,0 +1,654 @@ +#ifndef CMARK_H +#define CMARK_H + +#include <stdio.h> +#include <cmark_export.h> +#include <cmark_version.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** # NAME + * + * **cmark** - CommonMark parsing, manipulating, and rendering + */ + +/** # DESCRIPTION + * + * ## Simple Interface + */ + +/** Convert 'text' (assumed to be a UTF-8 encoded string with length + * 'len') from CommonMark Markdown to HTML, returning a null-terminated, + * UTF-8-encoded string. It is the caller's responsibility + * to free the returned buffer. + */ +CMARK_EXPORT +char *cmark_markdown_to_html(const char *text, size_t len, int options); + +/** ## Node Structure + */ + +typedef enum { + /* Error status */ + CMARK_NODE_NONE, + + /* Block */ + CMARK_NODE_DOCUMENT, + CMARK_NODE_BLOCK_QUOTE, + CMARK_NODE_LIST, + CMARK_NODE_ITEM, + CMARK_NODE_CODE_BLOCK, + CMARK_NODE_HTML_BLOCK, + CMARK_NODE_CUSTOM_BLOCK, + CMARK_NODE_PARAGRAPH, + CMARK_NODE_HEADING, + CMARK_NODE_THEMATIC_BREAK, + + CMARK_NODE_FIRST_BLOCK = CMARK_NODE_DOCUMENT, + CMARK_NODE_LAST_BLOCK = CMARK_NODE_THEMATIC_BREAK, + + /* Inline */ + CMARK_NODE_TEXT, + CMARK_NODE_SOFTBREAK, + CMARK_NODE_LINEBREAK, + CMARK_NODE_CODE, + CMARK_NODE_HTML_INLINE, + CMARK_NODE_CUSTOM_INLINE, + CMARK_NODE_EMPH, + CMARK_NODE_STRONG, + CMARK_NODE_LINK, + CMARK_NODE_IMAGE, + + CMARK_NODE_FIRST_INLINE = CMARK_NODE_TEXT, + CMARK_NODE_LAST_INLINE = CMARK_NODE_IMAGE, +} cmark_node_type; + +/* For backwards compatibility: */ +#define CMARK_NODE_HEADER CMARK_NODE_HEADING +#define CMARK_NODE_HRULE CMARK_NODE_THEMATIC_BREAK +#define CMARK_NODE_HTML CMARK_NODE_HTML_BLOCK +#define CMARK_NODE_INLINE_HTML CMARK_NODE_HTML_INLINE + +typedef enum { + CMARK_NO_LIST, + CMARK_BULLET_LIST, + CMARK_ORDERED_LIST +} cmark_list_type; + +typedef enum { + CMARK_NO_DELIM, + CMARK_PERIOD_DELIM, + CMARK_PAREN_DELIM +} cmark_delim_type; + +typedef struct cmark_node cmark_node; +typedef struct cmark_parser cmark_parser; +typedef struct cmark_iter cmark_iter; + +/** + * ## Custom memory allocator support + */ + +/** Defines the memory allocation functions to be used by CMark + * when parsing and allocating a document tree + */ +typedef struct cmark_mem { + void *(*calloc)(size_t, size_t); + void *(*realloc)(void *, size_t); + void (*free)(void *); +} cmark_mem; + +/** Returns a pointer to the default memory allocator. + */ +CMARK_EXPORT cmark_mem *cmark_get_default_mem_allocator(); + +/** + * ## Creating and Destroying Nodes + */ + +/** Creates a new node of type 'type'. Note that the node may have + * other required properties, which it is the caller's responsibility + * to assign. + */ +CMARK_EXPORT cmark_node *cmark_node_new(cmark_node_type type); + +/** Same as `cmark_node_new`, but explicitly listing the memory + * allocator used to allocate the node. Note: be sure to use the same + * allocator for every node in a tree, or bad things can happen. + */ +CMARK_EXPORT cmark_node *cmark_node_new_with_mem(cmark_node_type type, + cmark_mem *mem); + +/** Frees the memory allocated for a node and any children. + */ +CMARK_EXPORT void cmark_node_free(cmark_node *node); + +/** + * ## Tree Traversal + */ + +/** Returns the next node in the sequence after 'node', or NULL if + * there is none. + */ +CMARK_EXPORT cmark_node *cmark_node_next(cmark_node *node); + +/** Returns the previous node in the sequence after 'node', or NULL if + * there is none. + */ +CMARK_EXPORT cmark_node *cmark_node_previous(cmark_node *node); + +/** Returns the parent of 'node', or NULL if there is none. + */ +CMARK_EXPORT cmark_node *cmark_node_parent(cmark_node *node); + +/** Returns the first child of 'node', or NULL if 'node' has no children. + */ +CMARK_EXPORT cmark_node *cmark_node_first_child(cmark_node *node); + +/** Returns the last child of 'node', or NULL if 'node' has no children. + */ +CMARK_EXPORT cmark_node *cmark_node_last_child(cmark_node *node); + +/** + * ## Iterator + * + * An iterator will walk through a tree of nodes, starting from a root + * node, returning one node at a time, together with information about + * whether the node is being entered or exited. The iterator will + * first descend to a child node, if there is one. When there is no + * child, the iterator will go to the next sibling. When there is no + * next sibling, the iterator will return to the parent (but with + * a 'cmark_event_type' of `CMARK_EVENT_EXIT`). The iterator will + * return `CMARK_EVENT_DONE` when it reaches the root node again. + * One natural application is an HTML renderer, where an `ENTER` event + * outputs an open tag and an `EXIT` event outputs a close tag. + * An iterator might also be used to transform an AST in some systematic + * way, for example, turning all level-3 headings into regular paragraphs. + * + * void + * usage_example(cmark_node *root) { + * cmark_event_type ev_type; + * cmark_iter *iter = cmark_iter_new(root); + * + * while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + * cmark_node *cur = cmark_iter_get_node(iter); + * // Do something with `cur` and `ev_type` + * } + * + * cmark_iter_free(iter); + * } + * + * Iterators will never return `EXIT` events for leaf nodes, which are nodes + * of type: + * + * * CMARK_NODE_HTML_BLOCK + * * CMARK_NODE_THEMATIC_BREAK + * * CMARK_NODE_CODE_BLOCK + * * CMARK_NODE_TEXT + * * CMARK_NODE_SOFTBREAK + * * CMARK_NODE_LINEBREAK + * * CMARK_NODE_CODE + * * CMARK_NODE_HTML_INLINE + * + * Nodes must only be modified after an `EXIT` event, or an `ENTER` event for + * leaf nodes. + */ + +typedef enum { + CMARK_EVENT_NONE, + CMARK_EVENT_DONE, + CMARK_EVENT_ENTER, + CMARK_EVENT_EXIT +} cmark_event_type; + +/** Creates a new iterator starting at 'root'. The current node and event + * type are undefined until 'cmark_iter_next' is called for the first time. + * The memory allocated for the iterator should be released using + * 'cmark_iter_free' when it is no longer needed. + */ +CMARK_EXPORT +cmark_iter *cmark_iter_new(cmark_node *root); + +/** Frees the memory allocated for an iterator. + */ +CMARK_EXPORT +void cmark_iter_free(cmark_iter *iter); + +/** Advances to the next node and returns the event type (`CMARK_EVENT_ENTER`, + * `CMARK_EVENT_EXIT` or `CMARK_EVENT_DONE`). + */ +CMARK_EXPORT +cmark_event_type cmark_iter_next(cmark_iter *iter); + +/** Returns the current node. + */ +CMARK_EXPORT +cmark_node *cmark_iter_get_node(cmark_iter *iter); + +/** Returns the current event type. + */ +CMARK_EXPORT +cmark_event_type cmark_iter_get_event_type(cmark_iter *iter); + +/** Returns the root node. + */ +CMARK_EXPORT +cmark_node *cmark_iter_get_root(cmark_iter *iter); + +/** Resets the iterator so that the current node is 'current' and + * the event type is 'event_type'. The new current node must be a + * descendant of the root node or the root node itself. + */ +CMARK_EXPORT +void cmark_iter_reset(cmark_iter *iter, cmark_node *current, + cmark_event_type event_type); + +/** + * ## Accessors + */ + +/** Returns the user data of 'node'. + */ +CMARK_EXPORT void *cmark_node_get_user_data(cmark_node *node); + +/** Sets arbitrary user data for 'node'. Returns 1 on success, + * 0 on failure. + */ +CMARK_EXPORT int cmark_node_set_user_data(cmark_node *node, void *user_data); + +/** Returns the type of 'node', or `CMARK_NODE_NONE` on error. + */ +CMARK_EXPORT cmark_node_type cmark_node_get_type(cmark_node *node); + +/** Like 'cmark_node_get_type', but returns a string representation + of the type, or `"<unknown>"`. + */ +CMARK_EXPORT +const char *cmark_node_get_type_string(cmark_node *node); + +/** Returns the string contents of 'node', or an empty + string if none is set. Returns NULL if called on a + node that does not have string content. + */ +CMARK_EXPORT const char *cmark_node_get_literal(cmark_node *node); + +/** Sets the string contents of 'node'. Returns 1 on success, + * 0 on failure. + */ +CMARK_EXPORT int cmark_node_set_literal(cmark_node *node, const char *content); + +/** Returns the heading level of 'node', or 0 if 'node' is not a heading. + */ +CMARK_EXPORT int cmark_node_get_heading_level(cmark_node *node); + +/* For backwards compatibility */ +#define cmark_node_get_header_level cmark_node_get_heading_level +#define cmark_node_set_header_level cmark_node_set_heading_level + +/** Sets the heading level of 'node', returning 1 on success and 0 on error. + */ +CMARK_EXPORT int cmark_node_set_heading_level(cmark_node *node, int level); + +/** Returns the list type of 'node', or `CMARK_NO_LIST` if 'node' + * is not a list. + */ +CMARK_EXPORT cmark_list_type cmark_node_get_list_type(cmark_node *node); + +/** Sets the list type of 'node', returning 1 on success and 0 on error. + */ +CMARK_EXPORT int cmark_node_set_list_type(cmark_node *node, + cmark_list_type type); + +/** Returns the list delimiter type of 'node', or `CMARK_NO_DELIM` if 'node' + * is not a list. + */ +CMARK_EXPORT cmark_delim_type cmark_node_get_list_delim(cmark_node *node); + +/** Sets the list delimiter type of 'node', returning 1 on success and 0 + * on error. + */ +CMARK_EXPORT int cmark_node_set_list_delim(cmark_node *node, + cmark_delim_type delim); + +/** Returns starting number of 'node', if it is an ordered list, otherwise 0. + */ +CMARK_EXPORT int cmark_node_get_list_start(cmark_node *node); + +/** Sets starting number of 'node', if it is an ordered list. Returns 1 + * on success, 0 on failure. + */ +CMARK_EXPORT int cmark_node_set_list_start(cmark_node *node, int start); + +/** Returns 1 if 'node' is a tight list, 0 otherwise. + */ +CMARK_EXPORT int cmark_node_get_list_tight(cmark_node *node); + +/** Sets the "tightness" of a list. Returns 1 on success, 0 on failure. + */ +CMARK_EXPORT int cmark_node_set_list_tight(cmark_node *node, int tight); + +/** Returns the info string from a fenced code block. + */ +CMARK_EXPORT const char *cmark_node_get_fence_info(cmark_node *node); + +/** Sets the info string in a fenced code block, returning 1 on + * success and 0 on failure. + */ +CMARK_EXPORT int cmark_node_set_fence_info(cmark_node *node, const char *info); + +/** Returns the URL of a link or image 'node', or an empty string + if no URL is set. Returns NULL if called on a node that is + not a link or image. + */ +CMARK_EXPORT const char *cmark_node_get_url(cmark_node *node); + +/** Sets the URL of a link or image 'node'. Returns 1 on success, + * 0 on failure. + */ +CMARK_EXPORT int cmark_node_set_url(cmark_node *node, const char *url); + +/** Returns the title of a link or image 'node', or an empty + string if no title is set. Returns NULL if called on a node + that is not a link or image. + */ +CMARK_EXPORT const char *cmark_node_get_title(cmark_node *node); + +/** Sets the title of a link or image 'node'. Returns 1 on success, + * 0 on failure. + */ +CMARK_EXPORT int cmark_node_set_title(cmark_node *node, const char *title); + +/** Returns the literal "on enter" text for a custom 'node', or + an empty string if no on_enter is set. Returns NULL if called + on a non-custom node. + */ +CMARK_EXPORT const char *cmark_node_get_on_enter(cmark_node *node); + +/** Sets the literal text to render "on enter" for a custom 'node'. + Any children of the node will be rendered after this text. + Returns 1 on success 0 on failure. + */ +CMARK_EXPORT int cmark_node_set_on_enter(cmark_node *node, + const char *on_enter); + +/** Returns the literal "on exit" text for a custom 'node', or + an empty string if no on_exit is set. Returns NULL if + called on a non-custom node. + */ +CMARK_EXPORT const char *cmark_node_get_on_exit(cmark_node *node); + +/** Sets the literal text to render "on exit" for a custom 'node'. + Any children of the node will be rendered before this text. + Returns 1 on success 0 on failure. + */ +CMARK_EXPORT int cmark_node_set_on_exit(cmark_node *node, const char *on_exit); + +/** Returns the line on which 'node' begins. + */ +CMARK_EXPORT int cmark_node_get_start_line(cmark_node *node); + +/** Returns the column at which 'node' begins. + */ +CMARK_EXPORT int cmark_node_get_start_column(cmark_node *node); + +/** Returns the line on which 'node' ends. + */ +CMARK_EXPORT int cmark_node_get_end_line(cmark_node *node); + +/** Returns the column at which 'node' ends. + */ +CMARK_EXPORT int cmark_node_get_end_column(cmark_node *node); + +/** + * ## Tree Manipulation + */ + +/** Unlinks a 'node', removing it from the tree, but not freeing its + * memory. (Use 'cmark_node_free' for that.) + */ +CMARK_EXPORT void cmark_node_unlink(cmark_node *node); + +/** Inserts 'sibling' before 'node'. Returns 1 on success, 0 on failure. + */ +CMARK_EXPORT int cmark_node_insert_before(cmark_node *node, + cmark_node *sibling); + +/** Inserts 'sibling' after 'node'. Returns 1 on success, 0 on failure. + */ +CMARK_EXPORT int cmark_node_insert_after(cmark_node *node, cmark_node *sibling); + +/** Replaces 'oldnode' with 'newnode' and unlinks 'oldnode' (but does + * not free its memory). + * Returns 1 on success, 0 on failure. + */ +CMARK_EXPORT int cmark_node_replace(cmark_node *oldnode, cmark_node *newnode); + +/** Adds 'child' to the beginning of the children of 'node'. + * Returns 1 on success, 0 on failure. + */ +CMARK_EXPORT int cmark_node_prepend_child(cmark_node *node, cmark_node *child); + +/** Adds 'child' to the end of the children of 'node'. + * Returns 1 on success, 0 on failure. + */ +CMARK_EXPORT int cmark_node_append_child(cmark_node *node, cmark_node *child); + +/** Consolidates adjacent text nodes. + */ +CMARK_EXPORT void cmark_consolidate_text_nodes(cmark_node *root); + +/** + * ## Parsing + * + * Simple interface: + * + * cmark_node *document = cmark_parse_document("Hello *world*", 13, + * CMARK_OPT_DEFAULT); + * + * Streaming interface: + * + * cmark_parser *parser = cmark_parser_new(CMARK_OPT_DEFAULT); + * FILE *fp = fopen("myfile.md", "rb"); + * while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0) { + * cmark_parser_feed(parser, buffer, bytes); + * if (bytes < sizeof(buffer)) { + * break; + * } + * } + * document = cmark_parser_finish(parser); + * cmark_parser_free(parser); + */ + +/** Creates a new parser object. + */ +CMARK_EXPORT +cmark_parser *cmark_parser_new(int options); + +/** Creates a new parser object with the given memory allocator + */ +CMARK_EXPORT +cmark_parser *cmark_parser_new_with_mem(int options, cmark_mem *mem); + +/** Frees memory allocated for a parser object. + */ +CMARK_EXPORT +void cmark_parser_free(cmark_parser *parser); + +/** Feeds a string of length 'len' to 'parser'. + */ +CMARK_EXPORT +void cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len); + +/** Finish parsing and return a pointer to a tree of nodes. + */ +CMARK_EXPORT +cmark_node *cmark_parser_finish(cmark_parser *parser); + +/** Parse a CommonMark document in 'buffer' of length 'len'. + * Returns a pointer to a tree of nodes. The memory allocated for + * the node tree should be released using 'cmark_node_free' + * when it is no longer needed. + */ +CMARK_EXPORT +cmark_node *cmark_parse_document(const char *buffer, size_t len, int options); + +/** Parse a CommonMark document in file 'f', returning a pointer to + * a tree of nodes. The memory allocated for the node tree should be + * released using 'cmark_node_free' when it is no longer needed. + */ +CMARK_EXPORT +cmark_node *cmark_parse_file(FILE *f, int options); + +/** + * ## Rendering + */ + +/** Render a 'node' tree as XML. It is the caller's responsibility + * to free the returned buffer. + */ +CMARK_EXPORT +char *cmark_render_xml(cmark_node *root, int options); + +/** Render a 'node' tree as an HTML fragment. It is up to the user + * to add an appropriate header and footer. It is the caller's + * responsibility to free the returned buffer. + */ +CMARK_EXPORT +char *cmark_render_html(cmark_node *root, int options); + +/** Render a 'node' tree as a groff man page, without the header. + * It is the caller's responsibility to free the returned buffer. + */ +CMARK_EXPORT +char *cmark_render_man(cmark_node *root, int options, int width); + +/** Render a 'node' tree as a commonmark document. + * It is the caller's responsibility to free the returned buffer. + */ +CMARK_EXPORT +char *cmark_render_commonmark(cmark_node *root, int options, int width); + +/** Render a 'node' tree as a LaTeX document. + * It is the caller's responsibility to free the returned buffer. + */ +CMARK_EXPORT +char *cmark_render_latex(cmark_node *root, int options, int width); + +/** + * ## Options + */ + +/** Default options. + */ +#define CMARK_OPT_DEFAULT 0 + +/** + * ### Options affecting rendering + */ + +/** Include a `data-sourcepos` attribute on all block elements. + */ +#define CMARK_OPT_SOURCEPOS (1 << 1) + +/** Render `softbreak` elements as hard line breaks. + */ +#define CMARK_OPT_HARDBREAKS (1 << 2) + +/** `CMARK_OPT_SAFE` is defined here for API compatibility, + but it no longer has any effect. "Safe" mode is now the default: + set `CMARK_OPT_UNSAFE` to disable it. + */ +#define CMARK_OPT_SAFE (1 << 3) + +/** Render raw HTML and unsafe links (`javascript:`, `vbscript:`, + * `file:`, and `data:`, except for `image/png`, `image/gif`, + * `image/jpeg`, or `image/webp` mime types). By default, + * raw HTML is replaced by a placeholder HTML comment. Unsafe + * links are replaced by empty strings. + */ +#define CMARK_OPT_UNSAFE (1 << 17) + +/** Render `softbreak` elements as spaces. + */ +#define CMARK_OPT_NOBREAKS (1 << 4) + +/** + * ### Options affecting parsing + */ + +/** Legacy option (no effect). + */ +#define CMARK_OPT_NORMALIZE (1 << 8) + +/** Validate UTF-8 in the input before parsing, replacing illegal + * sequences with the replacement character U+FFFD. + */ +#define CMARK_OPT_VALIDATE_UTF8 (1 << 9) + +/** Convert straight quotes to curly, --- to em dashes, -- to en dashes. + */ +#define CMARK_OPT_SMART (1 << 10) + +/** + * ## Version information + */ + +/** The library version as integer for runtime checks. Also available as + * macro CMARK_VERSION for compile time checks. + * + * * Bits 16-23 contain the major version. + * * Bits 8-15 contain the minor version. + * * Bits 0-7 contain the patchlevel. + * + * In hexadecimal format, the number 0x010203 represents version 1.2.3. + */ +CMARK_EXPORT +int cmark_version(void); + +/** The library version string for runtime checks. Also available as + * macro CMARK_VERSION_STRING for compile time checks. + */ +CMARK_EXPORT +const char *cmark_version_string(void); + +/** # AUTHORS + * + * John MacFarlane, Vicent Marti, Kārlis Gaņģis, Nick Wellnhofer. + */ + +#ifndef CMARK_NO_SHORT_NAMES +#define NODE_DOCUMENT CMARK_NODE_DOCUMENT +#define NODE_BLOCK_QUOTE CMARK_NODE_BLOCK_QUOTE +#define NODE_LIST CMARK_NODE_LIST +#define NODE_ITEM CMARK_NODE_ITEM +#define NODE_CODE_BLOCK CMARK_NODE_CODE_BLOCK +#define NODE_HTML_BLOCK CMARK_NODE_HTML_BLOCK +#define NODE_CUSTOM_BLOCK CMARK_NODE_CUSTOM_BLOCK +#define NODE_PARAGRAPH CMARK_NODE_PARAGRAPH +#define NODE_HEADING CMARK_NODE_HEADING +#define NODE_HEADER CMARK_NODE_HEADER +#define NODE_THEMATIC_BREAK CMARK_NODE_THEMATIC_BREAK +#define NODE_HRULE CMARK_NODE_HRULE +#define NODE_TEXT CMARK_NODE_TEXT +#define NODE_SOFTBREAK CMARK_NODE_SOFTBREAK +#define NODE_LINEBREAK CMARK_NODE_LINEBREAK +#define NODE_CODE CMARK_NODE_CODE +#define NODE_HTML_INLINE CMARK_NODE_HTML_INLINE +#define NODE_CUSTOM_INLINE CMARK_NODE_CUSTOM_INLINE +#define NODE_EMPH CMARK_NODE_EMPH +#define NODE_STRONG CMARK_NODE_STRONG +#define NODE_LINK CMARK_NODE_LINK +#define NODE_IMAGE CMARK_NODE_IMAGE +#define BULLET_LIST CMARK_BULLET_LIST +#define ORDERED_LIST CMARK_ORDERED_LIST +#define PERIOD_DELIM CMARK_PERIOD_DELIM +#define PAREN_DELIM CMARK_PAREN_DELIM +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/cmarkConfig.cmake.in b/lib/cmark/src/cmarkConfig.cmake.in new file mode 100644 index 0000000..37884c0 --- /dev/null +++ b/lib/cmark/src/cmarkConfig.cmake.in @@ -0,0 +1,7 @@ +set(HAVE_LIBCMARK_STATIC @CMARK_STATIC@) +set(HAVE_LIBCMARK_SHARED @CMARK_SHARED@) + +if((HAVE_LIBCMARK_STATIC AND NOT TARGET libcmark_static) OR + (HAVE_LIBCMARK_SHARED AND NOT TARGET libcmark)) + include(@CMARK_TARGETS_FILE@) +endif() diff --git a/lib/cmark/src/cmark_ctype.c b/lib/cmark/src/cmark_ctype.c new file mode 100644 index 0000000..c0c4d5b --- /dev/null +++ b/lib/cmark/src/cmark_ctype.c @@ -0,0 +1,44 @@ +#include <stdint.h> + +#include "cmark_ctype.h" + +/** 1 = space, 2 = punct, 3 = digit, 4 = alpha, 0 = other + */ +static const uint8_t cmark_ctype_class[256] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + /* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* 2 */ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + /* 3 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, + /* 4 */ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + /* 5 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, + /* 6 */ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + /* 7 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 0, + /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* c */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* d */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* e */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/** + * Returns 1 if c is a "whitespace" character as defined by the spec. + */ +int cmark_isspace(char c) { return cmark_ctype_class[(uint8_t)c] == 1; } + +/** + * Returns 1 if c is an ascii punctuation character. + */ +int cmark_ispunct(char c) { return cmark_ctype_class[(uint8_t)c] == 2; } + +int cmark_isalnum(char c) { + uint8_t result; + result = cmark_ctype_class[(uint8_t)c]; + return (result == 3 || result == 4); +} + +int cmark_isdigit(char c) { return cmark_ctype_class[(uint8_t)c] == 3; } + +int cmark_isalpha(char c) { return cmark_ctype_class[(uint8_t)c] == 4; } diff --git a/lib/cmark/src/cmark_ctype.h b/lib/cmark/src/cmark_ctype.h new file mode 100644 index 0000000..9a07618 --- /dev/null +++ b/lib/cmark/src/cmark_ctype.h @@ -0,0 +1,26 @@ +#ifndef CMARK_CMARK_CTYPE_H +#define CMARK_CMARK_CTYPE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** Locale-independent versions of functions from ctype.h. + * We want cmark to behave the same no matter what the system locale. + */ + +int cmark_isspace(char c); + +int cmark_ispunct(char c); + +int cmark_isalnum(char c); + +int cmark_isdigit(char c); + +int cmark_isalpha(char c); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/cmark_version.h.in b/lib/cmark/src/cmark_version.h.in new file mode 100644 index 0000000..41de3ac --- /dev/null +++ b/lib/cmark/src/cmark_version.h.in @@ -0,0 +1,7 @@ +#ifndef CMARK_VERSION_H +#define CMARK_VERSION_H + +#define CMARK_VERSION ((@PROJECT_VERSION_MAJOR@ << 16) | (@PROJECT_VERSION_MINOR@ << 8) | @PROJECT_VERSION_PATCH@) +#define CMARK_VERSION_STRING "@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@" + +#endif diff --git a/lib/cmark/src/commonmark.c b/lib/cmark/src/commonmark.c new file mode 100644 index 0000000..8f5bd8f --- /dev/null +++ b/lib/cmark/src/commonmark.c @@ -0,0 +1,480 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdint.h> +#include <assert.h> + +#include "config.h" +#include "cmark.h" +#include "node.h" +#include "buffer.h" +#include "utf8.h" +#include "scanners.h" +#include "render.h" + +#define OUT(s, wrap, escaping) renderer->out(renderer, s, wrap, escaping) +#define LIT(s) renderer->out(renderer, s, false, LITERAL) +#define CR() renderer->cr(renderer) +#define BLANKLINE() renderer->blankline(renderer) +#define ENCODED_SIZE 20 +#define LISTMARKER_SIZE 20 + +// Functions to convert cmark_nodes to commonmark strings. + +static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_escaping escape, + int32_t c, unsigned char nextc) { + bool needs_escaping = false; + bool follows_digit = + renderer->buffer->size > 0 && + cmark_isdigit(renderer->buffer->ptr[renderer->buffer->size - 1]); + char encoded[ENCODED_SIZE]; + int options = renderer->options; + + needs_escaping = + c < 0x80 && escape != LITERAL && + ((escape == NORMAL && + (c < 0x20 || + c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' || + c == '>' || c == '\\' || c == '`' || c == '!' || + (c == '&' && cmark_isalpha(nextc)) || (c == '!' && nextc == '[') || + ((CMARK_OPT_SMART & options) && + ((c == '-' && nextc == '-') || + (c == '.' && nextc == '.') || + c == '"' || c == '\'')) || + (renderer->begin_content && (c == '-' || c == '+' || c == '=') && + // begin_content doesn't get set to false til we've passed digits + // at the beginning of line, so... + !follows_digit) || + (renderer->begin_content && (c == '.' || c == ')') && follows_digit && + (nextc == 0 || cmark_isspace(nextc))))) || + (escape == URL && + (c == '`' || c == '<' || c == '>' || cmark_isspace(c) || c == '\\' || + c == ')' || c == '(')) || + (escape == TITLE && + (c == '`' || c == '<' || c == '>' || c == '"' || c == '\\'))); + + if (needs_escaping) { + if (escape == URL && cmark_isspace(c)) { + // use percent encoding for spaces + snprintf(encoded, ENCODED_SIZE, "%%%2X", c); + cmark_strbuf_puts(renderer->buffer, encoded); + renderer->column += 3; + } else if (cmark_ispunct(c)) { + cmark_render_ascii(renderer, "\\"); + cmark_render_code_point(renderer, c); + } else { // render as entity + snprintf(encoded, ENCODED_SIZE, "&#%d;", c); + cmark_strbuf_puts(renderer->buffer, encoded); + renderer->column += strlen(encoded); + } + } else { + cmark_render_code_point(renderer, c); + } +} + +static int longest_backtick_sequence(const char *code) { + int longest = 0; + int current = 0; + size_t i = 0; + size_t code_len = strlen(code); + while (i <= code_len) { + if (code[i] == '`') { + current++; + } else { + if (current > longest) { + longest = current; + } + current = 0; + } + i++; + } + return longest; +} + +static int shortest_unused_backtick_sequence(const char *code) { + // note: if the shortest sequence is >= 32, this returns 32 + // so as not to overflow the bit array. + uint32_t used = 1; + int current = 0; + size_t i = 0; + size_t code_len = strlen(code); + while (i <= code_len) { + if (code[i] == '`') { + current++; + } else { + if (current > 0 && current < 32) { + used |= (1U << current); + } + current = 0; + } + i++; + } + // return number of first bit that is 0: + i = 0; + while (i < 32 && used & 1) { + used = used >> 1; + i++; + } + return (int)i; +} + +static bool is_autolink(cmark_node *node) { + const unsigned char *title; + const unsigned char *url; + cmark_node *link_text; + + if (node->type != CMARK_NODE_LINK) { + return false; + } + + url = node->as.link.url; + if (url == NULL || _scan_scheme(url) == 0) { + return false; + } + + title = node->as.link.title; + // if it has a title, we can't treat it as an autolink: + if (title && title[0]) { + return false; + } + + link_text = node->first_child; + if (link_text == NULL) { + return false; + } + cmark_consolidate_text_nodes(link_text); + if (strncmp((const char *)url, "mailto:", 7) == 0) { + url += 7; + } + return link_text->data != NULL && + strcmp((const char *)url, (char *)link_text->data) == 0; +} + +// if node is a block node, returns node. +// otherwise returns first block-level node that is an ancestor of node. +// if there is no block-level ancestor, returns NULL. +static cmark_node *get_containing_block(cmark_node *node) { + while (node) { + if (node->type >= CMARK_NODE_FIRST_BLOCK && + node->type <= CMARK_NODE_LAST_BLOCK) { + return node; + } else { + node = node->parent; + } + } + return NULL; +} + +static int S_render_node(cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + cmark_node *tmp; + int list_number; + cmark_delim_type list_delim; + size_t numticks; + bool extra_spaces; + size_t i; + bool entering = (ev_type == CMARK_EVENT_ENTER); + const char *info, *code, *title; + char fencechar[2] = {'\0', '\0'}; + size_t code_len; + char listmarker[LISTMARKER_SIZE]; + const char *emph_delim; + bool first_in_list_item; + bufsize_t marker_width; + bool has_nonspace; + bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options) && + !(CMARK_OPT_HARDBREAKS & options); + + // Don't adjust tight list status til we've started the list. + // Otherwise we loose the blank line between a paragraph and + // a following list. + if (!(node->type == CMARK_NODE_ITEM && node->prev == NULL && entering)) { + tmp = get_containing_block(node); + renderer->in_tight_list_item = + tmp && // tmp might be NULL if there is no containing block + ((tmp->type == CMARK_NODE_ITEM && + cmark_node_get_list_tight(tmp->parent)) || + (tmp && tmp->parent && tmp->parent->type == CMARK_NODE_ITEM && + cmark_node_get_list_tight(tmp->parent->parent))); + } + + switch (node->type) { + case CMARK_NODE_DOCUMENT: + break; + + case CMARK_NODE_BLOCK_QUOTE: + if (entering) { + LIT("> "); + renderer->begin_content = true; + cmark_strbuf_puts(renderer->prefix, "> "); + } else { + cmark_strbuf_truncate(renderer->prefix, renderer->prefix->size - 2); + BLANKLINE(); + } + break; + + case CMARK_NODE_LIST: + if (!entering && node->next && (node->next->type == CMARK_NODE_LIST)) { + // this ensures that a following indented code block or list will be + // inteprereted correctly. + CR(); + LIT("<!-- end list -->"); + BLANKLINE(); + } + break; + + case CMARK_NODE_ITEM: + if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) { + marker_width = 4; + } else { + list_number = cmark_node_get_list_start(node->parent); + list_delim = cmark_node_get_list_delim(node->parent); + tmp = node; + while (tmp->prev) { + tmp = tmp->prev; + list_number += 1; + } + // we ensure a width of at least 4 so + // we get nice transition from single digits + // to double + snprintf(listmarker, LISTMARKER_SIZE, "%d%s%s", list_number, + list_delim == CMARK_PAREN_DELIM ? ")" : ".", + list_number < 10 ? " " : " "); + marker_width = strlen(listmarker); + } + if (entering) { + if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) { + LIT(" - "); + renderer->begin_content = true; + } else { + LIT(listmarker); + renderer->begin_content = true; + } + for (i = marker_width; i--;) { + cmark_strbuf_putc(renderer->prefix, ' '); + } + } else { + cmark_strbuf_truncate(renderer->prefix, + renderer->prefix->size - marker_width); + CR(); + } + break; + + case CMARK_NODE_HEADING: + if (entering) { + for (i = cmark_node_get_heading_level(node); i > 0; i--) { + LIT("#"); + } + LIT(" "); + renderer->begin_content = true; + renderer->no_linebreaks = true; + } else { + renderer->no_linebreaks = false; + BLANKLINE(); + } + break; + + case CMARK_NODE_CODE_BLOCK: + + first_in_list_item = node->prev == NULL && node->parent && + node->parent->type == CMARK_NODE_ITEM; + + if (!first_in_list_item) { + BLANKLINE(); + } + info = cmark_node_get_fence_info(node); + fencechar[0] = strchr(info, '`') == NULL ? '`' : '~'; + code = cmark_node_get_literal(node); + + numticks = longest_backtick_sequence(code) + 1; + if (numticks < 3) { + numticks = 3; + } + for (i = 0; i < numticks; i++) { + LIT(fencechar); + } + LIT(" "); + OUT(info, false, LITERAL); + CR(); + OUT(cmark_node_get_literal(node), false, LITERAL); + CR(); + for (i = 0; i < numticks; i++) { + LIT(fencechar); + } + + BLANKLINE(); + break; + + case CMARK_NODE_HTML_BLOCK: + BLANKLINE(); + OUT(cmark_node_get_literal(node), false, LITERAL); + BLANKLINE(); + break; + + case CMARK_NODE_CUSTOM_BLOCK: + BLANKLINE(); + OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node), + false, LITERAL); + BLANKLINE(); + break; + + case CMARK_NODE_THEMATIC_BREAK: + BLANKLINE(); + LIT("-----"); + BLANKLINE(); + break; + + case CMARK_NODE_PARAGRAPH: + if (!entering) { + BLANKLINE(); + } + break; + + case CMARK_NODE_TEXT: + OUT(cmark_node_get_literal(node), allow_wrap, NORMAL); + break; + + case CMARK_NODE_LINEBREAK: + if (!(CMARK_OPT_HARDBREAKS & options)) { + LIT(" "); + } + CR(); + break; + + case CMARK_NODE_SOFTBREAK: + if (CMARK_OPT_HARDBREAKS & options) { + LIT(" "); + CR(); + } else if (!renderer->no_linebreaks && renderer->width == 0 && + !(CMARK_OPT_HARDBREAKS & options) && + !(CMARK_OPT_NOBREAKS & options)) { + CR(); + } else { + OUT(" ", allow_wrap, LITERAL); + } + break; + + case CMARK_NODE_CODE: + code = cmark_node_get_literal(node); + code_len = strlen(code); + numticks = shortest_unused_backtick_sequence(code); + has_nonspace = false; + for (i=0; i < code_len; i++) { + if (code[i] != ' ') { + has_nonspace = true; + break; + } + } + extra_spaces = code_len == 0 || + code[0] == '`' || code[code_len - 1] == '`' || + (has_nonspace && code[0] == ' ' && code[code_len - 1] == ' '); + for (i = 0; i < numticks; i++) { + LIT("`"); + } + if (extra_spaces) { + LIT(" "); + } + OUT(cmark_node_get_literal(node), allow_wrap, LITERAL); + if (extra_spaces) { + LIT(" "); + } + for (i = 0; i < numticks; i++) { + LIT("`"); + } + break; + + case CMARK_NODE_HTML_INLINE: + OUT(cmark_node_get_literal(node), false, LITERAL); + break; + + case CMARK_NODE_CUSTOM_INLINE: + OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node), + false, LITERAL); + break; + + case CMARK_NODE_STRONG: + if (entering) { + LIT("**"); + } else { + LIT("**"); + } + break; + + case CMARK_NODE_EMPH: + // If we have EMPH(EMPH(x)), we need to use *_x_* + // because **x** is STRONG(x): + if (node->parent && node->parent->type == CMARK_NODE_EMPH && + node->next == NULL && node->prev == NULL) { + emph_delim = "_"; + } else { + emph_delim = "*"; + } + if (entering) { + LIT(emph_delim); + } else { + LIT(emph_delim); + } + break; + + case CMARK_NODE_LINK: + if (is_autolink(node)) { + if (entering) { + LIT("<"); + if (strncmp(cmark_node_get_url(node), "mailto:", 7) == 0) { + LIT((const char *)cmark_node_get_url(node) + 7); + } else { + LIT((const char *)cmark_node_get_url(node)); + } + LIT(">"); + // return signal to skip contents of node... + return 0; + } + } else { + if (entering) { + LIT("["); + } else { + LIT("]("); + OUT(cmark_node_get_url(node), false, URL); + title = cmark_node_get_title(node); + if (strlen(title) > 0) { + LIT(" \""); + OUT(title, false, TITLE); + LIT("\""); + } + LIT(")"); + } + } + break; + + case CMARK_NODE_IMAGE: + if (entering) { + LIT("; + OUT(cmark_node_get_url(node), false, URL); + title = cmark_node_get_title(node); + if (strlen(title) > 0) { + OUT(" \"", allow_wrap, LITERAL); + OUT(title, false, TITLE); + LIT("\""); + } + LIT(")"); + } + break; + + default: + assert(false); + break; + } + + return 1; +} + +char *cmark_render_commonmark(cmark_node *root, int options, int width) { + if (options & CMARK_OPT_HARDBREAKS) { + // disable breaking on width, since it has + // a different meaning with OPT_HARDBREAKS + width = 0; + } + return cmark_render(root, options, width, outc, S_render_node); +} diff --git a/lib/cmark/src/config.h.in b/lib/cmark/src/config.h.in new file mode 100644 index 0000000..de1a4dd --- /dev/null +++ b/lib/cmark/src/config.h.in @@ -0,0 +1,76 @@ +#ifndef CMARK_CONFIG_H +#define CMARK_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#cmakedefine HAVE_STDBOOL_H + +#ifdef HAVE_STDBOOL_H + #include <stdbool.h> +#elif !defined(__cplusplus) + typedef char bool; +#endif + +#cmakedefine HAVE___BUILTIN_EXPECT + +#cmakedefine HAVE___ATTRIBUTE__ + +#ifdef HAVE___ATTRIBUTE__ + #define CMARK_ATTRIBUTE(list) __attribute__ (list) +#else + #define CMARK_ATTRIBUTE(list) +#endif + +#ifndef CMARK_INLINE + #if defined(_MSC_VER) && !defined(__cplusplus) + #define CMARK_INLINE __inline + #else + #define CMARK_INLINE inline + #endif +#endif + +/* snprintf and vsnprintf fallbacks for MSVC before 2015, + due to Valentin Milea http://stackoverflow.com/questions/2915672/ +*/ + +#if defined(_MSC_VER) && _MSC_VER < 1900 + +#include <stdio.h> +#include <stdarg.h> + +#define snprintf c99_snprintf +#define vsnprintf c99_vsnprintf + +CMARK_INLINE int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap) +{ + int count = -1; + + if (size != 0) + count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap); + if (count == -1) + count = _vscprintf(format, ap); + + return count; +} + +CMARK_INLINE int c99_snprintf(char *outBuf, size_t size, const char *format, ...) +{ + int count; + va_list ap; + + va_start(ap, format); + count = c99_vsnprintf(outBuf, size, format, ap); + va_end(ap); + + return count; +} + +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/entities.inc b/lib/cmark/src/entities.inc new file mode 100644 index 0000000..a7c36e2 --- /dev/null +++ b/lib/cmark/src/entities.inc @@ -0,0 +1,2138 @@ +/* Autogenerated by tools/make_headers_inc.py */ + +struct cmark_entity_node { + unsigned char *entity; + unsigned char bytes[8]; +}; + +#define CMARK_ENTITY_MIN_LENGTH 2 +#define CMARK_ENTITY_MAX_LENGTH 32 +#define CMARK_NUM_ENTITIES 2125 + +static const struct cmark_entity_node cmark_entities[] = { +{(unsigned char*)"AElig", {195, 134, 0}}, +{(unsigned char*)"AMP", {38, 0}}, +{(unsigned char*)"Aacute", {195, 129, 0}}, +{(unsigned char*)"Abreve", {196, 130, 0}}, +{(unsigned char*)"Acirc", {195, 130, 0}}, +{(unsigned char*)"Acy", {208, 144, 0}}, +{(unsigned char*)"Afr", {240, 157, 148, 132, 0}}, +{(unsigned char*)"Agrave", {195, 128, 0}}, +{(unsigned char*)"Alpha", {206, 145, 0}}, +{(unsigned char*)"Amacr", {196, 128, 0}}, +{(unsigned char*)"And", {226, 169, 147, 0}}, +{(unsigned char*)"Aogon", {196, 132, 0}}, +{(unsigned char*)"Aopf", {240, 157, 148, 184, 0}}, +{(unsigned char*)"ApplyFunction", {226, 129, 161, 0}}, +{(unsigned char*)"Aring", {195, 133, 0}}, +{(unsigned char*)"Ascr", {240, 157, 146, 156, 0}}, +{(unsigned char*)"Assign", {226, 137, 148, 0}}, +{(unsigned char*)"Atilde", {195, 131, 0}}, +{(unsigned char*)"Auml", {195, 132, 0}}, +{(unsigned char*)"Backslash", {226, 136, 150, 0}}, +{(unsigned char*)"Barv", {226, 171, 167, 0}}, +{(unsigned char*)"Barwed", {226, 140, 134, 0}}, +{(unsigned char*)"Bcy", {208, 145, 0}}, +{(unsigned char*)"Because", {226, 136, 181, 0}}, +{(unsigned char*)"Bernoullis", {226, 132, 172, 0}}, +{(unsigned char*)"Beta", {206, 146, 0}}, +{(unsigned char*)"Bfr", {240, 157, 148, 133, 0}}, +{(unsigned char*)"Bopf", {240, 157, 148, 185, 0}}, +{(unsigned char*)"Breve", {203, 152, 0}}, +{(unsigned char*)"Bscr", {226, 132, 172, 0}}, +{(unsigned char*)"Bumpeq", {226, 137, 142, 0}}, +{(unsigned char*)"CHcy", {208, 167, 0}}, +{(unsigned char*)"COPY", {194, 169, 0}}, +{(unsigned char*)"Cacute", {196, 134, 0}}, +{(unsigned char*)"Cap", {226, 139, 146, 0}}, +{(unsigned char*)"CapitalDifferentialD", {226, 133, 133, 0}}, +{(unsigned char*)"Cayleys", {226, 132, 173, 0}}, +{(unsigned char*)"Ccaron", {196, 140, 0}}, +{(unsigned char*)"Ccedil", {195, 135, 0}}, +{(unsigned char*)"Ccirc", {196, 136, 0}}, +{(unsigned char*)"Cconint", {226, 136, 176, 0}}, +{(unsigned char*)"Cdot", {196, 138, 0}}, +{(unsigned char*)"Cedilla", {194, 184, 0}}, +{(unsigned char*)"CenterDot", {194, 183, 0}}, +{(unsigned char*)"Cfr", {226, 132, 173, 0}}, +{(unsigned char*)"Chi", {206, 167, 0}}, +{(unsigned char*)"CircleDot", {226, 138, 153, 0}}, +{(unsigned char*)"CircleMinus", {226, 138, 150, 0}}, +{(unsigned char*)"CirclePlus", {226, 138, 149, 0}}, +{(unsigned char*)"CircleTimes", {226, 138, 151, 0}}, +{(unsigned char*)"ClockwiseContourIntegral", {226, 136, 178, 0}}, +{(unsigned char*)"CloseCurlyDoubleQuote", {226, 128, 157, 0}}, +{(unsigned char*)"CloseCurlyQuote", {226, 128, 153, 0}}, +{(unsigned char*)"Colon", {226, 136, 183, 0}}, +{(unsigned char*)"Colone", {226, 169, 180, 0}}, +{(unsigned char*)"Congruent", {226, 137, 161, 0}}, +{(unsigned char*)"Conint", {226, 136, 175, 0}}, +{(unsigned char*)"ContourIntegral", {226, 136, 174, 0}}, +{(unsigned char*)"Copf", {226, 132, 130, 0}}, +{(unsigned char*)"Coproduct", {226, 136, 144, 0}}, +{(unsigned char*)"CounterClockwiseContourIntegral", {226, 136, 179, 0}}, +{(unsigned char*)"Cross", {226, 168, 175, 0}}, +{(unsigned char*)"Cscr", {240, 157, 146, 158, 0}}, +{(unsigned char*)"Cup", {226, 139, 147, 0}}, +{(unsigned char*)"CupCap", {226, 137, 141, 0}}, +{(unsigned char*)"DD", {226, 133, 133, 0}}, +{(unsigned char*)"DDotrahd", {226, 164, 145, 0}}, +{(unsigned char*)"DJcy", {208, 130, 0}}, +{(unsigned char*)"DScy", {208, 133, 0}}, +{(unsigned char*)"DZcy", {208, 143, 0}}, +{(unsigned char*)"Dagger", {226, 128, 161, 0}}, +{(unsigned char*)"Darr", {226, 134, 161, 0}}, +{(unsigned char*)"Dashv", {226, 171, 164, 0}}, +{(unsigned char*)"Dcaron", {196, 142, 0}}, +{(unsigned char*)"Dcy", {208, 148, 0}}, +{(unsigned char*)"Del", {226, 136, 135, 0}}, +{(unsigned char*)"Delta", {206, 148, 0}}, +{(unsigned char*)"Dfr", {240, 157, 148, 135, 0}}, +{(unsigned char*)"DiacriticalAcute", {194, 180, 0}}, +{(unsigned char*)"DiacriticalDot", {203, 153, 0}}, +{(unsigned char*)"DiacriticalDoubleAcute", {203, 157, 0}}, +{(unsigned char*)"DiacriticalGrave", {96, 0}}, +{(unsigned char*)"DiacriticalTilde", {203, 156, 0}}, +{(unsigned char*)"Diamond", {226, 139, 132, 0}}, +{(unsigned char*)"DifferentialD", {226, 133, 134, 0}}, +{(unsigned char*)"Dopf", {240, 157, 148, 187, 0}}, +{(unsigned char*)"Dot", {194, 168, 0}}, +{(unsigned char*)"DotDot", {226, 131, 156, 0}}, +{(unsigned char*)"DotEqual", {226, 137, 144, 0}}, +{(unsigned char*)"DoubleContourIntegral", {226, 136, 175, 0}}, +{(unsigned char*)"DoubleDot", {194, 168, 0}}, +{(unsigned char*)"DoubleDownArrow", {226, 135, 147, 0}}, +{(unsigned char*)"DoubleLeftArrow", {226, 135, 144, 0}}, +{(unsigned char*)"DoubleLeftRightArrow", {226, 135, 148, 0}}, +{(unsigned char*)"DoubleLeftTee", {226, 171, 164, 0}}, +{(unsigned char*)"DoubleLongLeftArrow", {226, 159, 184, 0}}, +{(unsigned char*)"DoubleLongLeftRightArrow", {226, 159, 186, 0}}, +{(unsigned char*)"DoubleLongRightArrow", {226, 159, 185, 0}}, +{(unsigned char*)"DoubleRightArrow", {226, 135, 146, 0}}, +{(unsigned char*)"DoubleRightTee", {226, 138, 168, 0}}, +{(unsigned char*)"DoubleUpArrow", {226, 135, 145, 0}}, +{(unsigned char*)"DoubleUpDownArrow", {226, 135, 149, 0}}, +{(unsigned char*)"DoubleVerticalBar", {226, 136, 165, 0}}, +{(unsigned char*)"DownArrow", {226, 134, 147, 0}}, +{(unsigned char*)"DownArrowBar", {226, 164, 147, 0}}, +{(unsigned char*)"DownArrowUpArrow", {226, 135, 181, 0}}, +{(unsigned char*)"DownBreve", {204, 145, 0}}, +{(unsigned char*)"DownLeftRightVector", {226, 165, 144, 0}}, +{(unsigned char*)"DownLeftTeeVector", {226, 165, 158, 0}}, +{(unsigned char*)"DownLeftVector", {226, 134, 189, 0}}, +{(unsigned char*)"DownLeftVectorBar", {226, 165, 150, 0}}, +{(unsigned char*)"DownRightTeeVector", {226, 165, 159, 0}}, +{(unsigned char*)"DownRightVector", {226, 135, 129, 0}}, +{(unsigned char*)"DownRightVectorBar", {226, 165, 151, 0}}, +{(unsigned char*)"DownTee", {226, 138, 164, 0}}, +{(unsigned char*)"DownTeeArrow", {226, 134, 167, 0}}, +{(unsigned char*)"Downarrow", {226, 135, 147, 0}}, +{(unsigned char*)"Dscr", {240, 157, 146, 159, 0}}, +{(unsigned char*)"Dstrok", {196, 144, 0}}, +{(unsigned char*)"ENG", {197, 138, 0}}, +{(unsigned char*)"ETH", {195, 144, 0}}, +{(unsigned char*)"Eacute", {195, 137, 0}}, +{(unsigned char*)"Ecaron", {196, 154, 0}}, +{(unsigned char*)"Ecirc", {195, 138, 0}}, +{(unsigned char*)"Ecy", {208, 173, 0}}, +{(unsigned char*)"Edot", {196, 150, 0}}, +{(unsigned char*)"Efr", {240, 157, 148, 136, 0}}, +{(unsigned char*)"Egrave", {195, 136, 0}}, +{(unsigned char*)"Element", {226, 136, 136, 0}}, +{(unsigned char*)"Emacr", {196, 146, 0}}, +{(unsigned char*)"EmptySmallSquare", {226, 151, 187, 0}}, +{(unsigned char*)"EmptyVerySmallSquare", {226, 150, 171, 0}}, +{(unsigned char*)"Eogon", {196, 152, 0}}, +{(unsigned char*)"Eopf", {240, 157, 148, 188, 0}}, +{(unsigned char*)"Epsilon", {206, 149, 0}}, +{(unsigned char*)"Equal", {226, 169, 181, 0}}, +{(unsigned char*)"EqualTilde", {226, 137, 130, 0}}, +{(unsigned char*)"Equilibrium", {226, 135, 140, 0}}, +{(unsigned char*)"Escr", {226, 132, 176, 0}}, +{(unsigned char*)"Esim", {226, 169, 179, 0}}, +{(unsigned char*)"Eta", {206, 151, 0}}, +{(unsigned char*)"Euml", {195, 139, 0}}, +{(unsigned char*)"Exists", {226, 136, 131, 0}}, +{(unsigned char*)"ExponentialE", {226, 133, 135, 0}}, +{(unsigned char*)"Fcy", {208, 164, 0}}, +{(unsigned char*)"Ffr", {240, 157, 148, 137, 0}}, +{(unsigned char*)"FilledSmallSquare", {226, 151, 188, 0}}, +{(unsigned char*)"FilledVerySmallSquare", {226, 150, 170, 0}}, +{(unsigned char*)"Fopf", {240, 157, 148, 189, 0}}, +{(unsigned char*)"ForAll", {226, 136, 128, 0}}, +{(unsigned char*)"Fouriertrf", {226, 132, 177, 0}}, +{(unsigned char*)"Fscr", {226, 132, 177, 0}}, +{(unsigned char*)"GJcy", {208, 131, 0}}, +{(unsigned char*)"GT", {62, 0}}, +{(unsigned char*)"Gamma", {206, 147, 0}}, +{(unsigned char*)"Gammad", {207, 156, 0}}, +{(unsigned char*)"Gbreve", {196, 158, 0}}, +{(unsigned char*)"Gcedil", {196, 162, 0}}, +{(unsigned char*)"Gcirc", {196, 156, 0}}, +{(unsigned char*)"Gcy", {208, 147, 0}}, +{(unsigned char*)"Gdot", {196, 160, 0}}, +{(unsigned char*)"Gfr", {240, 157, 148, 138, 0}}, +{(unsigned char*)"Gg", {226, 139, 153, 0}}, +{(unsigned char*)"Gopf", {240, 157, 148, 190, 0}}, +{(unsigned char*)"GreaterEqual", {226, 137, 165, 0}}, +{(unsigned char*)"GreaterEqualLess", {226, 139, 155, 0}}, +{(unsigned char*)"GreaterFullEqual", {226, 137, 167, 0}}, +{(unsigned char*)"GreaterGreater", {226, 170, 162, 0}}, +{(unsigned char*)"GreaterLess", {226, 137, 183, 0}}, +{(unsigned char*)"GreaterSlantEqual", {226, 169, 190, 0}}, +{(unsigned char*)"GreaterTilde", {226, 137, 179, 0}}, +{(unsigned char*)"Gscr", {240, 157, 146, 162, 0}}, +{(unsigned char*)"Gt", {226, 137, 171, 0}}, +{(unsigned char*)"HARDcy", {208, 170, 0}}, +{(unsigned char*)"Hacek", {203, 135, 0}}, +{(unsigned char*)"Hat", {94, 0}}, +{(unsigned char*)"Hcirc", {196, 164, 0}}, +{(unsigned char*)"Hfr", {226, 132, 140, 0}}, +{(unsigned char*)"HilbertSpace", {226, 132, 139, 0}}, +{(unsigned char*)"Hopf", {226, 132, 141, 0}}, +{(unsigned char*)"HorizontalLine", {226, 148, 128, 0}}, +{(unsigned char*)"Hscr", {226, 132, 139, 0}}, +{(unsigned char*)"Hstrok", {196, 166, 0}}, +{(unsigned char*)"HumpDownHump", {226, 137, 142, 0}}, +{(unsigned char*)"HumpEqual", {226, 137, 143, 0}}, +{(unsigned char*)"IEcy", {208, 149, 0}}, +{(unsigned char*)"IJlig", {196, 178, 0}}, +{(unsigned char*)"IOcy", {208, 129, 0}}, +{(unsigned char*)"Iacute", {195, 141, 0}}, +{(unsigned char*)"Icirc", {195, 142, 0}}, +{(unsigned char*)"Icy", {208, 152, 0}}, +{(unsigned char*)"Idot", {196, 176, 0}}, +{(unsigned char*)"Ifr", {226, 132, 145, 0}}, +{(unsigned char*)"Igrave", {195, 140, 0}}, +{(unsigned char*)"Im", {226, 132, 145, 0}}, +{(unsigned char*)"Imacr", {196, 170, 0}}, +{(unsigned char*)"ImaginaryI", {226, 133, 136, 0}}, +{(unsigned char*)"Implies", {226, 135, 146, 0}}, +{(unsigned char*)"Int", {226, 136, 172, 0}}, +{(unsigned char*)"Integral", {226, 136, 171, 0}}, +{(unsigned char*)"Intersection", {226, 139, 130, 0}}, +{(unsigned char*)"InvisibleComma", {226, 129, 163, 0}}, +{(unsigned char*)"InvisibleTimes", {226, 129, 162, 0}}, +{(unsigned char*)"Iogon", {196, 174, 0}}, +{(unsigned char*)"Iopf", {240, 157, 149, 128, 0}}, +{(unsigned char*)"Iota", {206, 153, 0}}, +{(unsigned char*)"Iscr", {226, 132, 144, 0}}, +{(unsigned char*)"Itilde", {196, 168, 0}}, +{(unsigned char*)"Iukcy", {208, 134, 0}}, +{(unsigned char*)"Iuml", {195, 143, 0}}, +{(unsigned char*)"Jcirc", {196, 180, 0}}, +{(unsigned char*)"Jcy", {208, 153, 0}}, +{(unsigned char*)"Jfr", {240, 157, 148, 141, 0}}, +{(unsigned char*)"Jopf", {240, 157, 149, 129, 0}}, +{(unsigned char*)"Jscr", {240, 157, 146, 165, 0}}, +{(unsigned char*)"Jsercy", {208, 136, 0}}, +{(unsigned char*)"Jukcy", {208, 132, 0}}, +{(unsigned char*)"KHcy", {208, 165, 0}}, +{(unsigned char*)"KJcy", {208, 140, 0}}, +{(unsigned char*)"Kappa", {206, 154, 0}}, +{(unsigned char*)"Kcedil", {196, 182, 0}}, +{(unsigned char*)"Kcy", {208, 154, 0}}, +{(unsigned char*)"Kfr", {240, 157, 148, 142, 0}}, +{(unsigned char*)"Kopf", {240, 157, 149, 130, 0}}, +{(unsigned char*)"Kscr", {240, 157, 146, 166, 0}}, +{(unsigned char*)"LJcy", {208, 137, 0}}, +{(unsigned char*)"LT", {60, 0}}, +{(unsigned char*)"Lacute", {196, 185, 0}}, +{(unsigned char*)"Lambda", {206, 155, 0}}, +{(unsigned char*)"Lang", {226, 159, 170, 0}}, +{(unsigned char*)"Laplacetrf", {226, 132, 146, 0}}, +{(unsigned char*)"Larr", {226, 134, 158, 0}}, +{(unsigned char*)"Lcaron", {196, 189, 0}}, +{(unsigned char*)"Lcedil", {196, 187, 0}}, +{(unsigned char*)"Lcy", {208, 155, 0}}, +{(unsigned char*)"LeftAngleBracket", {226, 159, 168, 0}}, +{(unsigned char*)"LeftArrow", {226, 134, 144, 0}}, +{(unsigned char*)"LeftArrowBar", {226, 135, 164, 0}}, +{(unsigned char*)"LeftArrowRightArrow", {226, 135, 134, 0}}, +{(unsigned char*)"LeftCeiling", {226, 140, 136, 0}}, +{(unsigned char*)"LeftDoubleBracket", {226, 159, 166, 0}}, +{(unsigned char*)"LeftDownTeeVector", {226, 165, 161, 0}}, +{(unsigned char*)"LeftDownVector", {226, 135, 131, 0}}, +{(unsigned char*)"LeftDownVectorBar", {226, 165, 153, 0}}, +{(unsigned char*)"LeftFloor", {226, 140, 138, 0}}, +{(unsigned char*)"LeftRightArrow", {226, 134, 148, 0}}, +{(unsigned char*)"LeftRightVector", {226, 165, 142, 0}}, +{(unsigned char*)"LeftTee", {226, 138, 163, 0}}, +{(unsigned char*)"LeftTeeArrow", {226, 134, 164, 0}}, +{(unsigned char*)"LeftTeeVector", {226, 165, 154, 0}}, +{(unsigned char*)"LeftTriangle", {226, 138, 178, 0}}, +{(unsigned char*)"LeftTriangleBar", {226, 167, 143, 0}}, +{(unsigned char*)"LeftTriangleEqual", {226, 138, 180, 0}}, +{(unsigned char*)"LeftUpDownVector", {226, 165, 145, 0}}, +{(unsigned char*)"LeftUpTeeVector", {226, 165, 160, 0}}, +{(unsigned char*)"LeftUpVector", {226, 134, 191, 0}}, +{(unsigned char*)"LeftUpVectorBar", {226, 165, 152, 0}}, +{(unsigned char*)"LeftVector", {226, 134, 188, 0}}, +{(unsigned char*)"LeftVectorBar", {226, 165, 146, 0}}, +{(unsigned char*)"Leftarrow", {226, 135, 144, 0}}, +{(unsigned char*)"Leftrightarrow", {226, 135, 148, 0}}, +{(unsigned char*)"LessEqualGreater", {226, 139, 154, 0}}, +{(unsigned char*)"LessFullEqual", {226, 137, 166, 0}}, +{(unsigned char*)"LessGreater", {226, 137, 182, 0}}, +{(unsigned char*)"LessLess", {226, 170, 161, 0}}, +{(unsigned char*)"LessSlantEqual", {226, 169, 189, 0}}, +{(unsigned char*)"LessTilde", {226, 137, 178, 0}}, +{(unsigned char*)"Lfr", {240, 157, 148, 143, 0}}, +{(unsigned char*)"Ll", {226, 139, 152, 0}}, +{(unsigned char*)"Lleftarrow", {226, 135, 154, 0}}, +{(unsigned char*)"Lmidot", {196, 191, 0}}, +{(unsigned char*)"LongLeftArrow", {226, 159, 181, 0}}, +{(unsigned char*)"LongLeftRightArrow", {226, 159, 183, 0}}, +{(unsigned char*)"LongRightArrow", {226, 159, 182, 0}}, +{(unsigned char*)"Longleftarrow", {226, 159, 184, 0}}, +{(unsigned char*)"Longleftrightarrow", {226, 159, 186, 0}}, +{(unsigned char*)"Longrightarrow", {226, 159, 185, 0}}, +{(unsigned char*)"Lopf", {240, 157, 149, 131, 0}}, +{(unsigned char*)"LowerLeftArrow", {226, 134, 153, 0}}, +{(unsigned char*)"LowerRightArrow", {226, 134, 152, 0}}, +{(unsigned char*)"Lscr", {226, 132, 146, 0}}, +{(unsigned char*)"Lsh", {226, 134, 176, 0}}, +{(unsigned char*)"Lstrok", {197, 129, 0}}, +{(unsigned char*)"Lt", {226, 137, 170, 0}}, +{(unsigned char*)"Map", {226, 164, 133, 0}}, +{(unsigned char*)"Mcy", {208, 156, 0}}, +{(unsigned char*)"MediumSpace", {226, 129, 159, 0}}, +{(unsigned char*)"Mellintrf", {226, 132, 179, 0}}, +{(unsigned char*)"Mfr", {240, 157, 148, 144, 0}}, +{(unsigned char*)"MinusPlus", {226, 136, 147, 0}}, +{(unsigned char*)"Mopf", {240, 157, 149, 132, 0}}, +{(unsigned char*)"Mscr", {226, 132, 179, 0}}, +{(unsigned char*)"Mu", {206, 156, 0}}, +{(unsigned char*)"NJcy", {208, 138, 0}}, +{(unsigned char*)"Nacute", {197, 131, 0}}, +{(unsigned char*)"Ncaron", {197, 135, 0}}, +{(unsigned char*)"Ncedil", {197, 133, 0}}, +{(unsigned char*)"Ncy", {208, 157, 0}}, +{(unsigned char*)"NegativeMediumSpace", {226, 128, 139, 0}}, +{(unsigned char*)"NegativeThickSpace", {226, 128, 139, 0}}, +{(unsigned char*)"NegativeThinSpace", {226, 128, 139, 0}}, +{(unsigned char*)"NegativeVeryThinSpace", {226, 128, 139, 0}}, +{(unsigned char*)"NestedGreaterGreater", {226, 137, 171, 0}}, +{(unsigned char*)"NestedLessLess", {226, 137, 170, 0}}, +{(unsigned char*)"NewLine", {10, 0}}, +{(unsigned char*)"Nfr", {240, 157, 148, 145, 0}}, +{(unsigned char*)"NoBreak", {226, 129, 160, 0}}, +{(unsigned char*)"NonBreakingSpace", {194, 160, 0}}, +{(unsigned char*)"Nopf", {226, 132, 149, 0}}, +{(unsigned char*)"Not", {226, 171, 172, 0}}, +{(unsigned char*)"NotCongruent", {226, 137, 162, 0}}, +{(unsigned char*)"NotCupCap", {226, 137, 173, 0}}, +{(unsigned char*)"NotDoubleVerticalBar", {226, 136, 166, 0}}, +{(unsigned char*)"NotElement", {226, 136, 137, 0}}, +{(unsigned char*)"NotEqual", {226, 137, 160, 0}}, +{(unsigned char*)"NotEqualTilde", {226, 137, 130, 204, 184, 0}}, +{(unsigned char*)"NotExists", {226, 136, 132, 0}}, +{(unsigned char*)"NotGreater", {226, 137, 175, 0}}, +{(unsigned char*)"NotGreaterEqual", {226, 137, 177, 0}}, +{(unsigned char*)"NotGreaterFullEqual", {226, 137, 167, 204, 184, 0}}, +{(unsigned char*)"NotGreaterGreater", {226, 137, 171, 204, 184, 0}}, +{(unsigned char*)"NotGreaterLess", {226, 137, 185, 0}}, +{(unsigned char*)"NotGreaterSlantEqual", {226, 169, 190, 204, 184, 0}}, +{(unsigned char*)"NotGreaterTilde", {226, 137, 181, 0}}, +{(unsigned char*)"NotHumpDownHump", {226, 137, 142, 204, 184, 0}}, +{(unsigned char*)"NotHumpEqual", {226, 137, 143, 204, 184, 0}}, +{(unsigned char*)"NotLeftTriangle", {226, 139, 170, 0}}, +{(unsigned char*)"NotLeftTriangleBar", {226, 167, 143, 204, 184, 0}}, +{(unsigned char*)"NotLeftTriangleEqual", {226, 139, 172, 0}}, +{(unsigned char*)"NotLess", {226, 137, 174, 0}}, +{(unsigned char*)"NotLessEqual", {226, 137, 176, 0}}, +{(unsigned char*)"NotLessGreater", {226, 137, 184, 0}}, +{(unsigned char*)"NotLessLess", {226, 137, 170, 204, 184, 0}}, +{(unsigned char*)"NotLessSlantEqual", {226, 169, 189, 204, 184, 0}}, +{(unsigned char*)"NotLessTilde", {226, 137, 180, 0}}, +{(unsigned char*)"NotNestedGreaterGreater", {226, 170, 162, 204, 184, 0}}, +{(unsigned char*)"NotNestedLessLess", {226, 170, 161, 204, 184, 0}}, +{(unsigned char*)"NotPrecedes", {226, 138, 128, 0}}, +{(unsigned char*)"NotPrecedesEqual", {226, 170, 175, 204, 184, 0}}, +{(unsigned char*)"NotPrecedesSlantEqual", {226, 139, 160, 0}}, +{(unsigned char*)"NotReverseElement", {226, 136, 140, 0}}, +{(unsigned char*)"NotRightTriangle", {226, 139, 171, 0}}, +{(unsigned char*)"NotRightTriangleBar", {226, 167, 144, 204, 184, 0}}, +{(unsigned char*)"NotRightTriangleEqual", {226, 139, 173, 0}}, +{(unsigned char*)"NotSquareSubset", {226, 138, 143, 204, 184, 0}}, +{(unsigned char*)"NotSquareSubsetEqual", {226, 139, 162, 0}}, +{(unsigned char*)"NotSquareSuperset", {226, 138, 144, 204, 184, 0}}, +{(unsigned char*)"NotSquareSupersetEqual", {226, 139, 163, 0}}, +{(unsigned char*)"NotSubset", {226, 138, 130, 226, 131, 146, 0}}, +{(unsigned char*)"NotSubsetEqual", {226, 138, 136, 0}}, +{(unsigned char*)"NotSucceeds", {226, 138, 129, 0}}, +{(unsigned char*)"NotSucceedsEqual", {226, 170, 176, 204, 184, 0}}, +{(unsigned char*)"NotSucceedsSlantEqual", {226, 139, 161, 0}}, +{(unsigned char*)"NotSucceedsTilde", {226, 137, 191, 204, 184, 0}}, +{(unsigned char*)"NotSuperset", {226, 138, 131, 226, 131, 146, 0}}, +{(unsigned char*)"NotSupersetEqual", {226, 138, 137, 0}}, +{(unsigned char*)"NotTilde", {226, 137, 129, 0}}, +{(unsigned char*)"NotTildeEqual", {226, 137, 132, 0}}, +{(unsigned char*)"NotTildeFullEqual", {226, 137, 135, 0}}, +{(unsigned char*)"NotTildeTilde", {226, 137, 137, 0}}, +{(unsigned char*)"NotVerticalBar", {226, 136, 164, 0}}, +{(unsigned char*)"Nscr", {240, 157, 146, 169, 0}}, +{(unsigned char*)"Ntilde", {195, 145, 0}}, +{(unsigned char*)"Nu", {206, 157, 0}}, +{(unsigned char*)"OElig", {197, 146, 0}}, +{(unsigned char*)"Oacute", {195, 147, 0}}, +{(unsigned char*)"Ocirc", {195, 148, 0}}, +{(unsigned char*)"Ocy", {208, 158, 0}}, +{(unsigned char*)"Odblac", {197, 144, 0}}, +{(unsigned char*)"Ofr", {240, 157, 148, 146, 0}}, +{(unsigned char*)"Ograve", {195, 146, 0}}, +{(unsigned char*)"Omacr", {197, 140, 0}}, +{(unsigned char*)"Omega", {206, 169, 0}}, +{(unsigned char*)"Omicron", {206, 159, 0}}, +{(unsigned char*)"Oopf", {240, 157, 149, 134, 0}}, +{(unsigned char*)"OpenCurlyDoubleQuote", {226, 128, 156, 0}}, +{(unsigned char*)"OpenCurlyQuote", {226, 128, 152, 0}}, +{(unsigned char*)"Or", {226, 169, 148, 0}}, +{(unsigned char*)"Oscr", {240, 157, 146, 170, 0}}, +{(unsigned char*)"Oslash", {195, 152, 0}}, +{(unsigned char*)"Otilde", {195, 149, 0}}, +{(unsigned char*)"Otimes", {226, 168, 183, 0}}, +{(unsigned char*)"Ouml", {195, 150, 0}}, +{(unsigned char*)"OverBar", {226, 128, 190, 0}}, +{(unsigned char*)"OverBrace", {226, 143, 158, 0}}, +{(unsigned char*)"OverBracket", {226, 142, 180, 0}}, +{(unsigned char*)"OverParenthesis", {226, 143, 156, 0}}, +{(unsigned char*)"PartialD", {226, 136, 130, 0}}, +{(unsigned char*)"Pcy", {208, 159, 0}}, +{(unsigned char*)"Pfr", {240, 157, 148, 147, 0}}, +{(unsigned char*)"Phi", {206, 166, 0}}, +{(unsigned char*)"Pi", {206, 160, 0}}, +{(unsigned char*)"PlusMinus", {194, 177, 0}}, +{(unsigned char*)"Poincareplane", {226, 132, 140, 0}}, +{(unsigned char*)"Popf", {226, 132, 153, 0}}, +{(unsigned char*)"Pr", {226, 170, 187, 0}}, +{(unsigned char*)"Precedes", {226, 137, 186, 0}}, +{(unsigned char*)"PrecedesEqual", {226, 170, 175, 0}}, +{(unsigned char*)"PrecedesSlantEqual", {226, 137, 188, 0}}, +{(unsigned char*)"PrecedesTilde", {226, 137, 190, 0}}, +{(unsigned char*)"Prime", {226, 128, 179, 0}}, +{(unsigned char*)"Product", {226, 136, 143, 0}}, +{(unsigned char*)"Proportion", {226, 136, 183, 0}}, +{(unsigned char*)"Proportional", {226, 136, 157, 0}}, +{(unsigned char*)"Pscr", {240, 157, 146, 171, 0}}, +{(unsigned char*)"Psi", {206, 168, 0}}, +{(unsigned char*)"QUOT", {34, 0}}, +{(unsigned char*)"Qfr", {240, 157, 148, 148, 0}}, +{(unsigned char*)"Qopf", {226, 132, 154, 0}}, +{(unsigned char*)"Qscr", {240, 157, 146, 172, 0}}, +{(unsigned char*)"RBarr", {226, 164, 144, 0}}, +{(unsigned char*)"REG", {194, 174, 0}}, +{(unsigned char*)"Racute", {197, 148, 0}}, +{(unsigned char*)"Rang", {226, 159, 171, 0}}, +{(unsigned char*)"Rarr", {226, 134, 160, 0}}, +{(unsigned char*)"Rarrtl", {226, 164, 150, 0}}, +{(unsigned char*)"Rcaron", {197, 152, 0}}, +{(unsigned char*)"Rcedil", {197, 150, 0}}, +{(unsigned char*)"Rcy", {208, 160, 0}}, +{(unsigned char*)"Re", {226, 132, 156, 0}}, +{(unsigned char*)"ReverseElement", {226, 136, 139, 0}}, +{(unsigned char*)"ReverseEquilibrium", {226, 135, 139, 0}}, +{(unsigned char*)"ReverseUpEquilibrium", {226, 165, 175, 0}}, +{(unsigned char*)"Rfr", {226, 132, 156, 0}}, +{(unsigned char*)"Rho", {206, 161, 0}}, +{(unsigned char*)"RightAngleBracket", {226, 159, 169, 0}}, +{(unsigned char*)"RightArrow", {226, 134, 146, 0}}, +{(unsigned char*)"RightArrowBar", {226, 135, 165, 0}}, +{(unsigned char*)"RightArrowLeftArrow", {226, 135, 132, 0}}, +{(unsigned char*)"RightCeiling", {226, 140, 137, 0}}, +{(unsigned char*)"RightDoubleBracket", {226, 159, 167, 0}}, +{(unsigned char*)"RightDownTeeVector", {226, 165, 157, 0}}, +{(unsigned char*)"RightDownVector", {226, 135, 130, 0}}, +{(unsigned char*)"RightDownVectorBar", {226, 165, 149, 0}}, +{(unsigned char*)"RightFloor", {226, 140, 139, 0}}, +{(unsigned char*)"RightTee", {226, 138, 162, 0}}, +{(unsigned char*)"RightTeeArrow", {226, 134, 166, 0}}, +{(unsigned char*)"RightTeeVector", {226, 165, 155, 0}}, +{(unsigned char*)"RightTriangle", {226, 138, 179, 0}}, +{(unsigned char*)"RightTriangleBar", {226, 167, 144, 0}}, +{(unsigned char*)"RightTriangleEqual", {226, 138, 181, 0}}, +{(unsigned char*)"RightUpDownVector", {226, 165, 143, 0}}, +{(unsigned char*)"RightUpTeeVector", {226, 165, 156, 0}}, +{(unsigned char*)"RightUpVector", {226, 134, 190, 0}}, +{(unsigned char*)"RightUpVectorBar", {226, 165, 148, 0}}, +{(unsigned char*)"RightVector", {226, 135, 128, 0}}, +{(unsigned char*)"RightVectorBar", {226, 165, 147, 0}}, +{(unsigned char*)"Rightarrow", {226, 135, 146, 0}}, +{(unsigned char*)"Ropf", {226, 132, 157, 0}}, +{(unsigned char*)"RoundImplies", {226, 165, 176, 0}}, +{(unsigned char*)"Rrightarrow", {226, 135, 155, 0}}, +{(unsigned char*)"Rscr", {226, 132, 155, 0}}, +{(unsigned char*)"Rsh", {226, 134, 177, 0}}, +{(unsigned char*)"RuleDelayed", {226, 167, 180, 0}}, +{(unsigned char*)"SHCHcy", {208, 169, 0}}, +{(unsigned char*)"SHcy", {208, 168, 0}}, +{(unsigned char*)"SOFTcy", {208, 172, 0}}, +{(unsigned char*)"Sacute", {197, 154, 0}}, +{(unsigned char*)"Sc", {226, 170, 188, 0}}, +{(unsigned char*)"Scaron", {197, 160, 0}}, +{(unsigned char*)"Scedil", {197, 158, 0}}, +{(unsigned char*)"Scirc", {197, 156, 0}}, +{(unsigned char*)"Scy", {208, 161, 0}}, +{(unsigned char*)"Sfr", {240, 157, 148, 150, 0}}, +{(unsigned char*)"ShortDownArrow", {226, 134, 147, 0}}, +{(unsigned char*)"ShortLeftArrow", {226, 134, 144, 0}}, +{(unsigned char*)"ShortRightArrow", {226, 134, 146, 0}}, +{(unsigned char*)"ShortUpArrow", {226, 134, 145, 0}}, +{(unsigned char*)"Sigma", {206, 163, 0}}, +{(unsigned char*)"SmallCircle", {226, 136, 152, 0}}, +{(unsigned char*)"Sopf", {240, 157, 149, 138, 0}}, +{(unsigned char*)"Sqrt", {226, 136, 154, 0}}, +{(unsigned char*)"Square", {226, 150, 161, 0}}, +{(unsigned char*)"SquareIntersection", {226, 138, 147, 0}}, +{(unsigned char*)"SquareSubset", {226, 138, 143, 0}}, +{(unsigned char*)"SquareSubsetEqual", {226, 138, 145, 0}}, +{(unsigned char*)"SquareSuperset", {226, 138, 144, 0}}, +{(unsigned char*)"SquareSupersetEqual", {226, 138, 146, 0}}, +{(unsigned char*)"SquareUnion", {226, 138, 148, 0}}, +{(unsigned char*)"Sscr", {240, 157, 146, 174, 0}}, +{(unsigned char*)"Star", {226, 139, 134, 0}}, +{(unsigned char*)"Sub", {226, 139, 144, 0}}, +{(unsigned char*)"Subset", {226, 139, 144, 0}}, +{(unsigned char*)"SubsetEqual", {226, 138, 134, 0}}, +{(unsigned char*)"Succeeds", {226, 137, 187, 0}}, +{(unsigned char*)"SucceedsEqual", {226, 170, 176, 0}}, +{(unsigned char*)"SucceedsSlantEqual", {226, 137, 189, 0}}, +{(unsigned char*)"SucceedsTilde", {226, 137, 191, 0}}, +{(unsigned char*)"SuchThat", {226, 136, 139, 0}}, +{(unsigned char*)"Sum", {226, 136, 145, 0}}, +{(unsigned char*)"Sup", {226, 139, 145, 0}}, +{(unsigned char*)"Superset", {226, 138, 131, 0}}, +{(unsigned char*)"SupersetEqual", {226, 138, 135, 0}}, +{(unsigned char*)"Supset", {226, 139, 145, 0}}, +{(unsigned char*)"THORN", {195, 158, 0}}, +{(unsigned char*)"TRADE", {226, 132, 162, 0}}, +{(unsigned char*)"TSHcy", {208, 139, 0}}, +{(unsigned char*)"TScy", {208, 166, 0}}, +{(unsigned char*)"Tab", {9, 0}}, +{(unsigned char*)"Tau", {206, 164, 0}}, +{(unsigned char*)"Tcaron", {197, 164, 0}}, +{(unsigned char*)"Tcedil", {197, 162, 0}}, +{(unsigned char*)"Tcy", {208, 162, 0}}, +{(unsigned char*)"Tfr", {240, 157, 148, 151, 0}}, +{(unsigned char*)"Therefore", {226, 136, 180, 0}}, +{(unsigned char*)"Theta", {206, 152, 0}}, +{(unsigned char*)"ThickSpace", {226, 129, 159, 226, 128, 138, 0}}, +{(unsigned char*)"ThinSpace", {226, 128, 137, 0}}, +{(unsigned char*)"Tilde", {226, 136, 188, 0}}, +{(unsigned char*)"TildeEqual", {226, 137, 131, 0}}, +{(unsigned char*)"TildeFullEqual", {226, 137, 133, 0}}, +{(unsigned char*)"TildeTilde", {226, 137, 136, 0}}, +{(unsigned char*)"Topf", {240, 157, 149, 139, 0}}, +{(unsigned char*)"TripleDot", {226, 131, 155, 0}}, +{(unsigned char*)"Tscr", {240, 157, 146, 175, 0}}, +{(unsigned char*)"Tstrok", {197, 166, 0}}, +{(unsigned char*)"Uacute", {195, 154, 0}}, +{(unsigned char*)"Uarr", {226, 134, 159, 0}}, +{(unsigned char*)"Uarrocir", {226, 165, 137, 0}}, +{(unsigned char*)"Ubrcy", {208, 142, 0}}, +{(unsigned char*)"Ubreve", {197, 172, 0}}, +{(unsigned char*)"Ucirc", {195, 155, 0}}, +{(unsigned char*)"Ucy", {208, 163, 0}}, +{(unsigned char*)"Udblac", {197, 176, 0}}, +{(unsigned char*)"Ufr", {240, 157, 148, 152, 0}}, +{(unsigned char*)"Ugrave", {195, 153, 0}}, +{(unsigned char*)"Umacr", {197, 170, 0}}, +{(unsigned char*)"UnderBar", {95, 0}}, +{(unsigned char*)"UnderBrace", {226, 143, 159, 0}}, +{(unsigned char*)"UnderBracket", {226, 142, 181, 0}}, +{(unsigned char*)"UnderParenthesis", {226, 143, 157, 0}}, +{(unsigned char*)"Union", {226, 139, 131, 0}}, +{(unsigned char*)"UnionPlus", {226, 138, 142, 0}}, +{(unsigned char*)"Uogon", {197, 178, 0}}, +{(unsigned char*)"Uopf", {240, 157, 149, 140, 0}}, +{(unsigned char*)"UpArrow", {226, 134, 145, 0}}, +{(unsigned char*)"UpArrowBar", {226, 164, 146, 0}}, +{(unsigned char*)"UpArrowDownArrow", {226, 135, 133, 0}}, +{(unsigned char*)"UpDownArrow", {226, 134, 149, 0}}, +{(unsigned char*)"UpEquilibrium", {226, 165, 174, 0}}, +{(unsigned char*)"UpTee", {226, 138, 165, 0}}, +{(unsigned char*)"UpTeeArrow", {226, 134, 165, 0}}, +{(unsigned char*)"Uparrow", {226, 135, 145, 0}}, +{(unsigned char*)"Updownarrow", {226, 135, 149, 0}}, +{(unsigned char*)"UpperLeftArrow", {226, 134, 150, 0}}, +{(unsigned char*)"UpperRightArrow", {226, 134, 151, 0}}, +{(unsigned char*)"Upsi", {207, 146, 0}}, +{(unsigned char*)"Upsilon", {206, 165, 0}}, +{(unsigned char*)"Uring", {197, 174, 0}}, +{(unsigned char*)"Uscr", {240, 157, 146, 176, 0}}, +{(unsigned char*)"Utilde", {197, 168, 0}}, +{(unsigned char*)"Uuml", {195, 156, 0}}, +{(unsigned char*)"VDash", {226, 138, 171, 0}}, +{(unsigned char*)"Vbar", {226, 171, 171, 0}}, +{(unsigned char*)"Vcy", {208, 146, 0}}, +{(unsigned char*)"Vdash", {226, 138, 169, 0}}, +{(unsigned char*)"Vdashl", {226, 171, 166, 0}}, +{(unsigned char*)"Vee", {226, 139, 129, 0}}, +{(unsigned char*)"Verbar", {226, 128, 150, 0}}, +{(unsigned char*)"Vert", {226, 128, 150, 0}}, +{(unsigned char*)"VerticalBar", {226, 136, 163, 0}}, +{(unsigned char*)"VerticalLine", {124, 0}}, +{(unsigned char*)"VerticalSeparator", {226, 157, 152, 0}}, +{(unsigned char*)"VerticalTilde", {226, 137, 128, 0}}, +{(unsigned char*)"VeryThinSpace", {226, 128, 138, 0}}, +{(unsigned char*)"Vfr", {240, 157, 148, 153, 0}}, +{(unsigned char*)"Vopf", {240, 157, 149, 141, 0}}, +{(unsigned char*)"Vscr", {240, 157, 146, 177, 0}}, +{(unsigned char*)"Vvdash", {226, 138, 170, 0}}, +{(unsigned char*)"Wcirc", {197, 180, 0}}, +{(unsigned char*)"Wedge", {226, 139, 128, 0}}, +{(unsigned char*)"Wfr", {240, 157, 148, 154, 0}}, +{(unsigned char*)"Wopf", {240, 157, 149, 142, 0}}, +{(unsigned char*)"Wscr", {240, 157, 146, 178, 0}}, +{(unsigned char*)"Xfr", {240, 157, 148, 155, 0}}, +{(unsigned char*)"Xi", {206, 158, 0}}, +{(unsigned char*)"Xopf", {240, 157, 149, 143, 0}}, +{(unsigned char*)"Xscr", {240, 157, 146, 179, 0}}, +{(unsigned char*)"YAcy", {208, 175, 0}}, +{(unsigned char*)"YIcy", {208, 135, 0}}, +{(unsigned char*)"YUcy", {208, 174, 0}}, +{(unsigned char*)"Yacute", {195, 157, 0}}, +{(unsigned char*)"Ycirc", {197, 182, 0}}, +{(unsigned char*)"Ycy", {208, 171, 0}}, +{(unsigned char*)"Yfr", {240, 157, 148, 156, 0}}, +{(unsigned char*)"Yopf", {240, 157, 149, 144, 0}}, +{(unsigned char*)"Yscr", {240, 157, 146, 180, 0}}, +{(unsigned char*)"Yuml", {197, 184, 0}}, +{(unsigned char*)"ZHcy", {208, 150, 0}}, +{(unsigned char*)"Zacute", {197, 185, 0}}, +{(unsigned char*)"Zcaron", {197, 189, 0}}, +{(unsigned char*)"Zcy", {208, 151, 0}}, +{(unsigned char*)"Zdot", {197, 187, 0}}, +{(unsigned char*)"ZeroWidthSpace", {226, 128, 139, 0}}, +{(unsigned char*)"Zeta", {206, 150, 0}}, +{(unsigned char*)"Zfr", {226, 132, 168, 0}}, +{(unsigned char*)"Zopf", {226, 132, 164, 0}}, +{(unsigned char*)"Zscr", {240, 157, 146, 181, 0}}, +{(unsigned char*)"aacute", {195, 161, 0}}, +{(unsigned char*)"abreve", {196, 131, 0}}, +{(unsigned char*)"ac", {226, 136, 190, 0}}, +{(unsigned char*)"acE", {226, 136, 190, 204, 179, 0}}, +{(unsigned char*)"acd", {226, 136, 191, 0}}, +{(unsigned char*)"acirc", {195, 162, 0}}, +{(unsigned char*)"acute", {194, 180, 0}}, +{(unsigned char*)"acy", {208, 176, 0}}, +{(unsigned char*)"aelig", {195, 166, 0}}, +{(unsigned char*)"af", {226, 129, 161, 0}}, +{(unsigned char*)"afr", {240, 157, 148, 158, 0}}, +{(unsigned char*)"agrave", {195, 160, 0}}, +{(unsigned char*)"alefsym", {226, 132, 181, 0}}, +{(unsigned char*)"aleph", {226, 132, 181, 0}}, +{(unsigned char*)"alpha", {206, 177, 0}}, +{(unsigned char*)"amacr", {196, 129, 0}}, +{(unsigned char*)"amalg", {226, 168, 191, 0}}, +{(unsigned char*)"amp", {38, 0}}, +{(unsigned char*)"and", {226, 136, 167, 0}}, +{(unsigned char*)"andand", {226, 169, 149, 0}}, +{(unsigned char*)"andd", {226, 169, 156, 0}}, +{(unsigned char*)"andslope", {226, 169, 152, 0}}, +{(unsigned char*)"andv", {226, 169, 154, 0}}, +{(unsigned char*)"ang", {226, 136, 160, 0}}, +{(unsigned char*)"ange", {226, 166, 164, 0}}, +{(unsigned char*)"angle", {226, 136, 160, 0}}, +{(unsigned char*)"angmsd", {226, 136, 161, 0}}, +{(unsigned char*)"angmsdaa", {226, 166, 168, 0}}, +{(unsigned char*)"angmsdab", {226, 166, 169, 0}}, +{(unsigned char*)"angmsdac", {226, 166, 170, 0}}, +{(unsigned char*)"angmsdad", {226, 166, 171, 0}}, +{(unsigned char*)"angmsdae", {226, 166, 172, 0}}, +{(unsigned char*)"angmsdaf", {226, 166, 173, 0}}, +{(unsigned char*)"angmsdag", {226, 166, 174, 0}}, +{(unsigned char*)"angmsdah", {226, 166, 175, 0}}, +{(unsigned char*)"angrt", {226, 136, 159, 0}}, +{(unsigned char*)"angrtvb", {226, 138, 190, 0}}, +{(unsigned char*)"angrtvbd", {226, 166, 157, 0}}, +{(unsigned char*)"angsph", {226, 136, 162, 0}}, +{(unsigned char*)"angst", {195, 133, 0}}, +{(unsigned char*)"angzarr", {226, 141, 188, 0}}, +{(unsigned char*)"aogon", {196, 133, 0}}, +{(unsigned char*)"aopf", {240, 157, 149, 146, 0}}, +{(unsigned char*)"ap", {226, 137, 136, 0}}, +{(unsigned char*)"apE", {226, 169, 176, 0}}, +{(unsigned char*)"apacir", {226, 169, 175, 0}}, +{(unsigned char*)"ape", {226, 137, 138, 0}}, +{(unsigned char*)"apid", {226, 137, 139, 0}}, +{(unsigned char*)"apos", {39, 0}}, +{(unsigned char*)"approx", {226, 137, 136, 0}}, +{(unsigned char*)"approxeq", {226, 137, 138, 0}}, +{(unsigned char*)"aring", {195, 165, 0}}, +{(unsigned char*)"ascr", {240, 157, 146, 182, 0}}, +{(unsigned char*)"ast", {42, 0}}, +{(unsigned char*)"asymp", {226, 137, 136, 0}}, +{(unsigned char*)"asympeq", {226, 137, 141, 0}}, +{(unsigned char*)"atilde", {195, 163, 0}}, +{(unsigned char*)"auml", {195, 164, 0}}, +{(unsigned char*)"awconint", {226, 136, 179, 0}}, +{(unsigned char*)"awint", {226, 168, 145, 0}}, +{(unsigned char*)"bNot", {226, 171, 173, 0}}, +{(unsigned char*)"backcong", {226, 137, 140, 0}}, +{(unsigned char*)"backepsilon", {207, 182, 0}}, +{(unsigned char*)"backprime", {226, 128, 181, 0}}, +{(unsigned char*)"backsim", {226, 136, 189, 0}}, +{(unsigned char*)"backsimeq", {226, 139, 141, 0}}, +{(unsigned char*)"barvee", {226, 138, 189, 0}}, +{(unsigned char*)"barwed", {226, 140, 133, 0}}, +{(unsigned char*)"barwedge", {226, 140, 133, 0}}, +{(unsigned char*)"bbrk", {226, 142, 181, 0}}, +{(unsigned char*)"bbrktbrk", {226, 142, 182, 0}}, +{(unsigned char*)"bcong", {226, 137, 140, 0}}, +{(unsigned char*)"bcy", {208, 177, 0}}, +{(unsigned char*)"bdquo", {226, 128, 158, 0}}, +{(unsigned char*)"becaus", {226, 136, 181, 0}}, +{(unsigned char*)"because", {226, 136, 181, 0}}, +{(unsigned char*)"bemptyv", {226, 166, 176, 0}}, +{(unsigned char*)"bepsi", {207, 182, 0}}, +{(unsigned char*)"bernou", {226, 132, 172, 0}}, +{(unsigned char*)"beta", {206, 178, 0}}, +{(unsigned char*)"beth", {226, 132, 182, 0}}, +{(unsigned char*)"between", {226, 137, 172, 0}}, +{(unsigned char*)"bfr", {240, 157, 148, 159, 0}}, +{(unsigned char*)"bigcap", {226, 139, 130, 0}}, +{(unsigned char*)"bigcirc", {226, 151, 175, 0}}, +{(unsigned char*)"bigcup", {226, 139, 131, 0}}, +{(unsigned char*)"bigodot", {226, 168, 128, 0}}, +{(unsigned char*)"bigoplus", {226, 168, 129, 0}}, +{(unsigned char*)"bigotimes", {226, 168, 130, 0}}, +{(unsigned char*)"bigsqcup", {226, 168, 134, 0}}, +{(unsigned char*)"bigstar", {226, 152, 133, 0}}, +{(unsigned char*)"bigtriangledown", {226, 150, 189, 0}}, +{(unsigned char*)"bigtriangleup", {226, 150, 179, 0}}, +{(unsigned char*)"biguplus", {226, 168, 132, 0}}, +{(unsigned char*)"bigvee", {226, 139, 129, 0}}, +{(unsigned char*)"bigwedge", {226, 139, 128, 0}}, +{(unsigned char*)"bkarow", {226, 164, 141, 0}}, +{(unsigned char*)"blacklozenge", {226, 167, 171, 0}}, +{(unsigned char*)"blacksquare", {226, 150, 170, 0}}, +{(unsigned char*)"blacktriangle", {226, 150, 180, 0}}, +{(unsigned char*)"blacktriangledown", {226, 150, 190, 0}}, +{(unsigned char*)"blacktriangleleft", {226, 151, 130, 0}}, +{(unsigned char*)"blacktriangleright", {226, 150, 184, 0}}, +{(unsigned char*)"blank", {226, 144, 163, 0}}, +{(unsigned char*)"blk12", {226, 150, 146, 0}}, +{(unsigned char*)"blk14", {226, 150, 145, 0}}, +{(unsigned char*)"blk34", {226, 150, 147, 0}}, +{(unsigned char*)"block", {226, 150, 136, 0}}, +{(unsigned char*)"bne", {61, 226, 131, 165, 0}}, +{(unsigned char*)"bnequiv", {226, 137, 161, 226, 131, 165, 0}}, +{(unsigned char*)"bnot", {226, 140, 144, 0}}, +{(unsigned char*)"bopf", {240, 157, 149, 147, 0}}, +{(unsigned char*)"bot", {226, 138, 165, 0}}, +{(unsigned char*)"bottom", {226, 138, 165, 0}}, +{(unsigned char*)"bowtie", {226, 139, 136, 0}}, +{(unsigned char*)"boxDL", {226, 149, 151, 0}}, +{(unsigned char*)"boxDR", {226, 149, 148, 0}}, +{(unsigned char*)"boxDl", {226, 149, 150, 0}}, +{(unsigned char*)"boxDr", {226, 149, 147, 0}}, +{(unsigned char*)"boxH", {226, 149, 144, 0}}, +{(unsigned char*)"boxHD", {226, 149, 166, 0}}, +{(unsigned char*)"boxHU", {226, 149, 169, 0}}, +{(unsigned char*)"boxHd", {226, 149, 164, 0}}, +{(unsigned char*)"boxHu", {226, 149, 167, 0}}, +{(unsigned char*)"boxUL", {226, 149, 157, 0}}, +{(unsigned char*)"boxUR", {226, 149, 154, 0}}, +{(unsigned char*)"boxUl", {226, 149, 156, 0}}, +{(unsigned char*)"boxUr", {226, 149, 153, 0}}, +{(unsigned char*)"boxV", {226, 149, 145, 0}}, +{(unsigned char*)"boxVH", {226, 149, 172, 0}}, +{(unsigned char*)"boxVL", {226, 149, 163, 0}}, +{(unsigned char*)"boxVR", {226, 149, 160, 0}}, +{(unsigned char*)"boxVh", {226, 149, 171, 0}}, +{(unsigned char*)"boxVl", {226, 149, 162, 0}}, +{(unsigned char*)"boxVr", {226, 149, 159, 0}}, +{(unsigned char*)"boxbox", {226, 167, 137, 0}}, +{(unsigned char*)"boxdL", {226, 149, 149, 0}}, +{(unsigned char*)"boxdR", {226, 149, 146, 0}}, +{(unsigned char*)"boxdl", {226, 148, 144, 0}}, +{(unsigned char*)"boxdr", {226, 148, 140, 0}}, +{(unsigned char*)"boxh", {226, 148, 128, 0}}, +{(unsigned char*)"boxhD", {226, 149, 165, 0}}, +{(unsigned char*)"boxhU", {226, 149, 168, 0}}, +{(unsigned char*)"boxhd", {226, 148, 172, 0}}, +{(unsigned char*)"boxhu", {226, 148, 180, 0}}, +{(unsigned char*)"boxminus", {226, 138, 159, 0}}, +{(unsigned char*)"boxplus", {226, 138, 158, 0}}, +{(unsigned char*)"boxtimes", {226, 138, 160, 0}}, +{(unsigned char*)"boxuL", {226, 149, 155, 0}}, +{(unsigned char*)"boxuR", {226, 149, 152, 0}}, +{(unsigned char*)"boxul", {226, 148, 152, 0}}, +{(unsigned char*)"boxur", {226, 148, 148, 0}}, +{(unsigned char*)"boxv", {226, 148, 130, 0}}, +{(unsigned char*)"boxvH", {226, 149, 170, 0}}, +{(unsigned char*)"boxvL", {226, 149, 161, 0}}, +{(unsigned char*)"boxvR", {226, 149, 158, 0}}, +{(unsigned char*)"boxvh", {226, 148, 188, 0}}, +{(unsigned char*)"boxvl", {226, 148, 164, 0}}, +{(unsigned char*)"boxvr", {226, 148, 156, 0}}, +{(unsigned char*)"bprime", {226, 128, 181, 0}}, +{(unsigned char*)"breve", {203, 152, 0}}, +{(unsigned char*)"brvbar", {194, 166, 0}}, +{(unsigned char*)"bscr", {240, 157, 146, 183, 0}}, +{(unsigned char*)"bsemi", {226, 129, 143, 0}}, +{(unsigned char*)"bsim", {226, 136, 189, 0}}, +{(unsigned char*)"bsime", {226, 139, 141, 0}}, +{(unsigned char*)"bsol", {92, 0}}, +{(unsigned char*)"bsolb", {226, 167, 133, 0}}, +{(unsigned char*)"bsolhsub", {226, 159, 136, 0}}, +{(unsigned char*)"bull", {226, 128, 162, 0}}, +{(unsigned char*)"bullet", {226, 128, 162, 0}}, +{(unsigned char*)"bump", {226, 137, 142, 0}}, +{(unsigned char*)"bumpE", {226, 170, 174, 0}}, +{(unsigned char*)"bumpe", {226, 137, 143, 0}}, +{(unsigned char*)"bumpeq", {226, 137, 143, 0}}, +{(unsigned char*)"cacute", {196, 135, 0}}, +{(unsigned char*)"cap", {226, 136, 169, 0}}, +{(unsigned char*)"capand", {226, 169, 132, 0}}, +{(unsigned char*)"capbrcup", {226, 169, 137, 0}}, +{(unsigned char*)"capcap", {226, 169, 139, 0}}, +{(unsigned char*)"capcup", {226, 169, 135, 0}}, +{(unsigned char*)"capdot", {226, 169, 128, 0}}, +{(unsigned char*)"caps", {226, 136, 169, 239, 184, 128, 0}}, +{(unsigned char*)"caret", {226, 129, 129, 0}}, +{(unsigned char*)"caron", {203, 135, 0}}, +{(unsigned char*)"ccaps", {226, 169, 141, 0}}, +{(unsigned char*)"ccaron", {196, 141, 0}}, +{(unsigned char*)"ccedil", {195, 167, 0}}, +{(unsigned char*)"ccirc", {196, 137, 0}}, +{(unsigned char*)"ccups", {226, 169, 140, 0}}, +{(unsigned char*)"ccupssm", {226, 169, 144, 0}}, +{(unsigned char*)"cdot", {196, 139, 0}}, +{(unsigned char*)"cedil", {194, 184, 0}}, +{(unsigned char*)"cemptyv", {226, 166, 178, 0}}, +{(unsigned char*)"cent", {194, 162, 0}}, +{(unsigned char*)"centerdot", {194, 183, 0}}, +{(unsigned char*)"cfr", {240, 157, 148, 160, 0}}, +{(unsigned char*)"chcy", {209, 135, 0}}, +{(unsigned char*)"check", {226, 156, 147, 0}}, +{(unsigned char*)"checkmark", {226, 156, 147, 0}}, +{(unsigned char*)"chi", {207, 135, 0}}, +{(unsigned char*)"cir", {226, 151, 139, 0}}, +{(unsigned char*)"cirE", {226, 167, 131, 0}}, +{(unsigned char*)"circ", {203, 134, 0}}, +{(unsigned char*)"circeq", {226, 137, 151, 0}}, +{(unsigned char*)"circlearrowleft", {226, 134, 186, 0}}, +{(unsigned char*)"circlearrowright", {226, 134, 187, 0}}, +{(unsigned char*)"circledR", {194, 174, 0}}, +{(unsigned char*)"circledS", {226, 147, 136, 0}}, +{(unsigned char*)"circledast", {226, 138, 155, 0}}, +{(unsigned char*)"circledcirc", {226, 138, 154, 0}}, +{(unsigned char*)"circleddash", {226, 138, 157, 0}}, +{(unsigned char*)"cire", {226, 137, 151, 0}}, +{(unsigned char*)"cirfnint", {226, 168, 144, 0}}, +{(unsigned char*)"cirmid", {226, 171, 175, 0}}, +{(unsigned char*)"cirscir", {226, 167, 130, 0}}, +{(unsigned char*)"clubs", {226, 153, 163, 0}}, +{(unsigned char*)"clubsuit", {226, 153, 163, 0}}, +{(unsigned char*)"colon", {58, 0}}, +{(unsigned char*)"colone", {226, 137, 148, 0}}, +{(unsigned char*)"coloneq", {226, 137, 148, 0}}, +{(unsigned char*)"comma", {44, 0}}, +{(unsigned char*)"commat", {64, 0}}, +{(unsigned char*)"comp", {226, 136, 129, 0}}, +{(unsigned char*)"compfn", {226, 136, 152, 0}}, +{(unsigned char*)"complement", {226, 136, 129, 0}}, +{(unsigned char*)"complexes", {226, 132, 130, 0}}, +{(unsigned char*)"cong", {226, 137, 133, 0}}, +{(unsigned char*)"congdot", {226, 169, 173, 0}}, +{(unsigned char*)"conint", {226, 136, 174, 0}}, +{(unsigned char*)"copf", {240, 157, 149, 148, 0}}, +{(unsigned char*)"coprod", {226, 136, 144, 0}}, +{(unsigned char*)"copy", {194, 169, 0}}, +{(unsigned char*)"copysr", {226, 132, 151, 0}}, +{(unsigned char*)"crarr", {226, 134, 181, 0}}, +{(unsigned char*)"cross", {226, 156, 151, 0}}, +{(unsigned char*)"cscr", {240, 157, 146, 184, 0}}, +{(unsigned char*)"csub", {226, 171, 143, 0}}, +{(unsigned char*)"csube", {226, 171, 145, 0}}, +{(unsigned char*)"csup", {226, 171, 144, 0}}, +{(unsigned char*)"csupe", {226, 171, 146, 0}}, +{(unsigned char*)"ctdot", {226, 139, 175, 0}}, +{(unsigned char*)"cudarrl", {226, 164, 184, 0}}, +{(unsigned char*)"cudarrr", {226, 164, 181, 0}}, +{(unsigned char*)"cuepr", {226, 139, 158, 0}}, +{(unsigned char*)"cuesc", {226, 139, 159, 0}}, +{(unsigned char*)"cularr", {226, 134, 182, 0}}, +{(unsigned char*)"cularrp", {226, 164, 189, 0}}, +{(unsigned char*)"cup", {226, 136, 170, 0}}, +{(unsigned char*)"cupbrcap", {226, 169, 136, 0}}, +{(unsigned char*)"cupcap", {226, 169, 134, 0}}, +{(unsigned char*)"cupcup", {226, 169, 138, 0}}, +{(unsigned char*)"cupdot", {226, 138, 141, 0}}, +{(unsigned char*)"cupor", {226, 169, 133, 0}}, +{(unsigned char*)"cups", {226, 136, 170, 239, 184, 128, 0}}, +{(unsigned char*)"curarr", {226, 134, 183, 0}}, +{(unsigned char*)"curarrm", {226, 164, 188, 0}}, +{(unsigned char*)"curlyeqprec", {226, 139, 158, 0}}, +{(unsigned char*)"curlyeqsucc", {226, 139, 159, 0}}, +{(unsigned char*)"curlyvee", {226, 139, 142, 0}}, +{(unsigned char*)"curlywedge", {226, 139, 143, 0}}, +{(unsigned char*)"curren", {194, 164, 0}}, +{(unsigned char*)"curvearrowleft", {226, 134, 182, 0}}, +{(unsigned char*)"curvearrowright", {226, 134, 183, 0}}, +{(unsigned char*)"cuvee", {226, 139, 142, 0}}, +{(unsigned char*)"cuwed", {226, 139, 143, 0}}, +{(unsigned char*)"cwconint", {226, 136, 178, 0}}, +{(unsigned char*)"cwint", {226, 136, 177, 0}}, +{(unsigned char*)"cylcty", {226, 140, 173, 0}}, +{(unsigned char*)"dArr", {226, 135, 147, 0}}, +{(unsigned char*)"dHar", {226, 165, 165, 0}}, +{(unsigned char*)"dagger", {226, 128, 160, 0}}, +{(unsigned char*)"daleth", {226, 132, 184, 0}}, +{(unsigned char*)"darr", {226, 134, 147, 0}}, +{(unsigned char*)"dash", {226, 128, 144, 0}}, +{(unsigned char*)"dashv", {226, 138, 163, 0}}, +{(unsigned char*)"dbkarow", {226, 164, 143, 0}}, +{(unsigned char*)"dblac", {203, 157, 0}}, +{(unsigned char*)"dcaron", {196, 143, 0}}, +{(unsigned char*)"dcy", {208, 180, 0}}, +{(unsigned char*)"dd", {226, 133, 134, 0}}, +{(unsigned char*)"ddagger", {226, 128, 161, 0}}, +{(unsigned char*)"ddarr", {226, 135, 138, 0}}, +{(unsigned char*)"ddotseq", {226, 169, 183, 0}}, +{(unsigned char*)"deg", {194, 176, 0}}, +{(unsigned char*)"delta", {206, 180, 0}}, +{(unsigned char*)"demptyv", {226, 166, 177, 0}}, +{(unsigned char*)"dfisht", {226, 165, 191, 0}}, +{(unsigned char*)"dfr", {240, 157, 148, 161, 0}}, +{(unsigned char*)"dharl", {226, 135, 131, 0}}, +{(unsigned char*)"dharr", {226, 135, 130, 0}}, +{(unsigned char*)"diam", {226, 139, 132, 0}}, +{(unsigned char*)"diamond", {226, 139, 132, 0}}, +{(unsigned char*)"diamondsuit", {226, 153, 166, 0}}, +{(unsigned char*)"diams", {226, 153, 166, 0}}, +{(unsigned char*)"die", {194, 168, 0}}, +{(unsigned char*)"digamma", {207, 157, 0}}, +{(unsigned char*)"disin", {226, 139, 178, 0}}, +{(unsigned char*)"div", {195, 183, 0}}, +{(unsigned char*)"divide", {195, 183, 0}}, +{(unsigned char*)"divideontimes", {226, 139, 135, 0}}, +{(unsigned char*)"divonx", {226, 139, 135, 0}}, +{(unsigned char*)"djcy", {209, 146, 0}}, +{(unsigned char*)"dlcorn", {226, 140, 158, 0}}, +{(unsigned char*)"dlcrop", {226, 140, 141, 0}}, +{(unsigned char*)"dollar", {36, 0}}, +{(unsigned char*)"dopf", {240, 157, 149, 149, 0}}, +{(unsigned char*)"dot", {203, 153, 0}}, +{(unsigned char*)"doteq", {226, 137, 144, 0}}, +{(unsigned char*)"doteqdot", {226, 137, 145, 0}}, +{(unsigned char*)"dotminus", {226, 136, 184, 0}}, +{(unsigned char*)"dotplus", {226, 136, 148, 0}}, +{(unsigned char*)"dotsquare", {226, 138, 161, 0}}, +{(unsigned char*)"doublebarwedge", {226, 140, 134, 0}}, +{(unsigned char*)"downarrow", {226, 134, 147, 0}}, +{(unsigned char*)"downdownarrows", {226, 135, 138, 0}}, +{(unsigned char*)"downharpoonleft", {226, 135, 131, 0}}, +{(unsigned char*)"downharpoonright", {226, 135, 130, 0}}, +{(unsigned char*)"drbkarow", {226, 164, 144, 0}}, +{(unsigned char*)"drcorn", {226, 140, 159, 0}}, +{(unsigned char*)"drcrop", {226, 140, 140, 0}}, +{(unsigned char*)"dscr", {240, 157, 146, 185, 0}}, +{(unsigned char*)"dscy", {209, 149, 0}}, +{(unsigned char*)"dsol", {226, 167, 182, 0}}, +{(unsigned char*)"dstrok", {196, 145, 0}}, +{(unsigned char*)"dtdot", {226, 139, 177, 0}}, +{(unsigned char*)"dtri", {226, 150, 191, 0}}, +{(unsigned char*)"dtrif", {226, 150, 190, 0}}, +{(unsigned char*)"duarr", {226, 135, 181, 0}}, +{(unsigned char*)"duhar", {226, 165, 175, 0}}, +{(unsigned char*)"dwangle", {226, 166, 166, 0}}, +{(unsigned char*)"dzcy", {209, 159, 0}}, +{(unsigned char*)"dzigrarr", {226, 159, 191, 0}}, +{(unsigned char*)"eDDot", {226, 169, 183, 0}}, +{(unsigned char*)"eDot", {226, 137, 145, 0}}, +{(unsigned char*)"eacute", {195, 169, 0}}, +{(unsigned char*)"easter", {226, 169, 174, 0}}, +{(unsigned char*)"ecaron", {196, 155, 0}}, +{(unsigned char*)"ecir", {226, 137, 150, 0}}, +{(unsigned char*)"ecirc", {195, 170, 0}}, +{(unsigned char*)"ecolon", {226, 137, 149, 0}}, +{(unsigned char*)"ecy", {209, 141, 0}}, +{(unsigned char*)"edot", {196, 151, 0}}, +{(unsigned char*)"ee", {226, 133, 135, 0}}, +{(unsigned char*)"efDot", {226, 137, 146, 0}}, +{(unsigned char*)"efr", {240, 157, 148, 162, 0}}, +{(unsigned char*)"eg", {226, 170, 154, 0}}, +{(unsigned char*)"egrave", {195, 168, 0}}, +{(unsigned char*)"egs", {226, 170, 150, 0}}, +{(unsigned char*)"egsdot", {226, 170, 152, 0}}, +{(unsigned char*)"el", {226, 170, 153, 0}}, +{(unsigned char*)"elinters", {226, 143, 167, 0}}, +{(unsigned char*)"ell", {226, 132, 147, 0}}, +{(unsigned char*)"els", {226, 170, 149, 0}}, +{(unsigned char*)"elsdot", {226, 170, 151, 0}}, +{(unsigned char*)"emacr", {196, 147, 0}}, +{(unsigned char*)"empty", {226, 136, 133, 0}}, +{(unsigned char*)"emptyset", {226, 136, 133, 0}}, +{(unsigned char*)"emptyv", {226, 136, 133, 0}}, +{(unsigned char*)"emsp", {226, 128, 131, 0}}, +{(unsigned char*)"emsp13", {226, 128, 132, 0}}, +{(unsigned char*)"emsp14", {226, 128, 133, 0}}, +{(unsigned char*)"eng", {197, 139, 0}}, +{(unsigned char*)"ensp", {226, 128, 130, 0}}, +{(unsigned char*)"eogon", {196, 153, 0}}, +{(unsigned char*)"eopf", {240, 157, 149, 150, 0}}, +{(unsigned char*)"epar", {226, 139, 149, 0}}, +{(unsigned char*)"eparsl", {226, 167, 163, 0}}, +{(unsigned char*)"eplus", {226, 169, 177, 0}}, +{(unsigned char*)"epsi", {206, 181, 0}}, +{(unsigned char*)"epsilon", {206, 181, 0}}, +{(unsigned char*)"epsiv", {207, 181, 0}}, +{(unsigned char*)"eqcirc", {226, 137, 150, 0}}, +{(unsigned char*)"eqcolon", {226, 137, 149, 0}}, +{(unsigned char*)"eqsim", {226, 137, 130, 0}}, +{(unsigned char*)"eqslantgtr", {226, 170, 150, 0}}, +{(unsigned char*)"eqslantless", {226, 170, 149, 0}}, +{(unsigned char*)"equals", {61, 0}}, +{(unsigned char*)"equest", {226, 137, 159, 0}}, +{(unsigned char*)"equiv", {226, 137, 161, 0}}, +{(unsigned char*)"equivDD", {226, 169, 184, 0}}, +{(unsigned char*)"eqvparsl", {226, 167, 165, 0}}, +{(unsigned char*)"erDot", {226, 137, 147, 0}}, +{(unsigned char*)"erarr", {226, 165, 177, 0}}, +{(unsigned char*)"escr", {226, 132, 175, 0}}, +{(unsigned char*)"esdot", {226, 137, 144, 0}}, +{(unsigned char*)"esim", {226, 137, 130, 0}}, +{(unsigned char*)"eta", {206, 183, 0}}, +{(unsigned char*)"eth", {195, 176, 0}}, +{(unsigned char*)"euml", {195, 171, 0}}, +{(unsigned char*)"euro", {226, 130, 172, 0}}, +{(unsigned char*)"excl", {33, 0}}, +{(unsigned char*)"exist", {226, 136, 131, 0}}, +{(unsigned char*)"expectation", {226, 132, 176, 0}}, +{(unsigned char*)"exponentiale", {226, 133, 135, 0}}, +{(unsigned char*)"fallingdotseq", {226, 137, 146, 0}}, +{(unsigned char*)"fcy", {209, 132, 0}}, +{(unsigned char*)"female", {226, 153, 128, 0}}, +{(unsigned char*)"ffilig", {239, 172, 131, 0}}, +{(unsigned char*)"fflig", {239, 172, 128, 0}}, +{(unsigned char*)"ffllig", {239, 172, 132, 0}}, +{(unsigned char*)"ffr", {240, 157, 148, 163, 0}}, +{(unsigned char*)"filig", {239, 172, 129, 0}}, +{(unsigned char*)"fjlig", {102, 106, 0}}, +{(unsigned char*)"flat", {226, 153, 173, 0}}, +{(unsigned char*)"fllig", {239, 172, 130, 0}}, +{(unsigned char*)"fltns", {226, 150, 177, 0}}, +{(unsigned char*)"fnof", {198, 146, 0}}, +{(unsigned char*)"fopf", {240, 157, 149, 151, 0}}, +{(unsigned char*)"forall", {226, 136, 128, 0}}, +{(unsigned char*)"fork", {226, 139, 148, 0}}, +{(unsigned char*)"forkv", {226, 171, 153, 0}}, +{(unsigned char*)"fpartint", {226, 168, 141, 0}}, +{(unsigned char*)"frac12", {194, 189, 0}}, +{(unsigned char*)"frac13", {226, 133, 147, 0}}, +{(unsigned char*)"frac14", {194, 188, 0}}, +{(unsigned char*)"frac15", {226, 133, 149, 0}}, +{(unsigned char*)"frac16", {226, 133, 153, 0}}, +{(unsigned char*)"frac18", {226, 133, 155, 0}}, +{(unsigned char*)"frac23", {226, 133, 148, 0}}, +{(unsigned char*)"frac25", {226, 133, 150, 0}}, +{(unsigned char*)"frac34", {194, 190, 0}}, +{(unsigned char*)"frac35", {226, 133, 151, 0}}, +{(unsigned char*)"frac38", {226, 133, 156, 0}}, +{(unsigned char*)"frac45", {226, 133, 152, 0}}, +{(unsigned char*)"frac56", {226, 133, 154, 0}}, +{(unsigned char*)"frac58", {226, 133, 157, 0}}, +{(unsigned char*)"frac78", {226, 133, 158, 0}}, +{(unsigned char*)"frasl", {226, 129, 132, 0}}, +{(unsigned char*)"frown", {226, 140, 162, 0}}, +{(unsigned char*)"fscr", {240, 157, 146, 187, 0}}, +{(unsigned char*)"gE", {226, 137, 167, 0}}, +{(unsigned char*)"gEl", {226, 170, 140, 0}}, +{(unsigned char*)"gacute", {199, 181, 0}}, +{(unsigned char*)"gamma", {206, 179, 0}}, +{(unsigned char*)"gammad", {207, 157, 0}}, +{(unsigned char*)"gap", {226, 170, 134, 0}}, +{(unsigned char*)"gbreve", {196, 159, 0}}, +{(unsigned char*)"gcirc", {196, 157, 0}}, +{(unsigned char*)"gcy", {208, 179, 0}}, +{(unsigned char*)"gdot", {196, 161, 0}}, +{(unsigned char*)"ge", {226, 137, 165, 0}}, +{(unsigned char*)"gel", {226, 139, 155, 0}}, +{(unsigned char*)"geq", {226, 137, 165, 0}}, +{(unsigned char*)"geqq", {226, 137, 167, 0}}, +{(unsigned char*)"geqslant", {226, 169, 190, 0}}, +{(unsigned char*)"ges", {226, 169, 190, 0}}, +{(unsigned char*)"gescc", {226, 170, 169, 0}}, +{(unsigned char*)"gesdot", {226, 170, 128, 0}}, +{(unsigned char*)"gesdoto", {226, 170, 130, 0}}, +{(unsigned char*)"gesdotol", {226, 170, 132, 0}}, +{(unsigned char*)"gesl", {226, 139, 155, 239, 184, 128, 0}}, +{(unsigned char*)"gesles", {226, 170, 148, 0}}, +{(unsigned char*)"gfr", {240, 157, 148, 164, 0}}, +{(unsigned char*)"gg", {226, 137, 171, 0}}, +{(unsigned char*)"ggg", {226, 139, 153, 0}}, +{(unsigned char*)"gimel", {226, 132, 183, 0}}, +{(unsigned char*)"gjcy", {209, 147, 0}}, +{(unsigned char*)"gl", {226, 137, 183, 0}}, +{(unsigned char*)"glE", {226, 170, 146, 0}}, +{(unsigned char*)"gla", {226, 170, 165, 0}}, +{(unsigned char*)"glj", {226, 170, 164, 0}}, +{(unsigned char*)"gnE", {226, 137, 169, 0}}, +{(unsigned char*)"gnap", {226, 170, 138, 0}}, +{(unsigned char*)"gnapprox", {226, 170, 138, 0}}, +{(unsigned char*)"gne", {226, 170, 136, 0}}, +{(unsigned char*)"gneq", {226, 170, 136, 0}}, +{(unsigned char*)"gneqq", {226, 137, 169, 0}}, +{(unsigned char*)"gnsim", {226, 139, 167, 0}}, +{(unsigned char*)"gopf", {240, 157, 149, 152, 0}}, +{(unsigned char*)"grave", {96, 0}}, +{(unsigned char*)"gscr", {226, 132, 138, 0}}, +{(unsigned char*)"gsim", {226, 137, 179, 0}}, +{(unsigned char*)"gsime", {226, 170, 142, 0}}, +{(unsigned char*)"gsiml", {226, 170, 144, 0}}, +{(unsigned char*)"gt", {62, 0}}, +{(unsigned char*)"gtcc", {226, 170, 167, 0}}, +{(unsigned char*)"gtcir", {226, 169, 186, 0}}, +{(unsigned char*)"gtdot", {226, 139, 151, 0}}, +{(unsigned char*)"gtlPar", {226, 166, 149, 0}}, +{(unsigned char*)"gtquest", {226, 169, 188, 0}}, +{(unsigned char*)"gtrapprox", {226, 170, 134, 0}}, +{(unsigned char*)"gtrarr", {226, 165, 184, 0}}, +{(unsigned char*)"gtrdot", {226, 139, 151, 0}}, +{(unsigned char*)"gtreqless", {226, 139, 155, 0}}, +{(unsigned char*)"gtreqqless", {226, 170, 140, 0}}, +{(unsigned char*)"gtrless", {226, 137, 183, 0}}, +{(unsigned char*)"gtrsim", {226, 137, 179, 0}}, +{(unsigned char*)"gvertneqq", {226, 137, 169, 239, 184, 128, 0}}, +{(unsigned char*)"gvnE", {226, 137, 169, 239, 184, 128, 0}}, +{(unsigned char*)"hArr", {226, 135, 148, 0}}, +{(unsigned char*)"hairsp", {226, 128, 138, 0}}, +{(unsigned char*)"half", {194, 189, 0}}, +{(unsigned char*)"hamilt", {226, 132, 139, 0}}, +{(unsigned char*)"hardcy", {209, 138, 0}}, +{(unsigned char*)"harr", {226, 134, 148, 0}}, +{(unsigned char*)"harrcir", {226, 165, 136, 0}}, +{(unsigned char*)"harrw", {226, 134, 173, 0}}, +{(unsigned char*)"hbar", {226, 132, 143, 0}}, +{(unsigned char*)"hcirc", {196, 165, 0}}, +{(unsigned char*)"hearts", {226, 153, 165, 0}}, +{(unsigned char*)"heartsuit", {226, 153, 165, 0}}, +{(unsigned char*)"hellip", {226, 128, 166, 0}}, +{(unsigned char*)"hercon", {226, 138, 185, 0}}, +{(unsigned char*)"hfr", {240, 157, 148, 165, 0}}, +{(unsigned char*)"hksearow", {226, 164, 165, 0}}, +{(unsigned char*)"hkswarow", {226, 164, 166, 0}}, +{(unsigned char*)"hoarr", {226, 135, 191, 0}}, +{(unsigned char*)"homtht", {226, 136, 187, 0}}, +{(unsigned char*)"hookleftarrow", {226, 134, 169, 0}}, +{(unsigned char*)"hookrightarrow", {226, 134, 170, 0}}, +{(unsigned char*)"hopf", {240, 157, 149, 153, 0}}, +{(unsigned char*)"horbar", {226, 128, 149, 0}}, +{(unsigned char*)"hscr", {240, 157, 146, 189, 0}}, +{(unsigned char*)"hslash", {226, 132, 143, 0}}, +{(unsigned char*)"hstrok", {196, 167, 0}}, +{(unsigned char*)"hybull", {226, 129, 131, 0}}, +{(unsigned char*)"hyphen", {226, 128, 144, 0}}, +{(unsigned char*)"iacute", {195, 173, 0}}, +{(unsigned char*)"ic", {226, 129, 163, 0}}, +{(unsigned char*)"icirc", {195, 174, 0}}, +{(unsigned char*)"icy", {208, 184, 0}}, +{(unsigned char*)"iecy", {208, 181, 0}}, +{(unsigned char*)"iexcl", {194, 161, 0}}, +{(unsigned char*)"iff", {226, 135, 148, 0}}, +{(unsigned char*)"ifr", {240, 157, 148, 166, 0}}, +{(unsigned char*)"igrave", {195, 172, 0}}, +{(unsigned char*)"ii", {226, 133, 136, 0}}, +{(unsigned char*)"iiiint", {226, 168, 140, 0}}, +{(unsigned char*)"iiint", {226, 136, 173, 0}}, +{(unsigned char*)"iinfin", {226, 167, 156, 0}}, +{(unsigned char*)"iiota", {226, 132, 169, 0}}, +{(unsigned char*)"ijlig", {196, 179, 0}}, +{(unsigned char*)"imacr", {196, 171, 0}}, +{(unsigned char*)"image", {226, 132, 145, 0}}, +{(unsigned char*)"imagline", {226, 132, 144, 0}}, +{(unsigned char*)"imagpart", {226, 132, 145, 0}}, +{(unsigned char*)"imath", {196, 177, 0}}, +{(unsigned char*)"imof", {226, 138, 183, 0}}, +{(unsigned char*)"imped", {198, 181, 0}}, +{(unsigned char*)"in", {226, 136, 136, 0}}, +{(unsigned char*)"incare", {226, 132, 133, 0}}, +{(unsigned char*)"infin", {226, 136, 158, 0}}, +{(unsigned char*)"infintie", {226, 167, 157, 0}}, +{(unsigned char*)"inodot", {196, 177, 0}}, +{(unsigned char*)"int", {226, 136, 171, 0}}, +{(unsigned char*)"intcal", {226, 138, 186, 0}}, +{(unsigned char*)"integers", {226, 132, 164, 0}}, +{(unsigned char*)"intercal", {226, 138, 186, 0}}, +{(unsigned char*)"intlarhk", {226, 168, 151, 0}}, +{(unsigned char*)"intprod", {226, 168, 188, 0}}, +{(unsigned char*)"iocy", {209, 145, 0}}, +{(unsigned char*)"iogon", {196, 175, 0}}, +{(unsigned char*)"iopf", {240, 157, 149, 154, 0}}, +{(unsigned char*)"iota", {206, 185, 0}}, +{(unsigned char*)"iprod", {226, 168, 188, 0}}, +{(unsigned char*)"iquest", {194, 191, 0}}, +{(unsigned char*)"iscr", {240, 157, 146, 190, 0}}, +{(unsigned char*)"isin", {226, 136, 136, 0}}, +{(unsigned char*)"isinE", {226, 139, 185, 0}}, +{(unsigned char*)"isindot", {226, 139, 181, 0}}, +{(unsigned char*)"isins", {226, 139, 180, 0}}, +{(unsigned char*)"isinsv", {226, 139, 179, 0}}, +{(unsigned char*)"isinv", {226, 136, 136, 0}}, +{(unsigned char*)"it", {226, 129, 162, 0}}, +{(unsigned char*)"itilde", {196, 169, 0}}, +{(unsigned char*)"iukcy", {209, 150, 0}}, +{(unsigned char*)"iuml", {195, 175, 0}}, +{(unsigned char*)"jcirc", {196, 181, 0}}, +{(unsigned char*)"jcy", {208, 185, 0}}, +{(unsigned char*)"jfr", {240, 157, 148, 167, 0}}, +{(unsigned char*)"jmath", {200, 183, 0}}, +{(unsigned char*)"jopf", {240, 157, 149, 155, 0}}, +{(unsigned char*)"jscr", {240, 157, 146, 191, 0}}, +{(unsigned char*)"jsercy", {209, 152, 0}}, +{(unsigned char*)"jukcy", {209, 148, 0}}, +{(unsigned char*)"kappa", {206, 186, 0}}, +{(unsigned char*)"kappav", {207, 176, 0}}, +{(unsigned char*)"kcedil", {196, 183, 0}}, +{(unsigned char*)"kcy", {208, 186, 0}}, +{(unsigned char*)"kfr", {240, 157, 148, 168, 0}}, +{(unsigned char*)"kgreen", {196, 184, 0}}, +{(unsigned char*)"khcy", {209, 133, 0}}, +{(unsigned char*)"kjcy", {209, 156, 0}}, +{(unsigned char*)"kopf", {240, 157, 149, 156, 0}}, +{(unsigned char*)"kscr", {240, 157, 147, 128, 0}}, +{(unsigned char*)"lAarr", {226, 135, 154, 0}}, +{(unsigned char*)"lArr", {226, 135, 144, 0}}, +{(unsigned char*)"lAtail", {226, 164, 155, 0}}, +{(unsigned char*)"lBarr", {226, 164, 142, 0}}, +{(unsigned char*)"lE", {226, 137, 166, 0}}, +{(unsigned char*)"lEg", {226, 170, 139, 0}}, +{(unsigned char*)"lHar", {226, 165, 162, 0}}, +{(unsigned char*)"lacute", {196, 186, 0}}, +{(unsigned char*)"laemptyv", {226, 166, 180, 0}}, +{(unsigned char*)"lagran", {226, 132, 146, 0}}, +{(unsigned char*)"lambda", {206, 187, 0}}, +{(unsigned char*)"lang", {226, 159, 168, 0}}, +{(unsigned char*)"langd", {226, 166, 145, 0}}, +{(unsigned char*)"langle", {226, 159, 168, 0}}, +{(unsigned char*)"lap", {226, 170, 133, 0}}, +{(unsigned char*)"laquo", {194, 171, 0}}, +{(unsigned char*)"larr", {226, 134, 144, 0}}, +{(unsigned char*)"larrb", {226, 135, 164, 0}}, +{(unsigned char*)"larrbfs", {226, 164, 159, 0}}, +{(unsigned char*)"larrfs", {226, 164, 157, 0}}, +{(unsigned char*)"larrhk", {226, 134, 169, 0}}, +{(unsigned char*)"larrlp", {226, 134, 171, 0}}, +{(unsigned char*)"larrpl", {226, 164, 185, 0}}, +{(unsigned char*)"larrsim", {226, 165, 179, 0}}, +{(unsigned char*)"larrtl", {226, 134, 162, 0}}, +{(unsigned char*)"lat", {226, 170, 171, 0}}, +{(unsigned char*)"latail", {226, 164, 153, 0}}, +{(unsigned char*)"late", {226, 170, 173, 0}}, +{(unsigned char*)"lates", {226, 170, 173, 239, 184, 128, 0}}, +{(unsigned char*)"lbarr", {226, 164, 140, 0}}, +{(unsigned char*)"lbbrk", {226, 157, 178, 0}}, +{(unsigned char*)"lbrace", {123, 0}}, +{(unsigned char*)"lbrack", {91, 0}}, +{(unsigned char*)"lbrke", {226, 166, 139, 0}}, +{(unsigned char*)"lbrksld", {226, 166, 143, 0}}, +{(unsigned char*)"lbrkslu", {226, 166, 141, 0}}, +{(unsigned char*)"lcaron", {196, 190, 0}}, +{(unsigned char*)"lcedil", {196, 188, 0}}, +{(unsigned char*)"lceil", {226, 140, 136, 0}}, +{(unsigned char*)"lcub", {123, 0}}, +{(unsigned char*)"lcy", {208, 187, 0}}, +{(unsigned char*)"ldca", {226, 164, 182, 0}}, +{(unsigned char*)"ldquo", {226, 128, 156, 0}}, +{(unsigned char*)"ldquor", {226, 128, 158, 0}}, +{(unsigned char*)"ldrdhar", {226, 165, 167, 0}}, +{(unsigned char*)"ldrushar", {226, 165, 139, 0}}, +{(unsigned char*)"ldsh", {226, 134, 178, 0}}, +{(unsigned char*)"le", {226, 137, 164, 0}}, +{(unsigned char*)"leftarrow", {226, 134, 144, 0}}, +{(unsigned char*)"leftarrowtail", {226, 134, 162, 0}}, +{(unsigned char*)"leftharpoondown", {226, 134, 189, 0}}, +{(unsigned char*)"leftharpoonup", {226, 134, 188, 0}}, +{(unsigned char*)"leftleftarrows", {226, 135, 135, 0}}, +{(unsigned char*)"leftrightarrow", {226, 134, 148, 0}}, +{(unsigned char*)"leftrightarrows", {226, 135, 134, 0}}, +{(unsigned char*)"leftrightharpoons", {226, 135, 139, 0}}, +{(unsigned char*)"leftrightsquigarrow", {226, 134, 173, 0}}, +{(unsigned char*)"leftthreetimes", {226, 139, 139, 0}}, +{(unsigned char*)"leg", {226, 139, 154, 0}}, +{(unsigned char*)"leq", {226, 137, 164, 0}}, +{(unsigned char*)"leqq", {226, 137, 166, 0}}, +{(unsigned char*)"leqslant", {226, 169, 189, 0}}, +{(unsigned char*)"les", {226, 169, 189, 0}}, +{(unsigned char*)"lescc", {226, 170, 168, 0}}, +{(unsigned char*)"lesdot", {226, 169, 191, 0}}, +{(unsigned char*)"lesdoto", {226, 170, 129, 0}}, +{(unsigned char*)"lesdotor", {226, 170, 131, 0}}, +{(unsigned char*)"lesg", {226, 139, 154, 239, 184, 128, 0}}, +{(unsigned char*)"lesges", {226, 170, 147, 0}}, +{(unsigned char*)"lessapprox", {226, 170, 133, 0}}, +{(unsigned char*)"lessdot", {226, 139, 150, 0}}, +{(unsigned char*)"lesseqgtr", {226, 139, 154, 0}}, +{(unsigned char*)"lesseqqgtr", {226, 170, 139, 0}}, +{(unsigned char*)"lessgtr", {226, 137, 182, 0}}, +{(unsigned char*)"lesssim", {226, 137, 178, 0}}, +{(unsigned char*)"lfisht", {226, 165, 188, 0}}, +{(unsigned char*)"lfloor", {226, 140, 138, 0}}, +{(unsigned char*)"lfr", {240, 157, 148, 169, 0}}, +{(unsigned char*)"lg", {226, 137, 182, 0}}, +{(unsigned char*)"lgE", {226, 170, 145, 0}}, +{(unsigned char*)"lhard", {226, 134, 189, 0}}, +{(unsigned char*)"lharu", {226, 134, 188, 0}}, +{(unsigned char*)"lharul", {226, 165, 170, 0}}, +{(unsigned char*)"lhblk", {226, 150, 132, 0}}, +{(unsigned char*)"ljcy", {209, 153, 0}}, +{(unsigned char*)"ll", {226, 137, 170, 0}}, +{(unsigned char*)"llarr", {226, 135, 135, 0}}, +{(unsigned char*)"llcorner", {226, 140, 158, 0}}, +{(unsigned char*)"llhard", {226, 165, 171, 0}}, +{(unsigned char*)"lltri", {226, 151, 186, 0}}, +{(unsigned char*)"lmidot", {197, 128, 0}}, +{(unsigned char*)"lmoust", {226, 142, 176, 0}}, +{(unsigned char*)"lmoustache", {226, 142, 176, 0}}, +{(unsigned char*)"lnE", {226, 137, 168, 0}}, +{(unsigned char*)"lnap", {226, 170, 137, 0}}, +{(unsigned char*)"lnapprox", {226, 170, 137, 0}}, +{(unsigned char*)"lne", {226, 170, 135, 0}}, +{(unsigned char*)"lneq", {226, 170, 135, 0}}, +{(unsigned char*)"lneqq", {226, 137, 168, 0}}, +{(unsigned char*)"lnsim", {226, 139, 166, 0}}, +{(unsigned char*)"loang", {226, 159, 172, 0}}, +{(unsigned char*)"loarr", {226, 135, 189, 0}}, +{(unsigned char*)"lobrk", {226, 159, 166, 0}}, +{(unsigned char*)"longleftarrow", {226, 159, 181, 0}}, +{(unsigned char*)"longleftrightarrow", {226, 159, 183, 0}}, +{(unsigned char*)"longmapsto", {226, 159, 188, 0}}, +{(unsigned char*)"longrightarrow", {226, 159, 182, 0}}, +{(unsigned char*)"looparrowleft", {226, 134, 171, 0}}, +{(unsigned char*)"looparrowright", {226, 134, 172, 0}}, +{(unsigned char*)"lopar", {226, 166, 133, 0}}, +{(unsigned char*)"lopf", {240, 157, 149, 157, 0}}, +{(unsigned char*)"loplus", {226, 168, 173, 0}}, +{(unsigned char*)"lotimes", {226, 168, 180, 0}}, +{(unsigned char*)"lowast", {226, 136, 151, 0}}, +{(unsigned char*)"lowbar", {95, 0}}, +{(unsigned char*)"loz", {226, 151, 138, 0}}, +{(unsigned char*)"lozenge", {226, 151, 138, 0}}, +{(unsigned char*)"lozf", {226, 167, 171, 0}}, +{(unsigned char*)"lpar", {40, 0}}, +{(unsigned char*)"lparlt", {226, 166, 147, 0}}, +{(unsigned char*)"lrarr", {226, 135, 134, 0}}, +{(unsigned char*)"lrcorner", {226, 140, 159, 0}}, +{(unsigned char*)"lrhar", {226, 135, 139, 0}}, +{(unsigned char*)"lrhard", {226, 165, 173, 0}}, +{(unsigned char*)"lrm", {226, 128, 142, 0}}, +{(unsigned char*)"lrtri", {226, 138, 191, 0}}, +{(unsigned char*)"lsaquo", {226, 128, 185, 0}}, +{(unsigned char*)"lscr", {240, 157, 147, 129, 0}}, +{(unsigned char*)"lsh", {226, 134, 176, 0}}, +{(unsigned char*)"lsim", {226, 137, 178, 0}}, +{(unsigned char*)"lsime", {226, 170, 141, 0}}, +{(unsigned char*)"lsimg", {226, 170, 143, 0}}, +{(unsigned char*)"lsqb", {91, 0}}, +{(unsigned char*)"lsquo", {226, 128, 152, 0}}, +{(unsigned char*)"lsquor", {226, 128, 154, 0}}, +{(unsigned char*)"lstrok", {197, 130, 0}}, +{(unsigned char*)"lt", {60, 0}}, +{(unsigned char*)"ltcc", {226, 170, 166, 0}}, +{(unsigned char*)"ltcir", {226, 169, 185, 0}}, +{(unsigned char*)"ltdot", {226, 139, 150, 0}}, +{(unsigned char*)"lthree", {226, 139, 139, 0}}, +{(unsigned char*)"ltimes", {226, 139, 137, 0}}, +{(unsigned char*)"ltlarr", {226, 165, 182, 0}}, +{(unsigned char*)"ltquest", {226, 169, 187, 0}}, +{(unsigned char*)"ltrPar", {226, 166, 150, 0}}, +{(unsigned char*)"ltri", {226, 151, 131, 0}}, +{(unsigned char*)"ltrie", {226, 138, 180, 0}}, +{(unsigned char*)"ltrif", {226, 151, 130, 0}}, +{(unsigned char*)"lurdshar", {226, 165, 138, 0}}, +{(unsigned char*)"luruhar", {226, 165, 166, 0}}, +{(unsigned char*)"lvertneqq", {226, 137, 168, 239, 184, 128, 0}}, +{(unsigned char*)"lvnE", {226, 137, 168, 239, 184, 128, 0}}, +{(unsigned char*)"mDDot", {226, 136, 186, 0}}, +{(unsigned char*)"macr", {194, 175, 0}}, +{(unsigned char*)"male", {226, 153, 130, 0}}, +{(unsigned char*)"malt", {226, 156, 160, 0}}, +{(unsigned char*)"maltese", {226, 156, 160, 0}}, +{(unsigned char*)"map", {226, 134, 166, 0}}, +{(unsigned char*)"mapsto", {226, 134, 166, 0}}, +{(unsigned char*)"mapstodown", {226, 134, 167, 0}}, +{(unsigned char*)"mapstoleft", {226, 134, 164, 0}}, +{(unsigned char*)"mapstoup", {226, 134, 165, 0}}, +{(unsigned char*)"marker", {226, 150, 174, 0}}, +{(unsigned char*)"mcomma", {226, 168, 169, 0}}, +{(unsigned char*)"mcy", {208, 188, 0}}, +{(unsigned char*)"mdash", {226, 128, 148, 0}}, +{(unsigned char*)"measuredangle", {226, 136, 161, 0}}, +{(unsigned char*)"mfr", {240, 157, 148, 170, 0}}, +{(unsigned char*)"mho", {226, 132, 167, 0}}, +{(unsigned char*)"micro", {194, 181, 0}}, +{(unsigned char*)"mid", {226, 136, 163, 0}}, +{(unsigned char*)"midast", {42, 0}}, +{(unsigned char*)"midcir", {226, 171, 176, 0}}, +{(unsigned char*)"middot", {194, 183, 0}}, +{(unsigned char*)"minus", {226, 136, 146, 0}}, +{(unsigned char*)"minusb", {226, 138, 159, 0}}, +{(unsigned char*)"minusd", {226, 136, 184, 0}}, +{(unsigned char*)"minusdu", {226, 168, 170, 0}}, +{(unsigned char*)"mlcp", {226, 171, 155, 0}}, +{(unsigned char*)"mldr", {226, 128, 166, 0}}, +{(unsigned char*)"mnplus", {226, 136, 147, 0}}, +{(unsigned char*)"models", {226, 138, 167, 0}}, +{(unsigned char*)"mopf", {240, 157, 149, 158, 0}}, +{(unsigned char*)"mp", {226, 136, 147, 0}}, +{(unsigned char*)"mscr", {240, 157, 147, 130, 0}}, +{(unsigned char*)"mstpos", {226, 136, 190, 0}}, +{(unsigned char*)"mu", {206, 188, 0}}, +{(unsigned char*)"multimap", {226, 138, 184, 0}}, +{(unsigned char*)"mumap", {226, 138, 184, 0}}, +{(unsigned char*)"nGg", {226, 139, 153, 204, 184, 0}}, +{(unsigned char*)"nGt", {226, 137, 171, 226, 131, 146, 0}}, +{(unsigned char*)"nGtv", {226, 137, 171, 204, 184, 0}}, +{(unsigned char*)"nLeftarrow", {226, 135, 141, 0}}, +{(unsigned char*)"nLeftrightarrow", {226, 135, 142, 0}}, +{(unsigned char*)"nLl", {226, 139, 152, 204, 184, 0}}, +{(unsigned char*)"nLt", {226, 137, 170, 226, 131, 146, 0}}, +{(unsigned char*)"nLtv", {226, 137, 170, 204, 184, 0}}, +{(unsigned char*)"nRightarrow", {226, 135, 143, 0}}, +{(unsigned char*)"nVDash", {226, 138, 175, 0}}, +{(unsigned char*)"nVdash", {226, 138, 174, 0}}, +{(unsigned char*)"nabla", {226, 136, 135, 0}}, +{(unsigned char*)"nacute", {197, 132, 0}}, +{(unsigned char*)"nang", {226, 136, 160, 226, 131, 146, 0}}, +{(unsigned char*)"nap", {226, 137, 137, 0}}, +{(unsigned char*)"napE", {226, 169, 176, 204, 184, 0}}, +{(unsigned char*)"napid", {226, 137, 139, 204, 184, 0}}, +{(unsigned char*)"napos", {197, 137, 0}}, +{(unsigned char*)"napprox", {226, 137, 137, 0}}, +{(unsigned char*)"natur", {226, 153, 174, 0}}, +{(unsigned char*)"natural", {226, 153, 174, 0}}, +{(unsigned char*)"naturals", {226, 132, 149, 0}}, +{(unsigned char*)"nbsp", {194, 160, 0}}, +{(unsigned char*)"nbump", {226, 137, 142, 204, 184, 0}}, +{(unsigned char*)"nbumpe", {226, 137, 143, 204, 184, 0}}, +{(unsigned char*)"ncap", {226, 169, 131, 0}}, +{(unsigned char*)"ncaron", {197, 136, 0}}, +{(unsigned char*)"ncedil", {197, 134, 0}}, +{(unsigned char*)"ncong", {226, 137, 135, 0}}, +{(unsigned char*)"ncongdot", {226, 169, 173, 204, 184, 0}}, +{(unsigned char*)"ncup", {226, 169, 130, 0}}, +{(unsigned char*)"ncy", {208, 189, 0}}, +{(unsigned char*)"ndash", {226, 128, 147, 0}}, +{(unsigned char*)"ne", {226, 137, 160, 0}}, +{(unsigned char*)"neArr", {226, 135, 151, 0}}, +{(unsigned char*)"nearhk", {226, 164, 164, 0}}, +{(unsigned char*)"nearr", {226, 134, 151, 0}}, +{(unsigned char*)"nearrow", {226, 134, 151, 0}}, +{(unsigned char*)"nedot", {226, 137, 144, 204, 184, 0}}, +{(unsigned char*)"nequiv", {226, 137, 162, 0}}, +{(unsigned char*)"nesear", {226, 164, 168, 0}}, +{(unsigned char*)"nesim", {226, 137, 130, 204, 184, 0}}, +{(unsigned char*)"nexist", {226, 136, 132, 0}}, +{(unsigned char*)"nexists", {226, 136, 132, 0}}, +{(unsigned char*)"nfr", {240, 157, 148, 171, 0}}, +{(unsigned char*)"ngE", {226, 137, 167, 204, 184, 0}}, +{(unsigned char*)"nge", {226, 137, 177, 0}}, +{(unsigned char*)"ngeq", {226, 137, 177, 0}}, +{(unsigned char*)"ngeqq", {226, 137, 167, 204, 184, 0}}, +{(unsigned char*)"ngeqslant", {226, 169, 190, 204, 184, 0}}, +{(unsigned char*)"nges", {226, 169, 190, 204, 184, 0}}, +{(unsigned char*)"ngsim", {226, 137, 181, 0}}, +{(unsigned char*)"ngt", {226, 137, 175, 0}}, +{(unsigned char*)"ngtr", {226, 137, 175, 0}}, +{(unsigned char*)"nhArr", {226, 135, 142, 0}}, +{(unsigned char*)"nharr", {226, 134, 174, 0}}, +{(unsigned char*)"nhpar", {226, 171, 178, 0}}, +{(unsigned char*)"ni", {226, 136, 139, 0}}, +{(unsigned char*)"nis", {226, 139, 188, 0}}, +{(unsigned char*)"nisd", {226, 139, 186, 0}}, +{(unsigned char*)"niv", {226, 136, 139, 0}}, +{(unsigned char*)"njcy", {209, 154, 0}}, +{(unsigned char*)"nlArr", {226, 135, 141, 0}}, +{(unsigned char*)"nlE", {226, 137, 166, 204, 184, 0}}, +{(unsigned char*)"nlarr", {226, 134, 154, 0}}, +{(unsigned char*)"nldr", {226, 128, 165, 0}}, +{(unsigned char*)"nle", {226, 137, 176, 0}}, +{(unsigned char*)"nleftarrow", {226, 134, 154, 0}}, +{(unsigned char*)"nleftrightarrow", {226, 134, 174, 0}}, +{(unsigned char*)"nleq", {226, 137, 176, 0}}, +{(unsigned char*)"nleqq", {226, 137, 166, 204, 184, 0}}, +{(unsigned char*)"nleqslant", {226, 169, 189, 204, 184, 0}}, +{(unsigned char*)"nles", {226, 169, 189, 204, 184, 0}}, +{(unsigned char*)"nless", {226, 137, 174, 0}}, +{(unsigned char*)"nlsim", {226, 137, 180, 0}}, +{(unsigned char*)"nlt", {226, 137, 174, 0}}, +{(unsigned char*)"nltri", {226, 139, 170, 0}}, +{(unsigned char*)"nltrie", {226, 139, 172, 0}}, +{(unsigned char*)"nmid", {226, 136, 164, 0}}, +{(unsigned char*)"nopf", {240, 157, 149, 159, 0}}, +{(unsigned char*)"not", {194, 172, 0}}, +{(unsigned char*)"notin", {226, 136, 137, 0}}, +{(unsigned char*)"notinE", {226, 139, 185, 204, 184, 0}}, +{(unsigned char*)"notindot", {226, 139, 181, 204, 184, 0}}, +{(unsigned char*)"notinva", {226, 136, 137, 0}}, +{(unsigned char*)"notinvb", {226, 139, 183, 0}}, +{(unsigned char*)"notinvc", {226, 139, 182, 0}}, +{(unsigned char*)"notni", {226, 136, 140, 0}}, +{(unsigned char*)"notniva", {226, 136, 140, 0}}, +{(unsigned char*)"notnivb", {226, 139, 190, 0}}, +{(unsigned char*)"notnivc", {226, 139, 189, 0}}, +{(unsigned char*)"npar", {226, 136, 166, 0}}, +{(unsigned char*)"nparallel", {226, 136, 166, 0}}, +{(unsigned char*)"nparsl", {226, 171, 189, 226, 131, 165, 0}}, +{(unsigned char*)"npart", {226, 136, 130, 204, 184, 0}}, +{(unsigned char*)"npolint", {226, 168, 148, 0}}, +{(unsigned char*)"npr", {226, 138, 128, 0}}, +{(unsigned char*)"nprcue", {226, 139, 160, 0}}, +{(unsigned char*)"npre", {226, 170, 175, 204, 184, 0}}, +{(unsigned char*)"nprec", {226, 138, 128, 0}}, +{(unsigned char*)"npreceq", {226, 170, 175, 204, 184, 0}}, +{(unsigned char*)"nrArr", {226, 135, 143, 0}}, +{(unsigned char*)"nrarr", {226, 134, 155, 0}}, +{(unsigned char*)"nrarrc", {226, 164, 179, 204, 184, 0}}, +{(unsigned char*)"nrarrw", {226, 134, 157, 204, 184, 0}}, +{(unsigned char*)"nrightarrow", {226, 134, 155, 0}}, +{(unsigned char*)"nrtri", {226, 139, 171, 0}}, +{(unsigned char*)"nrtrie", {226, 139, 173, 0}}, +{(unsigned char*)"nsc", {226, 138, 129, 0}}, +{(unsigned char*)"nsccue", {226, 139, 161, 0}}, +{(unsigned char*)"nsce", {226, 170, 176, 204, 184, 0}}, +{(unsigned char*)"nscr", {240, 157, 147, 131, 0}}, +{(unsigned char*)"nshortmid", {226, 136, 164, 0}}, +{(unsigned char*)"nshortparallel", {226, 136, 166, 0}}, +{(unsigned char*)"nsim", {226, 137, 129, 0}}, +{(unsigned char*)"nsime", {226, 137, 132, 0}}, +{(unsigned char*)"nsimeq", {226, 137, 132, 0}}, +{(unsigned char*)"nsmid", {226, 136, 164, 0}}, +{(unsigned char*)"nspar", {226, 136, 166, 0}}, +{(unsigned char*)"nsqsube", {226, 139, 162, 0}}, +{(unsigned char*)"nsqsupe", {226, 139, 163, 0}}, +{(unsigned char*)"nsub", {226, 138, 132, 0}}, +{(unsigned char*)"nsubE", {226, 171, 133, 204, 184, 0}}, +{(unsigned char*)"nsube", {226, 138, 136, 0}}, +{(unsigned char*)"nsubset", {226, 138, 130, 226, 131, 146, 0}}, +{(unsigned char*)"nsubseteq", {226, 138, 136, 0}}, +{(unsigned char*)"nsubseteqq", {226, 171, 133, 204, 184, 0}}, +{(unsigned char*)"nsucc", {226, 138, 129, 0}}, +{(unsigned char*)"nsucceq", {226, 170, 176, 204, 184, 0}}, +{(unsigned char*)"nsup", {226, 138, 133, 0}}, +{(unsigned char*)"nsupE", {226, 171, 134, 204, 184, 0}}, +{(unsigned char*)"nsupe", {226, 138, 137, 0}}, +{(unsigned char*)"nsupset", {226, 138, 131, 226, 131, 146, 0}}, +{(unsigned char*)"nsupseteq", {226, 138, 137, 0}}, +{(unsigned char*)"nsupseteqq", {226, 171, 134, 204, 184, 0}}, +{(unsigned char*)"ntgl", {226, 137, 185, 0}}, +{(unsigned char*)"ntilde", {195, 177, 0}}, +{(unsigned char*)"ntlg", {226, 137, 184, 0}}, +{(unsigned char*)"ntriangleleft", {226, 139, 170, 0}}, +{(unsigned char*)"ntrianglelefteq", {226, 139, 172, 0}}, +{(unsigned char*)"ntriangleright", {226, 139, 171, 0}}, +{(unsigned char*)"ntrianglerighteq", {226, 139, 173, 0}}, +{(unsigned char*)"nu", {206, 189, 0}}, +{(unsigned char*)"num", {35, 0}}, +{(unsigned char*)"numero", {226, 132, 150, 0}}, +{(unsigned char*)"numsp", {226, 128, 135, 0}}, +{(unsigned char*)"nvDash", {226, 138, 173, 0}}, +{(unsigned char*)"nvHarr", {226, 164, 132, 0}}, +{(unsigned char*)"nvap", {226, 137, 141, 226, 131, 146, 0}}, +{(unsigned char*)"nvdash", {226, 138, 172, 0}}, +{(unsigned char*)"nvge", {226, 137, 165, 226, 131, 146, 0}}, +{(unsigned char*)"nvgt", {62, 226, 131, 146, 0}}, +{(unsigned char*)"nvinfin", {226, 167, 158, 0}}, +{(unsigned char*)"nvlArr", {226, 164, 130, 0}}, +{(unsigned char*)"nvle", {226, 137, 164, 226, 131, 146, 0}}, +{(unsigned char*)"nvlt", {60, 226, 131, 146, 0}}, +{(unsigned char*)"nvltrie", {226, 138, 180, 226, 131, 146, 0}}, +{(unsigned char*)"nvrArr", {226, 164, 131, 0}}, +{(unsigned char*)"nvrtrie", {226, 138, 181, 226, 131, 146, 0}}, +{(unsigned char*)"nvsim", {226, 136, 188, 226, 131, 146, 0}}, +{(unsigned char*)"nwArr", {226, 135, 150, 0}}, +{(unsigned char*)"nwarhk", {226, 164, 163, 0}}, +{(unsigned char*)"nwarr", {226, 134, 150, 0}}, +{(unsigned char*)"nwarrow", {226, 134, 150, 0}}, +{(unsigned char*)"nwnear", {226, 164, 167, 0}}, +{(unsigned char*)"oS", {226, 147, 136, 0}}, +{(unsigned char*)"oacute", {195, 179, 0}}, +{(unsigned char*)"oast", {226, 138, 155, 0}}, +{(unsigned char*)"ocir", {226, 138, 154, 0}}, +{(unsigned char*)"ocirc", {195, 180, 0}}, +{(unsigned char*)"ocy", {208, 190, 0}}, +{(unsigned char*)"odash", {226, 138, 157, 0}}, +{(unsigned char*)"odblac", {197, 145, 0}}, +{(unsigned char*)"odiv", {226, 168, 184, 0}}, +{(unsigned char*)"odot", {226, 138, 153, 0}}, +{(unsigned char*)"odsold", {226, 166, 188, 0}}, +{(unsigned char*)"oelig", {197, 147, 0}}, +{(unsigned char*)"ofcir", {226, 166, 191, 0}}, +{(unsigned char*)"ofr", {240, 157, 148, 172, 0}}, +{(unsigned char*)"ogon", {203, 155, 0}}, +{(unsigned char*)"ograve", {195, 178, 0}}, +{(unsigned char*)"ogt", {226, 167, 129, 0}}, +{(unsigned char*)"ohbar", {226, 166, 181, 0}}, +{(unsigned char*)"ohm", {206, 169, 0}}, +{(unsigned char*)"oint", {226, 136, 174, 0}}, +{(unsigned char*)"olarr", {226, 134, 186, 0}}, +{(unsigned char*)"olcir", {226, 166, 190, 0}}, +{(unsigned char*)"olcross", {226, 166, 187, 0}}, +{(unsigned char*)"oline", {226, 128, 190, 0}}, +{(unsigned char*)"olt", {226, 167, 128, 0}}, +{(unsigned char*)"omacr", {197, 141, 0}}, +{(unsigned char*)"omega", {207, 137, 0}}, +{(unsigned char*)"omicron", {206, 191, 0}}, +{(unsigned char*)"omid", {226, 166, 182, 0}}, +{(unsigned char*)"ominus", {226, 138, 150, 0}}, +{(unsigned char*)"oopf", {240, 157, 149, 160, 0}}, +{(unsigned char*)"opar", {226, 166, 183, 0}}, +{(unsigned char*)"operp", {226, 166, 185, 0}}, +{(unsigned char*)"oplus", {226, 138, 149, 0}}, +{(unsigned char*)"or", {226, 136, 168, 0}}, +{(unsigned char*)"orarr", {226, 134, 187, 0}}, +{(unsigned char*)"ord", {226, 169, 157, 0}}, +{(unsigned char*)"order", {226, 132, 180, 0}}, +{(unsigned char*)"orderof", {226, 132, 180, 0}}, +{(unsigned char*)"ordf", {194, 170, 0}}, +{(unsigned char*)"ordm", {194, 186, 0}}, +{(unsigned char*)"origof", {226, 138, 182, 0}}, +{(unsigned char*)"oror", {226, 169, 150, 0}}, +{(unsigned char*)"orslope", {226, 169, 151, 0}}, +{(unsigned char*)"orv", {226, 169, 155, 0}}, +{(unsigned char*)"oscr", {226, 132, 180, 0}}, +{(unsigned char*)"oslash", {195, 184, 0}}, +{(unsigned char*)"osol", {226, 138, 152, 0}}, +{(unsigned char*)"otilde", {195, 181, 0}}, +{(unsigned char*)"otimes", {226, 138, 151, 0}}, +{(unsigned char*)"otimesas", {226, 168, 182, 0}}, +{(unsigned char*)"ouml", {195, 182, 0}}, +{(unsigned char*)"ovbar", {226, 140, 189, 0}}, +{(unsigned char*)"par", {226, 136, 165, 0}}, +{(unsigned char*)"para", {194, 182, 0}}, +{(unsigned char*)"parallel", {226, 136, 165, 0}}, +{(unsigned char*)"parsim", {226, 171, 179, 0}}, +{(unsigned char*)"parsl", {226, 171, 189, 0}}, +{(unsigned char*)"part", {226, 136, 130, 0}}, +{(unsigned char*)"pcy", {208, 191, 0}}, +{(unsigned char*)"percnt", {37, 0}}, +{(unsigned char*)"period", {46, 0}}, +{(unsigned char*)"permil", {226, 128, 176, 0}}, +{(unsigned char*)"perp", {226, 138, 165, 0}}, +{(unsigned char*)"pertenk", {226, 128, 177, 0}}, +{(unsigned char*)"pfr", {240, 157, 148, 173, 0}}, +{(unsigned char*)"phi", {207, 134, 0}}, +{(unsigned char*)"phiv", {207, 149, 0}}, +{(unsigned char*)"phmmat", {226, 132, 179, 0}}, +{(unsigned char*)"phone", {226, 152, 142, 0}}, +{(unsigned char*)"pi", {207, 128, 0}}, +{(unsigned char*)"pitchfork", {226, 139, 148, 0}}, +{(unsigned char*)"piv", {207, 150, 0}}, +{(unsigned char*)"planck", {226, 132, 143, 0}}, +{(unsigned char*)"planckh", {226, 132, 142, 0}}, +{(unsigned char*)"plankv", {226, 132, 143, 0}}, +{(unsigned char*)"plus", {43, 0}}, +{(unsigned char*)"plusacir", {226, 168, 163, 0}}, +{(unsigned char*)"plusb", {226, 138, 158, 0}}, +{(unsigned char*)"pluscir", {226, 168, 162, 0}}, +{(unsigned char*)"plusdo", {226, 136, 148, 0}}, +{(unsigned char*)"plusdu", {226, 168, 165, 0}}, +{(unsigned char*)"pluse", {226, 169, 178, 0}}, +{(unsigned char*)"plusmn", {194, 177, 0}}, +{(unsigned char*)"plussim", {226, 168, 166, 0}}, +{(unsigned char*)"plustwo", {226, 168, 167, 0}}, +{(unsigned char*)"pm", {194, 177, 0}}, +{(unsigned char*)"pointint", {226, 168, 149, 0}}, +{(unsigned char*)"popf", {240, 157, 149, 161, 0}}, +{(unsigned char*)"pound", {194, 163, 0}}, +{(unsigned char*)"pr", {226, 137, 186, 0}}, +{(unsigned char*)"prE", {226, 170, 179, 0}}, +{(unsigned char*)"prap", {226, 170, 183, 0}}, +{(unsigned char*)"prcue", {226, 137, 188, 0}}, +{(unsigned char*)"pre", {226, 170, 175, 0}}, +{(unsigned char*)"prec", {226, 137, 186, 0}}, +{(unsigned char*)"precapprox", {226, 170, 183, 0}}, +{(unsigned char*)"preccurlyeq", {226, 137, 188, 0}}, +{(unsigned char*)"preceq", {226, 170, 175, 0}}, +{(unsigned char*)"precnapprox", {226, 170, 185, 0}}, +{(unsigned char*)"precneqq", {226, 170, 181, 0}}, +{(unsigned char*)"precnsim", {226, 139, 168, 0}}, +{(unsigned char*)"precsim", {226, 137, 190, 0}}, +{(unsigned char*)"prime", {226, 128, 178, 0}}, +{(unsigned char*)"primes", {226, 132, 153, 0}}, +{(unsigned char*)"prnE", {226, 170, 181, 0}}, +{(unsigned char*)"prnap", {226, 170, 185, 0}}, +{(unsigned char*)"prnsim", {226, 139, 168, 0}}, +{(unsigned char*)"prod", {226, 136, 143, 0}}, +{(unsigned char*)"profalar", {226, 140, 174, 0}}, +{(unsigned char*)"profline", {226, 140, 146, 0}}, +{(unsigned char*)"profsurf", {226, 140, 147, 0}}, +{(unsigned char*)"prop", {226, 136, 157, 0}}, +{(unsigned char*)"propto", {226, 136, 157, 0}}, +{(unsigned char*)"prsim", {226, 137, 190, 0}}, +{(unsigned char*)"prurel", {226, 138, 176, 0}}, +{(unsigned char*)"pscr", {240, 157, 147, 133, 0}}, +{(unsigned char*)"psi", {207, 136, 0}}, +{(unsigned char*)"puncsp", {226, 128, 136, 0}}, +{(unsigned char*)"qfr", {240, 157, 148, 174, 0}}, +{(unsigned char*)"qint", {226, 168, 140, 0}}, +{(unsigned char*)"qopf", {240, 157, 149, 162, 0}}, +{(unsigned char*)"qprime", {226, 129, 151, 0}}, +{(unsigned char*)"qscr", {240, 157, 147, 134, 0}}, +{(unsigned char*)"quaternions", {226, 132, 141, 0}}, +{(unsigned char*)"quatint", {226, 168, 150, 0}}, +{(unsigned char*)"quest", {63, 0}}, +{(unsigned char*)"questeq", {226, 137, 159, 0}}, +{(unsigned char*)"quot", {34, 0}}, +{(unsigned char*)"rAarr", {226, 135, 155, 0}}, +{(unsigned char*)"rArr", {226, 135, 146, 0}}, +{(unsigned char*)"rAtail", {226, 164, 156, 0}}, +{(unsigned char*)"rBarr", {226, 164, 143, 0}}, +{(unsigned char*)"rHar", {226, 165, 164, 0}}, +{(unsigned char*)"race", {226, 136, 189, 204, 177, 0}}, +{(unsigned char*)"racute", {197, 149, 0}}, +{(unsigned char*)"radic", {226, 136, 154, 0}}, +{(unsigned char*)"raemptyv", {226, 166, 179, 0}}, +{(unsigned char*)"rang", {226, 159, 169, 0}}, +{(unsigned char*)"rangd", {226, 166, 146, 0}}, +{(unsigned char*)"range", {226, 166, 165, 0}}, +{(unsigned char*)"rangle", {226, 159, 169, 0}}, +{(unsigned char*)"raquo", {194, 187, 0}}, +{(unsigned char*)"rarr", {226, 134, 146, 0}}, +{(unsigned char*)"rarrap", {226, 165, 181, 0}}, +{(unsigned char*)"rarrb", {226, 135, 165, 0}}, +{(unsigned char*)"rarrbfs", {226, 164, 160, 0}}, +{(unsigned char*)"rarrc", {226, 164, 179, 0}}, +{(unsigned char*)"rarrfs", {226, 164, 158, 0}}, +{(unsigned char*)"rarrhk", {226, 134, 170, 0}}, +{(unsigned char*)"rarrlp", {226, 134, 172, 0}}, +{(unsigned char*)"rarrpl", {226, 165, 133, 0}}, +{(unsigned char*)"rarrsim", {226, 165, 180, 0}}, +{(unsigned char*)"rarrtl", {226, 134, 163, 0}}, +{(unsigned char*)"rarrw", {226, 134, 157, 0}}, +{(unsigned char*)"ratail", {226, 164, 154, 0}}, +{(unsigned char*)"ratio", {226, 136, 182, 0}}, +{(unsigned char*)"rationals", {226, 132, 154, 0}}, +{(unsigned char*)"rbarr", {226, 164, 141, 0}}, +{(unsigned char*)"rbbrk", {226, 157, 179, 0}}, +{(unsigned char*)"rbrace", {125, 0}}, +{(unsigned char*)"rbrack", {93, 0}}, +{(unsigned char*)"rbrke", {226, 166, 140, 0}}, +{(unsigned char*)"rbrksld", {226, 166, 142, 0}}, +{(unsigned char*)"rbrkslu", {226, 166, 144, 0}}, +{(unsigned char*)"rcaron", {197, 153, 0}}, +{(unsigned char*)"rcedil", {197, 151, 0}}, +{(unsigned char*)"rceil", {226, 140, 137, 0}}, +{(unsigned char*)"rcub", {125, 0}}, +{(unsigned char*)"rcy", {209, 128, 0}}, +{(unsigned char*)"rdca", {226, 164, 183, 0}}, +{(unsigned char*)"rdldhar", {226, 165, 169, 0}}, +{(unsigned char*)"rdquo", {226, 128, 157, 0}}, +{(unsigned char*)"rdquor", {226, 128, 157, 0}}, +{(unsigned char*)"rdsh", {226, 134, 179, 0}}, +{(unsigned char*)"real", {226, 132, 156, 0}}, +{(unsigned char*)"realine", {226, 132, 155, 0}}, +{(unsigned char*)"realpart", {226, 132, 156, 0}}, +{(unsigned char*)"reals", {226, 132, 157, 0}}, +{(unsigned char*)"rect", {226, 150, 173, 0}}, +{(unsigned char*)"reg", {194, 174, 0}}, +{(unsigned char*)"rfisht", {226, 165, 189, 0}}, +{(unsigned char*)"rfloor", {226, 140, 139, 0}}, +{(unsigned char*)"rfr", {240, 157, 148, 175, 0}}, +{(unsigned char*)"rhard", {226, 135, 129, 0}}, +{(unsigned char*)"rharu", {226, 135, 128, 0}}, +{(unsigned char*)"rharul", {226, 165, 172, 0}}, +{(unsigned char*)"rho", {207, 129, 0}}, +{(unsigned char*)"rhov", {207, 177, 0}}, +{(unsigned char*)"rightarrow", {226, 134, 146, 0}}, +{(unsigned char*)"rightarrowtail", {226, 134, 163, 0}}, +{(unsigned char*)"rightharpoondown", {226, 135, 129, 0}}, +{(unsigned char*)"rightharpoonup", {226, 135, 128, 0}}, +{(unsigned char*)"rightleftarrows", {226, 135, 132, 0}}, +{(unsigned char*)"rightleftharpoons", {226, 135, 140, 0}}, +{(unsigned char*)"rightrightarrows", {226, 135, 137, 0}}, +{(unsigned char*)"rightsquigarrow", {226, 134, 157, 0}}, +{(unsigned char*)"rightthreetimes", {226, 139, 140, 0}}, +{(unsigned char*)"ring", {203, 154, 0}}, +{(unsigned char*)"risingdotseq", {226, 137, 147, 0}}, +{(unsigned char*)"rlarr", {226, 135, 132, 0}}, +{(unsigned char*)"rlhar", {226, 135, 140, 0}}, +{(unsigned char*)"rlm", {226, 128, 143, 0}}, +{(unsigned char*)"rmoust", {226, 142, 177, 0}}, +{(unsigned char*)"rmoustache", {226, 142, 177, 0}}, +{(unsigned char*)"rnmid", {226, 171, 174, 0}}, +{(unsigned char*)"roang", {226, 159, 173, 0}}, +{(unsigned char*)"roarr", {226, 135, 190, 0}}, +{(unsigned char*)"robrk", {226, 159, 167, 0}}, +{(unsigned char*)"ropar", {226, 166, 134, 0}}, +{(unsigned char*)"ropf", {240, 157, 149, 163, 0}}, +{(unsigned char*)"roplus", {226, 168, 174, 0}}, +{(unsigned char*)"rotimes", {226, 168, 181, 0}}, +{(unsigned char*)"rpar", {41, 0}}, +{(unsigned char*)"rpargt", {226, 166, 148, 0}}, +{(unsigned char*)"rppolint", {226, 168, 146, 0}}, +{(unsigned char*)"rrarr", {226, 135, 137, 0}}, +{(unsigned char*)"rsaquo", {226, 128, 186, 0}}, +{(unsigned char*)"rscr", {240, 157, 147, 135, 0}}, +{(unsigned char*)"rsh", {226, 134, 177, 0}}, +{(unsigned char*)"rsqb", {93, 0}}, +{(unsigned char*)"rsquo", {226, 128, 153, 0}}, +{(unsigned char*)"rsquor", {226, 128, 153, 0}}, +{(unsigned char*)"rthree", {226, 139, 140, 0}}, +{(unsigned char*)"rtimes", {226, 139, 138, 0}}, +{(unsigned char*)"rtri", {226, 150, 185, 0}}, +{(unsigned char*)"rtrie", {226, 138, 181, 0}}, +{(unsigned char*)"rtrif", {226, 150, 184, 0}}, +{(unsigned char*)"rtriltri", {226, 167, 142, 0}}, +{(unsigned char*)"ruluhar", {226, 165, 168, 0}}, +{(unsigned char*)"rx", {226, 132, 158, 0}}, +{(unsigned char*)"sacute", {197, 155, 0}}, +{(unsigned char*)"sbquo", {226, 128, 154, 0}}, +{(unsigned char*)"sc", {226, 137, 187, 0}}, +{(unsigned char*)"scE", {226, 170, 180, 0}}, +{(unsigned char*)"scap", {226, 170, 184, 0}}, +{(unsigned char*)"scaron", {197, 161, 0}}, +{(unsigned char*)"sccue", {226, 137, 189, 0}}, +{(unsigned char*)"sce", {226, 170, 176, 0}}, +{(unsigned char*)"scedil", {197, 159, 0}}, +{(unsigned char*)"scirc", {197, 157, 0}}, +{(unsigned char*)"scnE", {226, 170, 182, 0}}, +{(unsigned char*)"scnap", {226, 170, 186, 0}}, +{(unsigned char*)"scnsim", {226, 139, 169, 0}}, +{(unsigned char*)"scpolint", {226, 168, 147, 0}}, +{(unsigned char*)"scsim", {226, 137, 191, 0}}, +{(unsigned char*)"scy", {209, 129, 0}}, +{(unsigned char*)"sdot", {226, 139, 133, 0}}, +{(unsigned char*)"sdotb", {226, 138, 161, 0}}, +{(unsigned char*)"sdote", {226, 169, 166, 0}}, +{(unsigned char*)"seArr", {226, 135, 152, 0}}, +{(unsigned char*)"searhk", {226, 164, 165, 0}}, +{(unsigned char*)"searr", {226, 134, 152, 0}}, +{(unsigned char*)"searrow", {226, 134, 152, 0}}, +{(unsigned char*)"sect", {194, 167, 0}}, +{(unsigned char*)"semi", {59, 0}}, +{(unsigned char*)"seswar", {226, 164, 169, 0}}, +{(unsigned char*)"setminus", {226, 136, 150, 0}}, +{(unsigned char*)"setmn", {226, 136, 150, 0}}, +{(unsigned char*)"sext", {226, 156, 182, 0}}, +{(unsigned char*)"sfr", {240, 157, 148, 176, 0}}, +{(unsigned char*)"sfrown", {226, 140, 162, 0}}, +{(unsigned char*)"sharp", {226, 153, 175, 0}}, +{(unsigned char*)"shchcy", {209, 137, 0}}, +{(unsigned char*)"shcy", {209, 136, 0}}, +{(unsigned char*)"shortmid", {226, 136, 163, 0}}, +{(unsigned char*)"shortparallel", {226, 136, 165, 0}}, +{(unsigned char*)"shy", {194, 173, 0}}, +{(unsigned char*)"sigma", {207, 131, 0}}, +{(unsigned char*)"sigmaf", {207, 130, 0}}, +{(unsigned char*)"sigmav", {207, 130, 0}}, +{(unsigned char*)"sim", {226, 136, 188, 0}}, +{(unsigned char*)"simdot", {226, 169, 170, 0}}, +{(unsigned char*)"sime", {226, 137, 131, 0}}, +{(unsigned char*)"simeq", {226, 137, 131, 0}}, +{(unsigned char*)"simg", {226, 170, 158, 0}}, +{(unsigned char*)"simgE", {226, 170, 160, 0}}, +{(unsigned char*)"siml", {226, 170, 157, 0}}, +{(unsigned char*)"simlE", {226, 170, 159, 0}}, +{(unsigned char*)"simne", {226, 137, 134, 0}}, +{(unsigned char*)"simplus", {226, 168, 164, 0}}, +{(unsigned char*)"simrarr", {226, 165, 178, 0}}, +{(unsigned char*)"slarr", {226, 134, 144, 0}}, +{(unsigned char*)"smallsetminus", {226, 136, 150, 0}}, +{(unsigned char*)"smashp", {226, 168, 179, 0}}, +{(unsigned char*)"smeparsl", {226, 167, 164, 0}}, +{(unsigned char*)"smid", {226, 136, 163, 0}}, +{(unsigned char*)"smile", {226, 140, 163, 0}}, +{(unsigned char*)"smt", {226, 170, 170, 0}}, +{(unsigned char*)"smte", {226, 170, 172, 0}}, +{(unsigned char*)"smtes", {226, 170, 172, 239, 184, 128, 0}}, +{(unsigned char*)"softcy", {209, 140, 0}}, +{(unsigned char*)"sol", {47, 0}}, +{(unsigned char*)"solb", {226, 167, 132, 0}}, +{(unsigned char*)"solbar", {226, 140, 191, 0}}, +{(unsigned char*)"sopf", {240, 157, 149, 164, 0}}, +{(unsigned char*)"spades", {226, 153, 160, 0}}, +{(unsigned char*)"spadesuit", {226, 153, 160, 0}}, +{(unsigned char*)"spar", {226, 136, 165, 0}}, +{(unsigned char*)"sqcap", {226, 138, 147, 0}}, +{(unsigned char*)"sqcaps", {226, 138, 147, 239, 184, 128, 0}}, +{(unsigned char*)"sqcup", {226, 138, 148, 0}}, +{(unsigned char*)"sqcups", {226, 138, 148, 239, 184, 128, 0}}, +{(unsigned char*)"sqsub", {226, 138, 143, 0}}, +{(unsigned char*)"sqsube", {226, 138, 145, 0}}, +{(unsigned char*)"sqsubset", {226, 138, 143, 0}}, +{(unsigned char*)"sqsubseteq", {226, 138, 145, 0}}, +{(unsigned char*)"sqsup", {226, 138, 144, 0}}, +{(unsigned char*)"sqsupe", {226, 138, 146, 0}}, +{(unsigned char*)"sqsupset", {226, 138, 144, 0}}, +{(unsigned char*)"sqsupseteq", {226, 138, 146, 0}}, +{(unsigned char*)"squ", {226, 150, 161, 0}}, +{(unsigned char*)"square", {226, 150, 161, 0}}, +{(unsigned char*)"squarf", {226, 150, 170, 0}}, +{(unsigned char*)"squf", {226, 150, 170, 0}}, +{(unsigned char*)"srarr", {226, 134, 146, 0}}, +{(unsigned char*)"sscr", {240, 157, 147, 136, 0}}, +{(unsigned char*)"ssetmn", {226, 136, 150, 0}}, +{(unsigned char*)"ssmile", {226, 140, 163, 0}}, +{(unsigned char*)"sstarf", {226, 139, 134, 0}}, +{(unsigned char*)"star", {226, 152, 134, 0}}, +{(unsigned char*)"starf", {226, 152, 133, 0}}, +{(unsigned char*)"straightepsilon", {207, 181, 0}}, +{(unsigned char*)"straightphi", {207, 149, 0}}, +{(unsigned char*)"strns", {194, 175, 0}}, +{(unsigned char*)"sub", {226, 138, 130, 0}}, +{(unsigned char*)"subE", {226, 171, 133, 0}}, +{(unsigned char*)"subdot", {226, 170, 189, 0}}, +{(unsigned char*)"sube", {226, 138, 134, 0}}, +{(unsigned char*)"subedot", {226, 171, 131, 0}}, +{(unsigned char*)"submult", {226, 171, 129, 0}}, +{(unsigned char*)"subnE", {226, 171, 139, 0}}, +{(unsigned char*)"subne", {226, 138, 138, 0}}, +{(unsigned char*)"subplus", {226, 170, 191, 0}}, +{(unsigned char*)"subrarr", {226, 165, 185, 0}}, +{(unsigned char*)"subset", {226, 138, 130, 0}}, +{(unsigned char*)"subseteq", {226, 138, 134, 0}}, +{(unsigned char*)"subseteqq", {226, 171, 133, 0}}, +{(unsigned char*)"subsetneq", {226, 138, 138, 0}}, +{(unsigned char*)"subsetneqq", {226, 171, 139, 0}}, +{(unsigned char*)"subsim", {226, 171, 135, 0}}, +{(unsigned char*)"subsub", {226, 171, 149, 0}}, +{(unsigned char*)"subsup", {226, 171, 147, 0}}, +{(unsigned char*)"succ", {226, 137, 187, 0}}, +{(unsigned char*)"succapprox", {226, 170, 184, 0}}, +{(unsigned char*)"succcurlyeq", {226, 137, 189, 0}}, +{(unsigned char*)"succeq", {226, 170, 176, 0}}, +{(unsigned char*)"succnapprox", {226, 170, 186, 0}}, +{(unsigned char*)"succneqq", {226, 170, 182, 0}}, +{(unsigned char*)"succnsim", {226, 139, 169, 0}}, +{(unsigned char*)"succsim", {226, 137, 191, 0}}, +{(unsigned char*)"sum", {226, 136, 145, 0}}, +{(unsigned char*)"sung", {226, 153, 170, 0}}, +{(unsigned char*)"sup", {226, 138, 131, 0}}, +{(unsigned char*)"sup1", {194, 185, 0}}, +{(unsigned char*)"sup2", {194, 178, 0}}, +{(unsigned char*)"sup3", {194, 179, 0}}, +{(unsigned char*)"supE", {226, 171, 134, 0}}, +{(unsigned char*)"supdot", {226, 170, 190, 0}}, +{(unsigned char*)"supdsub", {226, 171, 152, 0}}, +{(unsigned char*)"supe", {226, 138, 135, 0}}, +{(unsigned char*)"supedot", {226, 171, 132, 0}}, +{(unsigned char*)"suphsol", {226, 159, 137, 0}}, +{(unsigned char*)"suphsub", {226, 171, 151, 0}}, +{(unsigned char*)"suplarr", {226, 165, 187, 0}}, +{(unsigned char*)"supmult", {226, 171, 130, 0}}, +{(unsigned char*)"supnE", {226, 171, 140, 0}}, +{(unsigned char*)"supne", {226, 138, 139, 0}}, +{(unsigned char*)"supplus", {226, 171, 128, 0}}, +{(unsigned char*)"supset", {226, 138, 131, 0}}, +{(unsigned char*)"supseteq", {226, 138, 135, 0}}, +{(unsigned char*)"supseteqq", {226, 171, 134, 0}}, +{(unsigned char*)"supsetneq", {226, 138, 139, 0}}, +{(unsigned char*)"supsetneqq", {226, 171, 140, 0}}, +{(unsigned char*)"supsim", {226, 171, 136, 0}}, +{(unsigned char*)"supsub", {226, 171, 148, 0}}, +{(unsigned char*)"supsup", {226, 171, 150, 0}}, +{(unsigned char*)"swArr", {226, 135, 153, 0}}, +{(unsigned char*)"swarhk", {226, 164, 166, 0}}, +{(unsigned char*)"swarr", {226, 134, 153, 0}}, +{(unsigned char*)"swarrow", {226, 134, 153, 0}}, +{(unsigned char*)"swnwar", {226, 164, 170, 0}}, +{(unsigned char*)"szlig", {195, 159, 0}}, +{(unsigned char*)"target", {226, 140, 150, 0}}, +{(unsigned char*)"tau", {207, 132, 0}}, +{(unsigned char*)"tbrk", {226, 142, 180, 0}}, +{(unsigned char*)"tcaron", {197, 165, 0}}, +{(unsigned char*)"tcedil", {197, 163, 0}}, +{(unsigned char*)"tcy", {209, 130, 0}}, +{(unsigned char*)"tdot", {226, 131, 155, 0}}, +{(unsigned char*)"telrec", {226, 140, 149, 0}}, +{(unsigned char*)"tfr", {240, 157, 148, 177, 0}}, +{(unsigned char*)"there4", {226, 136, 180, 0}}, +{(unsigned char*)"therefore", {226, 136, 180, 0}}, +{(unsigned char*)"theta", {206, 184, 0}}, +{(unsigned char*)"thetasym", {207, 145, 0}}, +{(unsigned char*)"thetav", {207, 145, 0}}, +{(unsigned char*)"thickapprox", {226, 137, 136, 0}}, +{(unsigned char*)"thicksim", {226, 136, 188, 0}}, +{(unsigned char*)"thinsp", {226, 128, 137, 0}}, +{(unsigned char*)"thkap", {226, 137, 136, 0}}, +{(unsigned char*)"thksim", {226, 136, 188, 0}}, +{(unsigned char*)"thorn", {195, 190, 0}}, +{(unsigned char*)"tilde", {203, 156, 0}}, +{(unsigned char*)"times", {195, 151, 0}}, +{(unsigned char*)"timesb", {226, 138, 160, 0}}, +{(unsigned char*)"timesbar", {226, 168, 177, 0}}, +{(unsigned char*)"timesd", {226, 168, 176, 0}}, +{(unsigned char*)"tint", {226, 136, 173, 0}}, +{(unsigned char*)"toea", {226, 164, 168, 0}}, +{(unsigned char*)"top", {226, 138, 164, 0}}, +{(unsigned char*)"topbot", {226, 140, 182, 0}}, +{(unsigned char*)"topcir", {226, 171, 177, 0}}, +{(unsigned char*)"topf", {240, 157, 149, 165, 0}}, +{(unsigned char*)"topfork", {226, 171, 154, 0}}, +{(unsigned char*)"tosa", {226, 164, 169, 0}}, +{(unsigned char*)"tprime", {226, 128, 180, 0}}, +{(unsigned char*)"trade", {226, 132, 162, 0}}, +{(unsigned char*)"triangle", {226, 150, 181, 0}}, +{(unsigned char*)"triangledown", {226, 150, 191, 0}}, +{(unsigned char*)"triangleleft", {226, 151, 131, 0}}, +{(unsigned char*)"trianglelefteq", {226, 138, 180, 0}}, +{(unsigned char*)"triangleq", {226, 137, 156, 0}}, +{(unsigned char*)"triangleright", {226, 150, 185, 0}}, +{(unsigned char*)"trianglerighteq", {226, 138, 181, 0}}, +{(unsigned char*)"tridot", {226, 151, 172, 0}}, +{(unsigned char*)"trie", {226, 137, 156, 0}}, +{(unsigned char*)"triminus", {226, 168, 186, 0}}, +{(unsigned char*)"triplus", {226, 168, 185, 0}}, +{(unsigned char*)"trisb", {226, 167, 141, 0}}, +{(unsigned char*)"tritime", {226, 168, 187, 0}}, +{(unsigned char*)"trpezium", {226, 143, 162, 0}}, +{(unsigned char*)"tscr", {240, 157, 147, 137, 0}}, +{(unsigned char*)"tscy", {209, 134, 0}}, +{(unsigned char*)"tshcy", {209, 155, 0}}, +{(unsigned char*)"tstrok", {197, 167, 0}}, +{(unsigned char*)"twixt", {226, 137, 172, 0}}, +{(unsigned char*)"twoheadleftarrow", {226, 134, 158, 0}}, +{(unsigned char*)"twoheadrightarrow", {226, 134, 160, 0}}, +{(unsigned char*)"uArr", {226, 135, 145, 0}}, +{(unsigned char*)"uHar", {226, 165, 163, 0}}, +{(unsigned char*)"uacute", {195, 186, 0}}, +{(unsigned char*)"uarr", {226, 134, 145, 0}}, +{(unsigned char*)"ubrcy", {209, 158, 0}}, +{(unsigned char*)"ubreve", {197, 173, 0}}, +{(unsigned char*)"ucirc", {195, 187, 0}}, +{(unsigned char*)"ucy", {209, 131, 0}}, +{(unsigned char*)"udarr", {226, 135, 133, 0}}, +{(unsigned char*)"udblac", {197, 177, 0}}, +{(unsigned char*)"udhar", {226, 165, 174, 0}}, +{(unsigned char*)"ufisht", {226, 165, 190, 0}}, +{(unsigned char*)"ufr", {240, 157, 148, 178, 0}}, +{(unsigned char*)"ugrave", {195, 185, 0}}, +{(unsigned char*)"uharl", {226, 134, 191, 0}}, +{(unsigned char*)"uharr", {226, 134, 190, 0}}, +{(unsigned char*)"uhblk", {226, 150, 128, 0}}, +{(unsigned char*)"ulcorn", {226, 140, 156, 0}}, +{(unsigned char*)"ulcorner", {226, 140, 156, 0}}, +{(unsigned char*)"ulcrop", {226, 140, 143, 0}}, +{(unsigned char*)"ultri", {226, 151, 184, 0}}, +{(unsigned char*)"umacr", {197, 171, 0}}, +{(unsigned char*)"uml", {194, 168, 0}}, +{(unsigned char*)"uogon", {197, 179, 0}}, +{(unsigned char*)"uopf", {240, 157, 149, 166, 0}}, +{(unsigned char*)"uparrow", {226, 134, 145, 0}}, +{(unsigned char*)"updownarrow", {226, 134, 149, 0}}, +{(unsigned char*)"upharpoonleft", {226, 134, 191, 0}}, +{(unsigned char*)"upharpoonright", {226, 134, 190, 0}}, +{(unsigned char*)"uplus", {226, 138, 142, 0}}, +{(unsigned char*)"upsi", {207, 133, 0}}, +{(unsigned char*)"upsih", {207, 146, 0}}, +{(unsigned char*)"upsilon", {207, 133, 0}}, +{(unsigned char*)"upuparrows", {226, 135, 136, 0}}, +{(unsigned char*)"urcorn", {226, 140, 157, 0}}, +{(unsigned char*)"urcorner", {226, 140, 157, 0}}, +{(unsigned char*)"urcrop", {226, 140, 142, 0}}, +{(unsigned char*)"uring", {197, 175, 0}}, +{(unsigned char*)"urtri", {226, 151, 185, 0}}, +{(unsigned char*)"uscr", {240, 157, 147, 138, 0}}, +{(unsigned char*)"utdot", {226, 139, 176, 0}}, +{(unsigned char*)"utilde", {197, 169, 0}}, +{(unsigned char*)"utri", {226, 150, 181, 0}}, +{(unsigned char*)"utrif", {226, 150, 180, 0}}, +{(unsigned char*)"uuarr", {226, 135, 136, 0}}, +{(unsigned char*)"uuml", {195, 188, 0}}, +{(unsigned char*)"uwangle", {226, 166, 167, 0}}, +{(unsigned char*)"vArr", {226, 135, 149, 0}}, +{(unsigned char*)"vBar", {226, 171, 168, 0}}, +{(unsigned char*)"vBarv", {226, 171, 169, 0}}, +{(unsigned char*)"vDash", {226, 138, 168, 0}}, +{(unsigned char*)"vangrt", {226, 166, 156, 0}}, +{(unsigned char*)"varepsilon", {207, 181, 0}}, +{(unsigned char*)"varkappa", {207, 176, 0}}, +{(unsigned char*)"varnothing", {226, 136, 133, 0}}, +{(unsigned char*)"varphi", {207, 149, 0}}, +{(unsigned char*)"varpi", {207, 150, 0}}, +{(unsigned char*)"varpropto", {226, 136, 157, 0}}, +{(unsigned char*)"varr", {226, 134, 149, 0}}, +{(unsigned char*)"varrho", {207, 177, 0}}, +{(unsigned char*)"varsigma", {207, 130, 0}}, +{(unsigned char*)"varsubsetneq", {226, 138, 138, 239, 184, 128, 0}}, +{(unsigned char*)"varsubsetneqq", {226, 171, 139, 239, 184, 128, 0}}, +{(unsigned char*)"varsupsetneq", {226, 138, 139, 239, 184, 128, 0}}, +{(unsigned char*)"varsupsetneqq", {226, 171, 140, 239, 184, 128, 0}}, +{(unsigned char*)"vartheta", {207, 145, 0}}, +{(unsigned char*)"vartriangleleft", {226, 138, 178, 0}}, +{(unsigned char*)"vartriangleright", {226, 138, 179, 0}}, +{(unsigned char*)"vcy", {208, 178, 0}}, +{(unsigned char*)"vdash", {226, 138, 162, 0}}, +{(unsigned char*)"vee", {226, 136, 168, 0}}, +{(unsigned char*)"veebar", {226, 138, 187, 0}}, +{(unsigned char*)"veeeq", {226, 137, 154, 0}}, +{(unsigned char*)"vellip", {226, 139, 174, 0}}, +{(unsigned char*)"verbar", {124, 0}}, +{(unsigned char*)"vert", {124, 0}}, +{(unsigned char*)"vfr", {240, 157, 148, 179, 0}}, +{(unsigned char*)"vltri", {226, 138, 178, 0}}, +{(unsigned char*)"vnsub", {226, 138, 130, 226, 131, 146, 0}}, +{(unsigned char*)"vnsup", {226, 138, 131, 226, 131, 146, 0}}, +{(unsigned char*)"vopf", {240, 157, 149, 167, 0}}, +{(unsigned char*)"vprop", {226, 136, 157, 0}}, +{(unsigned char*)"vrtri", {226, 138, 179, 0}}, +{(unsigned char*)"vscr", {240, 157, 147, 139, 0}}, +{(unsigned char*)"vsubnE", {226, 171, 139, 239, 184, 128, 0}}, +{(unsigned char*)"vsubne", {226, 138, 138, 239, 184, 128, 0}}, +{(unsigned char*)"vsupnE", {226, 171, 140, 239, 184, 128, 0}}, +{(unsigned char*)"vsupne", {226, 138, 139, 239, 184, 128, 0}}, +{(unsigned char*)"vzigzag", {226, 166, 154, 0}}, +{(unsigned char*)"wcirc", {197, 181, 0}}, +{(unsigned char*)"wedbar", {226, 169, 159, 0}}, +{(unsigned char*)"wedge", {226, 136, 167, 0}}, +{(unsigned char*)"wedgeq", {226, 137, 153, 0}}, +{(unsigned char*)"weierp", {226, 132, 152, 0}}, +{(unsigned char*)"wfr", {240, 157, 148, 180, 0}}, +{(unsigned char*)"wopf", {240, 157, 149, 168, 0}}, +{(unsigned char*)"wp", {226, 132, 152, 0}}, +{(unsigned char*)"wr", {226, 137, 128, 0}}, +{(unsigned char*)"wreath", {226, 137, 128, 0}}, +{(unsigned char*)"wscr", {240, 157, 147, 140, 0}}, +{(unsigned char*)"xcap", {226, 139, 130, 0}}, +{(unsigned char*)"xcirc", {226, 151, 175, 0}}, +{(unsigned char*)"xcup", {226, 139, 131, 0}}, +{(unsigned char*)"xdtri", {226, 150, 189, 0}}, +{(unsigned char*)"xfr", {240, 157, 148, 181, 0}}, +{(unsigned char*)"xhArr", {226, 159, 186, 0}}, +{(unsigned char*)"xharr", {226, 159, 183, 0}}, +{(unsigned char*)"xi", {206, 190, 0}}, +{(unsigned char*)"xlArr", {226, 159, 184, 0}}, +{(unsigned char*)"xlarr", {226, 159, 181, 0}}, +{(unsigned char*)"xmap", {226, 159, 188, 0}}, +{(unsigned char*)"xnis", {226, 139, 187, 0}}, +{(unsigned char*)"xodot", {226, 168, 128, 0}}, +{(unsigned char*)"xopf", {240, 157, 149, 169, 0}}, +{(unsigned char*)"xoplus", {226, 168, 129, 0}}, +{(unsigned char*)"xotime", {226, 168, 130, 0}}, +{(unsigned char*)"xrArr", {226, 159, 185, 0}}, +{(unsigned char*)"xrarr", {226, 159, 182, 0}}, +{(unsigned char*)"xscr", {240, 157, 147, 141, 0}}, +{(unsigned char*)"xsqcup", {226, 168, 134, 0}}, +{(unsigned char*)"xuplus", {226, 168, 132, 0}}, +{(unsigned char*)"xutri", {226, 150, 179, 0}}, +{(unsigned char*)"xvee", {226, 139, 129, 0}}, +{(unsigned char*)"xwedge", {226, 139, 128, 0}}, +{(unsigned char*)"yacute", {195, 189, 0}}, +{(unsigned char*)"yacy", {209, 143, 0}}, +{(unsigned char*)"ycirc", {197, 183, 0}}, +{(unsigned char*)"ycy", {209, 139, 0}}, +{(unsigned char*)"yen", {194, 165, 0}}, +{(unsigned char*)"yfr", {240, 157, 148, 182, 0}}, +{(unsigned char*)"yicy", {209, 151, 0}}, +{(unsigned char*)"yopf", {240, 157, 149, 170, 0}}, +{(unsigned char*)"yscr", {240, 157, 147, 142, 0}}, +{(unsigned char*)"yucy", {209, 142, 0}}, +{(unsigned char*)"yuml", {195, 191, 0}}, +{(unsigned char*)"zacute", {197, 186, 0}}, +{(unsigned char*)"zcaron", {197, 190, 0}}, +{(unsigned char*)"zcy", {208, 183, 0}}, +{(unsigned char*)"zdot", {197, 188, 0}}, +{(unsigned char*)"zeetrf", {226, 132, 168, 0}}, +{(unsigned char*)"zeta", {206, 182, 0}}, +{(unsigned char*)"zfr", {240, 157, 148, 183, 0}}, +{(unsigned char*)"zhcy", {208, 182, 0}}, +{(unsigned char*)"zigrarr", {226, 135, 157, 0}}, +{(unsigned char*)"zopf", {240, 157, 149, 171, 0}}, +{(unsigned char*)"zscr", {240, 157, 147, 143, 0}}, +{(unsigned char*)"zwj", {226, 128, 141, 0}}, +{(unsigned char*)"zwnj", {226, 128, 140, 0}}, +}; diff --git a/lib/cmark/src/houdini.h b/lib/cmark/src/houdini.h new file mode 100644 index 0000000..f738e82 --- /dev/null +++ b/lib/cmark/src/houdini.h @@ -0,0 +1,51 @@ +#ifndef CMARK_HOUDINI_H +#define CMARK_HOUDINI_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> +#include "config.h" +#include "buffer.h" + +#ifdef HAVE___BUILTIN_EXPECT +#define likely(x) __builtin_expect((x), 1) +#define unlikely(x) __builtin_expect((x), 0) +#else +#define likely(x) (x) +#define unlikely(x) (x) +#endif + +#ifdef HOUDINI_USE_LOCALE +#define _isxdigit(c) isxdigit(c) +#define _isdigit(c) isdigit(c) +#else +/* + * Helper _isdigit methods -- do not trust the current locale + * */ +#define _isxdigit(c) (strchr("0123456789ABCDEFabcdef", (c)) != NULL) +#define _isdigit(c) ((c) >= '0' && (c) <= '9') +#endif + +#define HOUDINI_ESCAPED_SIZE(x) (((x)*12) / 10) +#define HOUDINI_UNESCAPED_SIZE(x) (x) + +extern bufsize_t houdini_unescape_ent(cmark_strbuf *ob, const uint8_t *src, + bufsize_t size); +extern int houdini_escape_html(cmark_strbuf *ob, const uint8_t *src, + bufsize_t size); +extern int houdini_escape_html0(cmark_strbuf *ob, const uint8_t *src, + bufsize_t size, int secure); +extern int houdini_unescape_html(cmark_strbuf *ob, const uint8_t *src, + bufsize_t size); +extern void houdini_unescape_html_f(cmark_strbuf *ob, const uint8_t *src, + bufsize_t size); +extern int houdini_escape_href(cmark_strbuf *ob, const uint8_t *src, + bufsize_t size); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/houdini_href_e.c b/lib/cmark/src/houdini_href_e.c new file mode 100644 index 0000000..bfa9704 --- /dev/null +++ b/lib/cmark/src/houdini_href_e.c @@ -0,0 +1,100 @@ +#include <assert.h> +#include <stdio.h> +#include <string.h> + +#include "houdini.h" + +/* + * The following characters will not be escaped: + * + * -_.+!*'(),%#@?=;:/,+&$ alphanum + * + * Note that this character set is the addition of: + * + * - The characters which are safe to be in an URL + * - The characters which are *not* safe to be in + * an URL because they are RESERVED characters. + * + * We assume (lazily) that any RESERVED char that + * appears inside an URL is actually meant to + * have its native function (i.e. as an URL + * component/separator) and hence needs no escaping. + * + * There are two exceptions: the chacters & (amp) + * and ' (single quote) do not appear in the table. + * They are meant to appear in the URL as components, + * yet they require special HTML-entity escaping + * to generate valid HTML markup. + * + * All other characters will be escaped to %XX. + * + */ +static const char HREF_SAFE[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +int houdini_escape_href(cmark_strbuf *ob, const uint8_t *src, bufsize_t size) { + static const uint8_t hex_chars[] = "0123456789ABCDEF"; + bufsize_t i = 0, org; + uint8_t hex_str[3]; + + hex_str[0] = '%'; + + while (i < size) { + org = i; + while (i < size && HREF_SAFE[src[i]] != 0) + i++; + + if (likely(i > org)) + cmark_strbuf_put(ob, src + org, i - org); + + /* escaping */ + if (i >= size) + break; + + switch (src[i]) { + /* amp appears all the time in URLs, but needs + * HTML-entity escaping to be inside an href */ + case '&': + cmark_strbuf_puts(ob, "&"); + break; + + /* the single quote is a valid URL character + * according to the standard; it needs HTML + * entity escaping too */ + case '\'': + cmark_strbuf_puts(ob, "'"); + break; + +/* the space can be escaped to %20 or a plus + * sign. we're going with the generic escape + * for now. the plus thing is more commonly seen + * when building GET strings */ +#if 0 + case ' ': + cmark_strbuf_putc(ob, '+'); + break; +#endif + + /* every other character goes with a %XX escaping */ + default: + hex_str[1] = hex_chars[(src[i] >> 4) & 0xF]; + hex_str[2] = hex_chars[src[i] & 0xF]; + cmark_strbuf_put(ob, hex_str, 3); + } + + i++; + } + + return 1; +} diff --git a/lib/cmark/src/houdini_html_e.c b/lib/cmark/src/houdini_html_e.c new file mode 100644 index 0000000..0e539f0 --- /dev/null +++ b/lib/cmark/src/houdini_html_e.c @@ -0,0 +1,66 @@ +#include <assert.h> +#include <stdio.h> +#include <string.h> + +#include "houdini.h" + +/** + * According to the OWASP rules: + * + * & --> & + * < --> < + * > --> > + * " --> " + * ' --> ' ' is not recommended + * / --> / forward slash is included as it helps end an HTML entity + * + */ +static const char HTML_ESCAPE_TABLE[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const char *HTML_ESCAPES[] = {"", """, "&", "'", + "/", "<", ">"}; + +int houdini_escape_html0(cmark_strbuf *ob, const uint8_t *src, bufsize_t size, + int secure) { + bufsize_t i = 0, org, esc = 0; + + while (i < size) { + org = i; + while (i < size && (esc = HTML_ESCAPE_TABLE[src[i]]) == 0) + i++; + + if (i > org) + cmark_strbuf_put(ob, src + org, i - org); + + /* escaping */ + if (unlikely(i >= size)) + break; + + /* The forward slash is only escaped in secure mode */ + if ((src[i] == '/' || src[i] == '\'') && !secure) { + cmark_strbuf_putc(ob, src[i]); + } else { + cmark_strbuf_puts(ob, HTML_ESCAPES[esc]); + } + + i++; + } + + return 1; +} + +int houdini_escape_html(cmark_strbuf *ob, const uint8_t *src, bufsize_t size) { + return houdini_escape_html0(ob, src, size, 1); +} diff --git a/lib/cmark/src/houdini_html_u.c b/lib/cmark/src/houdini_html_u.c new file mode 100644 index 0000000..ce57ea1 --- /dev/null +++ b/lib/cmark/src/houdini_html_u.c @@ -0,0 +1,153 @@ +#include <assert.h> +#include <stdio.h> +#include <string.h> + +#include "buffer.h" +#include "houdini.h" +#include "utf8.h" +#include "entities.inc" + +/* Binary tree lookup code for entities added by JGM */ + +static const unsigned char *S_lookup(int i, int low, int hi, + const unsigned char *s, int len) { + int j; + int cmp = + strncmp((const char *)s, (const char *)cmark_entities[i].entity, len); + if (cmp == 0 && cmark_entities[i].entity[len] == 0) { + return (const unsigned char *)cmark_entities[i].bytes; + } else if (cmp <= 0 && i > low) { + j = i - ((i - low) / 2); + if (j == i) + j -= 1; + return S_lookup(j, low, i - 1, s, len); + } else if (cmp > 0 && i < hi) { + j = i + ((hi - i) / 2); + if (j == i) + j += 1; + return S_lookup(j, i + 1, hi, s, len); + } else { + return NULL; + } +} + +static const unsigned char *S_lookup_entity(const unsigned char *s, int len) { + return S_lookup(CMARK_NUM_ENTITIES / 2, 0, CMARK_NUM_ENTITIES - 1, s, len); +} + +bufsize_t houdini_unescape_ent(cmark_strbuf *ob, const uint8_t *src, + bufsize_t size) { + bufsize_t i = 0; + + if (size >= 3 && src[0] == '#') { + int codepoint = 0; + int num_digits = 0; + int max_digits = 7; + + if (_isdigit(src[1])) { + for (i = 1; i < size && _isdigit(src[i]); ++i) { + codepoint = (codepoint * 10) + (src[i] - '0'); + + if (codepoint >= 0x110000) { + // Keep counting digits but + // avoid integer overflow. + codepoint = 0x110000; + } + } + + num_digits = i - 1; + max_digits = 7; + } + + else if (src[1] == 'x' || src[1] == 'X') { + for (i = 2; i < size && _isxdigit(src[i]); ++i) { + codepoint = (codepoint * 16) + ((src[i] | 32) % 39 - 9); + + if (codepoint >= 0x110000) { + // Keep counting digits but + // avoid integer overflow. + codepoint = 0x110000; + } + } + + num_digits = i - 2; + max_digits = 6; + } + + if (num_digits >= 1 && num_digits <= max_digits && + i < size && src[i] == ';') { + if (codepoint == 0 || (codepoint >= 0xD800 && codepoint < 0xE000) || + codepoint >= 0x110000) { + codepoint = 0xFFFD; + } + cmark_utf8proc_encode_char(codepoint, ob); + return i + 1; + } + } + + else { + if (size > CMARK_ENTITY_MAX_LENGTH) + size = CMARK_ENTITY_MAX_LENGTH; + + for (i = CMARK_ENTITY_MIN_LENGTH; i < size; ++i) { + if (src[i] == ' ') + break; + + if (src[i] == ';') { + const unsigned char *entity = S_lookup_entity(src, i); + + if (entity != NULL) { + cmark_strbuf_puts(ob, (const char *)entity); + return i + 1; + } + + break; + } + } + } + + return 0; +} + +int houdini_unescape_html(cmark_strbuf *ob, const uint8_t *src, + bufsize_t size) { + bufsize_t i = 0, org, ent; + + while (i < size) { + org = i; + while (i < size && src[i] != '&') + i++; + + if (likely(i > org)) { + if (unlikely(org == 0)) { + if (i >= size) + return 0; + + cmark_strbuf_grow(ob, HOUDINI_UNESCAPED_SIZE(size)); + } + + cmark_strbuf_put(ob, src + org, i - org); + } + + /* escaping */ + if (i >= size) + break; + + i++; + + ent = houdini_unescape_ent(ob, src + i, size - i); + i += ent; + + /* not really an entity */ + if (ent == 0) + cmark_strbuf_putc(ob, '&'); + } + + return 1; +} + +void houdini_unescape_html_f(cmark_strbuf *ob, const uint8_t *src, + bufsize_t size) { + if (!houdini_unescape_html(ob, src, size)) + cmark_strbuf_put(ob, src, size); +} diff --git a/lib/cmark/src/html.c b/lib/cmark/src/html.c new file mode 100644 index 0000000..c69ffb6 --- /dev/null +++ b/lib/cmark/src/html.c @@ -0,0 +1,341 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <assert.h> +#include "cmark_ctype.h" +#include "config.h" +#include "cmark.h" +#include "node.h" +#include "buffer.h" +#include "houdini.h" +#include "scanners.h" + +#define BUFFER_SIZE 100 + +// Functions to convert cmark_nodes to HTML strings. + +static void escape_html(cmark_strbuf *dest, const unsigned char *source, + bufsize_t length) { + houdini_escape_html0(dest, source, length, 0); +} + +static CMARK_INLINE void cr(cmark_strbuf *html) { + if (html->size && html->ptr[html->size - 1] != '\n') + cmark_strbuf_putc(html, '\n'); +} + +struct render_state { + cmark_strbuf *html; + cmark_node *plain; +}; + +static void S_render_sourcepos(cmark_node *node, cmark_strbuf *html, + int options) { + char buffer[BUFFER_SIZE]; + if (CMARK_OPT_SOURCEPOS & options) { + snprintf(buffer, BUFFER_SIZE, " data-sourcepos=\"%d:%d-%d:%d\"", + cmark_node_get_start_line(node), cmark_node_get_start_column(node), + cmark_node_get_end_line(node), cmark_node_get_end_column(node)); + cmark_strbuf_puts(html, buffer); + } +} + +static int S_render_node(cmark_node *node, cmark_event_type ev_type, + struct render_state *state, int options) { + cmark_node *parent; + cmark_node *grandparent; + cmark_strbuf *html = state->html; + char start_heading[] = "<h0"; + char end_heading[] = "</h0"; + bool tight; + char buffer[BUFFER_SIZE]; + + bool entering = (ev_type == CMARK_EVENT_ENTER); + + if (state->plain == node) { // back at original node + state->plain = NULL; + } + + if (state->plain != NULL) { + switch (node->type) { + case CMARK_NODE_TEXT: + case CMARK_NODE_CODE: + case CMARK_NODE_HTML_INLINE: + escape_html(html, node->data, node->len); + break; + + case CMARK_NODE_LINEBREAK: + case CMARK_NODE_SOFTBREAK: + cmark_strbuf_putc(html, ' '); + break; + + default: + break; + } + return 1; + } + + switch (node->type) { + case CMARK_NODE_DOCUMENT: + break; + + case CMARK_NODE_BLOCK_QUOTE: + if (entering) { + cr(html); + cmark_strbuf_puts(html, "<blockquote"); + S_render_sourcepos(node, html, options); + cmark_strbuf_puts(html, ">\n"); + } else { + cr(html); + cmark_strbuf_puts(html, "</blockquote>\n"); + } + break; + + case CMARK_NODE_LIST: { + cmark_list_type list_type = (cmark_list_type)node->as.list.list_type; + int start = node->as.list.start; + + if (entering) { + cr(html); + if (list_type == CMARK_BULLET_LIST) { + cmark_strbuf_puts(html, "<ul"); + S_render_sourcepos(node, html, options); + cmark_strbuf_puts(html, ">\n"); + } else if (start == 1) { + cmark_strbuf_puts(html, "<ol"); + S_render_sourcepos(node, html, options); + cmark_strbuf_puts(html, ">\n"); + } else { + snprintf(buffer, BUFFER_SIZE, "<ol start=\"%d\"", start); + cmark_strbuf_puts(html, buffer); + S_render_sourcepos(node, html, options); + cmark_strbuf_puts(html, ">\n"); + } + } else { + cmark_strbuf_puts(html, + list_type == CMARK_BULLET_LIST ? "</ul>\n" : "</ol>\n"); + } + break; + } + + case CMARK_NODE_ITEM: + if (entering) { + cr(html); + cmark_strbuf_puts(html, "<li"); + S_render_sourcepos(node, html, options); + cmark_strbuf_putc(html, '>'); + } else { + cmark_strbuf_puts(html, "</li>\n"); + } + break; + + case CMARK_NODE_HEADING: + if (entering) { + cr(html); + start_heading[2] = (char)('0' + node->as.heading.level); + cmark_strbuf_puts(html, start_heading); + S_render_sourcepos(node, html, options); + cmark_strbuf_putc(html, '>'); + } else { + end_heading[3] = (char)('0' + node->as.heading.level); + cmark_strbuf_puts(html, end_heading); + cmark_strbuf_puts(html, ">\n"); + } + break; + + case CMARK_NODE_CODE_BLOCK: + cr(html); + + if (node->as.code.info == NULL || node->as.code.info[0] == 0) { + cmark_strbuf_puts(html, "<pre"); + S_render_sourcepos(node, html, options); + cmark_strbuf_puts(html, "><code>"); + } else { + bufsize_t first_tag = 0; + while (node->as.code.info[first_tag] && + !cmark_isspace(node->as.code.info[first_tag])) { + first_tag += 1; + } + + cmark_strbuf_puts(html, "<pre"); + S_render_sourcepos(node, html, options); + cmark_strbuf_puts(html, "><code class=\"language-"); + escape_html(html, node->as.code.info, first_tag); + cmark_strbuf_puts(html, "\">"); + } + + escape_html(html, node->data, node->len); + cmark_strbuf_puts(html, "</code></pre>\n"); + break; + + case CMARK_NODE_HTML_BLOCK: + cr(html); + if (!(options & CMARK_OPT_UNSAFE)) { + cmark_strbuf_puts(html, "<!-- raw HTML omitted -->"); + } else { + cmark_strbuf_put(html, node->data, node->len); + } + cr(html); + break; + + case CMARK_NODE_CUSTOM_BLOCK: { + unsigned char *block = entering ? node->as.custom.on_enter : + node->as.custom.on_exit; + cr(html); + if (block) { + cmark_strbuf_puts(html, (char *)block); + } + cr(html); + break; + } + + case CMARK_NODE_THEMATIC_BREAK: + cr(html); + cmark_strbuf_puts(html, "<hr"); + S_render_sourcepos(node, html, options); + cmark_strbuf_puts(html, " />\n"); + break; + + case CMARK_NODE_PARAGRAPH: + parent = cmark_node_parent(node); + grandparent = cmark_node_parent(parent); + if (grandparent != NULL && grandparent->type == CMARK_NODE_LIST) { + tight = grandparent->as.list.tight; + } else { + tight = false; + } + if (!tight) { + if (entering) { + cr(html); + cmark_strbuf_puts(html, "<p"); + S_render_sourcepos(node, html, options); + cmark_strbuf_putc(html, '>'); + } else { + cmark_strbuf_puts(html, "</p>\n"); + } + } + break; + + case CMARK_NODE_TEXT: + escape_html(html, node->data, node->len); + break; + + case CMARK_NODE_LINEBREAK: + cmark_strbuf_puts(html, "<br />\n"); + break; + + case CMARK_NODE_SOFTBREAK: + if (options & CMARK_OPT_HARDBREAKS) { + cmark_strbuf_puts(html, "<br />\n"); + } else if (options & CMARK_OPT_NOBREAKS) { + cmark_strbuf_putc(html, ' '); + } else { + cmark_strbuf_putc(html, '\n'); + } + break; + + case CMARK_NODE_CODE: + cmark_strbuf_puts(html, "<code>"); + escape_html(html, node->data, node->len); + cmark_strbuf_puts(html, "</code>"); + break; + + case CMARK_NODE_HTML_INLINE: + if (!(options & CMARK_OPT_UNSAFE)) { + cmark_strbuf_puts(html, "<!-- raw HTML omitted -->"); + } else { + cmark_strbuf_put(html, node->data, node->len); + } + break; + + case CMARK_NODE_CUSTOM_INLINE: { + unsigned char *block = entering ? node->as.custom.on_enter : + node->as.custom.on_exit; + if (block) { + cmark_strbuf_puts(html, (char *)block); + } + break; + } + + case CMARK_NODE_STRONG: + if (entering) { + cmark_strbuf_puts(html, "<strong>"); + } else { + cmark_strbuf_puts(html, "</strong>"); + } + break; + + case CMARK_NODE_EMPH: + if (entering) { + cmark_strbuf_puts(html, "<em>"); + } else { + cmark_strbuf_puts(html, "</em>"); + } + break; + + case CMARK_NODE_LINK: + if (entering) { + cmark_strbuf_puts(html, "<a href=\""); + if ((options & CMARK_OPT_UNSAFE) || + !(_scan_dangerous_url(node->as.link.url))) { + houdini_escape_href(html, node->as.link.url, + strlen((char *)node->as.link.url)); + } + if (node->as.link.title) { + cmark_strbuf_puts(html, "\" title=\""); + escape_html(html, node->as.link.title, + strlen((char *)node->as.link.title)); + } + cmark_strbuf_puts(html, "\">"); + } else { + cmark_strbuf_puts(html, "</a>"); + } + break; + + case CMARK_NODE_IMAGE: + if (entering) { + cmark_strbuf_puts(html, "<img src=\""); + if ((options & CMARK_OPT_UNSAFE) || + !(_scan_dangerous_url(node->as.link.url))) { + houdini_escape_href(html, node->as.link.url, + strlen((char *)node->as.link.url)); + } + cmark_strbuf_puts(html, "\" alt=\""); + state->plain = node; + } else { + if (node->as.link.title) { + cmark_strbuf_puts(html, "\" title=\""); + escape_html(html, node->as.link.title, + strlen((char *)node->as.link.title)); + } + + cmark_strbuf_puts(html, "\" />"); + } + break; + + default: + assert(false); + break; + } + + // cmark_strbuf_putc(html, 'x'); + return 1; +} + +char *cmark_render_html(cmark_node *root, int options) { + char *result; + cmark_strbuf html = CMARK_BUF_INIT(root->mem); + cmark_event_type ev_type; + cmark_node *cur; + struct render_state state = {&html, NULL}; + cmark_iter *iter = cmark_iter_new(root); + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + S_render_node(cur, ev_type, &state, options); + } + result = (char *)cmark_strbuf_detach(&html); + + cmark_iter_free(iter); + return result; +} diff --git a/lib/cmark/src/inlines.c b/lib/cmark/src/inlines.c new file mode 100644 index 0000000..5b2edc6 --- /dev/null +++ b/lib/cmark/src/inlines.c @@ -0,0 +1,1391 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include "cmark_ctype.h" +#include "config.h" +#include "node.h" +#include "parser.h" +#include "references.h" +#include "cmark.h" +#include "houdini.h" +#include "utf8.h" +#include "scanners.h" +#include "inlines.h" + +static const char *EMDASH = "\xE2\x80\x94"; +static const char *ENDASH = "\xE2\x80\x93"; +static const char *ELLIPSES = "\xE2\x80\xA6"; +static const char *LEFTDOUBLEQUOTE = "\xE2\x80\x9C"; +static const char *RIGHTDOUBLEQUOTE = "\xE2\x80\x9D"; +static const char *LEFTSINGLEQUOTE = "\xE2\x80\x98"; +static const char *RIGHTSINGLEQUOTE = "\xE2\x80\x99"; + +// Macros for creating various kinds of simple. +#define make_linebreak(mem) make_simple(mem, CMARK_NODE_LINEBREAK) +#define make_softbreak(mem) make_simple(mem, CMARK_NODE_SOFTBREAK) +#define make_emph(mem) make_simple(mem, CMARK_NODE_EMPH) +#define make_strong(mem) make_simple(mem, CMARK_NODE_STRONG) + +#define MAXBACKTICKS 1000 + +typedef struct delimiter { + struct delimiter *previous; + struct delimiter *next; + cmark_node *inl_text; + bufsize_t length; + unsigned char delim_char; + bool can_open; + bool can_close; +} delimiter; + +typedef struct bracket { + struct bracket *previous; + struct delimiter *previous_delimiter; + cmark_node *inl_text; + bufsize_t position; + bool image; + bool active; + bool bracket_after; +} bracket; + +typedef struct { + cmark_mem *mem; + cmark_chunk input; + int line; + bufsize_t pos; + int block_offset; + int column_offset; + cmark_reference_map *refmap; + delimiter *last_delim; + bracket *last_bracket; + bufsize_t backticks[MAXBACKTICKS + 1]; + bool scanned_for_backticks; +} subject; + +static CMARK_INLINE bool S_is_line_end_char(char c) { + return (c == '\n' || c == '\r'); +} + +static delimiter *S_insert_emph(subject *subj, delimiter *opener, + delimiter *closer); + +static int parse_inline(subject *subj, cmark_node *parent, int options); + +static void subject_from_buf(cmark_mem *mem, int line_number, int block_offset, subject *e, + cmark_chunk *chunk, cmark_reference_map *refmap); +static bufsize_t subject_find_special_char(subject *subj, int options); + +// Create an inline with a literal string value. +static CMARK_INLINE cmark_node *make_literal(subject *subj, cmark_node_type t, + int start_column, int end_column) { + cmark_node *e = (cmark_node *)subj->mem->calloc(1, sizeof(*e)); + e->mem = subj->mem; + e->type = (uint16_t)t; + e->start_line = e->end_line = subj->line; + // columns are 1 based. + e->start_column = start_column + 1 + subj->column_offset + subj->block_offset; + e->end_column = end_column + 1 + subj->column_offset + subj->block_offset; + return e; +} + +// Create an inline with no value. +static CMARK_INLINE cmark_node *make_simple(cmark_mem *mem, cmark_node_type t) { + cmark_node *e = (cmark_node *)mem->calloc(1, sizeof(*e)); + e->mem = mem; + e->type = t; + return e; +} + +static cmark_node *make_str(subject *subj, int sc, int ec, cmark_chunk s) { + cmark_node *e = make_literal(subj, CMARK_NODE_TEXT, sc, ec); + e->data = (unsigned char *)subj->mem->realloc(NULL, s.len + 1); + if (s.data != NULL) { + memcpy(e->data, s.data, s.len); + } + e->data[s.len] = 0; + e->len = s.len; + return e; +} + +static cmark_node *make_str_from_buf(subject *subj, int sc, int ec, + cmark_strbuf *buf) { + cmark_node *e = make_literal(subj, CMARK_NODE_TEXT, sc, ec); + e->len = buf->size; + e->data = cmark_strbuf_detach(buf); + return e; +} + +// Like make_str, but parses entities. +static cmark_node *make_str_with_entities(subject *subj, + int start_column, int end_column, + cmark_chunk *content) { + cmark_strbuf unescaped = CMARK_BUF_INIT(subj->mem); + + if (houdini_unescape_html(&unescaped, content->data, content->len)) { + return make_str_from_buf(subj, start_column, end_column, &unescaped); + } else { + return make_str(subj, start_column, end_column, *content); + } +} + +// Duplicate a chunk by creating a copy of the buffer not by reusing the +// buffer like cmark_chunk_dup does. +static unsigned char *cmark_strdup(cmark_mem *mem, unsigned char *src) { + if (src == NULL) { + return NULL; + } + size_t len = strlen((char *)src); + unsigned char *data = (unsigned char *)mem->realloc(NULL, len + 1); + memcpy(data, src, len + 1); + return data; +} + +static unsigned char *cmark_clean_autolink(cmark_mem *mem, cmark_chunk *url, + int is_email) { + cmark_strbuf buf = CMARK_BUF_INIT(mem); + + cmark_chunk_trim(url); + + if (is_email) + cmark_strbuf_puts(&buf, "mailto:"); + + houdini_unescape_html_f(&buf, url->data, url->len); + return cmark_strbuf_detach(&buf); +} + +static CMARK_INLINE cmark_node *make_autolink(subject *subj, + int start_column, int end_column, + cmark_chunk url, int is_email) { + cmark_node *link = make_simple(subj->mem, CMARK_NODE_LINK); + link->as.link.url = cmark_clean_autolink(subj->mem, &url, is_email); + link->as.link.title = NULL; + link->start_line = link->end_line = subj->line; + link->start_column = start_column + 1; + link->end_column = end_column + 1; + cmark_node_append_child(link, make_str_with_entities(subj, start_column + 1, end_column - 1, &url)); + return link; +} + +static void subject_from_buf(cmark_mem *mem, int line_number, int block_offset, subject *e, + cmark_chunk *chunk, cmark_reference_map *refmap) { + int i; + e->mem = mem; + e->input = *chunk; + e->line = line_number; + e->pos = 0; + e->block_offset = block_offset; + e->column_offset = 0; + e->refmap = refmap; + e->last_delim = NULL; + e->last_bracket = NULL; + for (i = 0; i <= MAXBACKTICKS; i++) { + e->backticks[i] = 0; + } + e->scanned_for_backticks = false; +} + +static CMARK_INLINE int isbacktick(int c) { return (c == '`'); } + +static CMARK_INLINE unsigned char peek_char(subject *subj) { + // NULL bytes should have been stripped out by now. If they're + // present, it's a programming error: + assert(!(subj->pos < subj->input.len && subj->input.data[subj->pos] == 0)); + return (subj->pos < subj->input.len) ? subj->input.data[subj->pos] : 0; +} + +static CMARK_INLINE unsigned char peek_at(subject *subj, bufsize_t pos) { + return subj->input.data[pos]; +} + +// Return true if there are more characters in the subject. +static CMARK_INLINE int is_eof(subject *subj) { + return (subj->pos >= subj->input.len); +} + +// Advance the subject. Doesn't check for eof. +#define advance(subj) (subj)->pos += 1 + +static CMARK_INLINE bool skip_spaces(subject *subj) { + bool skipped = false; + while (peek_char(subj) == ' ' || peek_char(subj) == '\t') { + advance(subj); + skipped = true; + } + return skipped; +} + +static CMARK_INLINE bool skip_line_end(subject *subj) { + bool seen_line_end_char = false; + if (peek_char(subj) == '\r') { + advance(subj); + seen_line_end_char = true; + } + if (peek_char(subj) == '\n') { + advance(subj); + seen_line_end_char = true; + } + return seen_line_end_char || is_eof(subj); +} + +// Take characters while a predicate holds, and return a string. +static CMARK_INLINE cmark_chunk take_while(subject *subj, int (*f)(int)) { + unsigned char c; + bufsize_t startpos = subj->pos; + bufsize_t len = 0; + + while ((c = peek_char(subj)) && (*f)(c)) { + advance(subj); + len++; + } + + return cmark_chunk_dup(&subj->input, startpos, len); +} + +// Return the number of newlines in a given span of text in a subject. If +// the number is greater than zero, also return the number of characters +// between the last newline and the end of the span in `since_newline`. +static int count_newlines(subject *subj, bufsize_t from, bufsize_t len, int *since_newline) { + int nls = 0; + int since_nl = 0; + + while (len--) { + if (subj->input.data[from++] == '\n') { + ++nls; + since_nl = 0; + } else { + ++since_nl; + } + } + + if (!nls) + return 0; + + *since_newline = since_nl; + return nls; +} + +// Adjust `node`'s `end_line`, `end_column`, and `subj`'s `line` and +// `column_offset` according to the number of newlines in a just-matched span +// of text in `subj`. +static void adjust_subj_node_newlines(subject *subj, cmark_node *node, int matchlen, int extra, int options) { + if (!(options & CMARK_OPT_SOURCEPOS)) { + return; + } + + int since_newline; + int newlines = count_newlines(subj, subj->pos - matchlen - extra, matchlen, &since_newline); + if (newlines) { + subj->line += newlines; + node->end_line += newlines; + node->end_column = since_newline; + subj->column_offset = -subj->pos + since_newline + extra; + } +} + +// Try to process a backtick code span that began with a +// span of ticks of length openticklength length (already +// parsed). Return 0 if you don't find matching closing +// backticks, otherwise return the position in the subject +// after the closing backticks. +static bufsize_t scan_to_closing_backticks(subject *subj, + bufsize_t openticklength) { + + bool found = false; + if (openticklength > MAXBACKTICKS) { + // we limit backtick string length because of the array subj->backticks: + return 0; + } + if (subj->scanned_for_backticks && + subj->backticks[openticklength] <= subj->pos) { + // return if we already know there's no closer + return 0; + } + while (!found) { + // read non backticks + unsigned char c; + while ((c = peek_char(subj)) && c != '`') { + advance(subj); + } + if (is_eof(subj)) { + break; + } + bufsize_t numticks = 0; + while (peek_char(subj) == '`') { + advance(subj); + numticks++; + } + // store position of ender + if (numticks <= MAXBACKTICKS) { + subj->backticks[numticks] = subj->pos - numticks; + } + if (numticks == openticklength) { + return (subj->pos); + } + } + // got through whole input without finding closer + subj->scanned_for_backticks = true; + return 0; +} + +// Destructively modify string, converting newlines to +// spaces, then removing a single leading + trailing space, +// unless the code span consists entirely of space characters. +static void S_normalize_code(cmark_strbuf *s) { + bufsize_t r, w; + bool contains_nonspace = false; + + for (r = 0, w = 0; r < s->size; ++r) { + switch (s->ptr[r]) { + case '\r': + if (s->ptr[r + 1] != '\n') { + s->ptr[w++] = ' '; + } + break; + case '\n': + s->ptr[w++] = ' '; + break; + default: + s->ptr[w++] = s->ptr[r]; + } + if (s->ptr[r] != ' ') { + contains_nonspace = true; + } + } + + // begins and ends with space? + if (contains_nonspace && + s->ptr[0] == ' ' && s->ptr[w - 1] == ' ') { + cmark_strbuf_drop(s, 1); + cmark_strbuf_truncate(s, w - 2); + } else { + cmark_strbuf_truncate(s, w); + } + +} + + +// Parse backtick code section or raw backticks, return an inline. +// Assumes that the subject has a backtick at the current position. +static cmark_node *handle_backticks(subject *subj, int options) { + cmark_chunk openticks = take_while(subj, isbacktick); + bufsize_t startpos = subj->pos; + bufsize_t endpos = scan_to_closing_backticks(subj, openticks.len); + + if (endpos == 0) { // not found + subj->pos = startpos; // rewind + return make_str(subj, subj->pos, subj->pos, openticks); + } else { + cmark_strbuf buf = CMARK_BUF_INIT(subj->mem); + + cmark_strbuf_set(&buf, subj->input.data + startpos, + endpos - startpos - openticks.len); + S_normalize_code(&buf); + + cmark_node *node = make_literal(subj, CMARK_NODE_CODE, startpos, + endpos - openticks.len - 1); + node->len = buf.size; + node->data = cmark_strbuf_detach(&buf); + adjust_subj_node_newlines(subj, node, endpos - startpos, openticks.len, options); + return node; + } +} + + +// Scan ***, **, or * and return number scanned, or 0. +// Advances position. +static int scan_delims(subject *subj, unsigned char c, bool *can_open, + bool *can_close) { + int numdelims = 0; + bufsize_t before_char_pos; + int32_t after_char = 0; + int32_t before_char = 0; + int len; + bool left_flanking, right_flanking; + + if (subj->pos == 0) { + before_char = 10; + } else { + before_char_pos = subj->pos - 1; + // walk back to the beginning of the UTF_8 sequence: + while (peek_at(subj, before_char_pos) >> 6 == 2 && before_char_pos > 0) { + before_char_pos -= 1; + } + len = cmark_utf8proc_iterate(subj->input.data + before_char_pos, + subj->pos - before_char_pos, &before_char); + if (len == -1) { + before_char = 10; + } + } + + if (c == '\'' || c == '"') { + numdelims++; + advance(subj); // limit to 1 delim for quotes + } else { + while (peek_char(subj) == c) { + numdelims++; + advance(subj); + } + } + + len = cmark_utf8proc_iterate(subj->input.data + subj->pos, + subj->input.len - subj->pos, &after_char); + if (len == -1) { + after_char = 10; + } + left_flanking = numdelims > 0 && !cmark_utf8proc_is_space(after_char) && + (!cmark_utf8proc_is_punctuation(after_char) || + cmark_utf8proc_is_space(before_char) || + cmark_utf8proc_is_punctuation(before_char)); + right_flanking = numdelims > 0 && !cmark_utf8proc_is_space(before_char) && + (!cmark_utf8proc_is_punctuation(before_char) || + cmark_utf8proc_is_space(after_char) || + cmark_utf8proc_is_punctuation(after_char)); + if (c == '_') { + *can_open = left_flanking && + (!right_flanking || cmark_utf8proc_is_punctuation(before_char)); + *can_close = right_flanking && + (!left_flanking || cmark_utf8proc_is_punctuation(after_char)); + } else if (c == '\'' || c == '"') { + *can_open = left_flanking && + (!right_flanking || before_char == '(' || before_char == '[') && + before_char != ']' && before_char != ')'; + *can_close = right_flanking; + } else { + *can_open = left_flanking; + *can_close = right_flanking; + } + return numdelims; +} + +/* +static void print_delimiters(subject *subj) +{ + delimiter *delim; + delim = subj->last_delim; + while (delim != NULL) { + printf("Item at stack pos %p: %d %d %d next(%p) prev(%p)\n", + (void*)delim, delim->delim_char, + delim->can_open, delim->can_close, + (void*)delim->next, (void*)delim->previous); + delim = delim->previous; + } +} +*/ + +static void remove_delimiter(subject *subj, delimiter *delim) { + if (delim == NULL) + return; + if (delim->next == NULL) { + // end of list: + assert(delim == subj->last_delim); + subj->last_delim = delim->previous; + } else { + delim->next->previous = delim->previous; + } + if (delim->previous != NULL) { + delim->previous->next = delim->next; + } + subj->mem->free(delim); +} + +static void pop_bracket(subject *subj) { + bracket *b; + if (subj->last_bracket == NULL) + return; + b = subj->last_bracket; + subj->last_bracket = subj->last_bracket->previous; + subj->mem->free(b); +} + +static void push_delimiter(subject *subj, unsigned char c, bool can_open, + bool can_close, cmark_node *inl_text) { + delimiter *delim = (delimiter *)subj->mem->calloc(1, sizeof(delimiter)); + delim->delim_char = c; + delim->can_open = can_open; + delim->can_close = can_close; + delim->inl_text = inl_text; + delim->length = inl_text->len; + delim->previous = subj->last_delim; + delim->next = NULL; + if (delim->previous != NULL) { + delim->previous->next = delim; + } + subj->last_delim = delim; +} + +static void push_bracket(subject *subj, bool image, cmark_node *inl_text) { + bracket *b = (bracket *)subj->mem->calloc(1, sizeof(bracket)); + if (subj->last_bracket != NULL) { + subj->last_bracket->bracket_after = true; + } + b->image = image; + b->active = true; + b->inl_text = inl_text; + b->previous = subj->last_bracket; + b->previous_delimiter = subj->last_delim; + b->position = subj->pos; + b->bracket_after = false; + subj->last_bracket = b; +} + +// Assumes the subject has a c at the current position. +static cmark_node *handle_delim(subject *subj, unsigned char c, bool smart) { + bufsize_t numdelims; + cmark_node *inl_text; + bool can_open, can_close; + cmark_chunk contents; + + numdelims = scan_delims(subj, c, &can_open, &can_close); + + if (c == '\'' && smart) { + contents = cmark_chunk_literal(RIGHTSINGLEQUOTE); + } else if (c == '"' && smart) { + contents = + cmark_chunk_literal(can_close ? RIGHTDOUBLEQUOTE : LEFTDOUBLEQUOTE); + } else { + contents = cmark_chunk_dup(&subj->input, subj->pos - numdelims, numdelims); + } + + inl_text = make_str(subj, subj->pos - numdelims, subj->pos - 1, contents); + + if ((can_open || can_close) && (!(c == '\'' || c == '"') || smart)) { + push_delimiter(subj, c, can_open, can_close, inl_text); + } + + return inl_text; +} + +// Assumes we have a hyphen at the current position. +static cmark_node *handle_hyphen(subject *subj, bool smart) { + int startpos = subj->pos; + + advance(subj); + + if (!smart || peek_char(subj) != '-') { + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("-")); + } + + while (smart && peek_char(subj) == '-') { + advance(subj); + } + + int numhyphens = subj->pos - startpos; + int en_count = 0; + int em_count = 0; + int i; + cmark_strbuf buf = CMARK_BUF_INIT(subj->mem); + + if (numhyphens % 3 == 0) { // if divisible by 3, use all em dashes + em_count = numhyphens / 3; + } else if (numhyphens % 2 == 0) { // if divisible by 2, use all en dashes + en_count = numhyphens / 2; + } else if (numhyphens % 3 == 2) { // use one en dash at end + en_count = 1; + em_count = (numhyphens - 2) / 3; + } else { // use two en dashes at the end + en_count = 2; + em_count = (numhyphens - 4) / 3; + } + + for (i = em_count; i > 0; i--) { + cmark_strbuf_puts(&buf, EMDASH); + } + + for (i = en_count; i > 0; i--) { + cmark_strbuf_puts(&buf, ENDASH); + } + + return make_str_from_buf(subj, startpos, subj->pos - 1, &buf); +} + +// Assumes we have a period at the current position. +static cmark_node *handle_period(subject *subj, bool smart) { + advance(subj); + if (smart && peek_char(subj) == '.') { + advance(subj); + if (peek_char(subj) == '.') { + advance(subj); + return make_str(subj, subj->pos - 3, subj->pos - 1, cmark_chunk_literal(ELLIPSES)); + } else { + return make_str(subj, subj->pos - 2, subj->pos - 1, cmark_chunk_literal("..")); + } + } else { + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal(".")); + } +} + +static void process_emphasis(subject *subj, delimiter *stack_bottom) { + delimiter *closer = subj->last_delim; + delimiter *opener; + delimiter *old_closer; + bool opener_found; + int openers_bottom_index = 0; + delimiter *openers_bottom[6] = {stack_bottom, stack_bottom, stack_bottom, + stack_bottom, stack_bottom, stack_bottom}; + + // move back to first relevant delim. + while (closer != NULL && closer->previous != stack_bottom) { + closer = closer->previous; + } + + // now move forward, looking for closers, and handling each + while (closer != NULL) { + if (closer->can_close) { + switch (closer->delim_char) { + case '"': + openers_bottom_index = 0; + break; + case '\'': + openers_bottom_index = 1; + break; + case '_': + openers_bottom_index = 2; + break; + case '*': + openers_bottom_index = 3 + (closer->length % 3); + break; + default: + assert(false); + } + + // Now look backwards for first matching opener: + opener = closer->previous; + opener_found = false; + while (opener != NULL && opener != openers_bottom[openers_bottom_index]) { + if (opener->can_open && opener->delim_char == closer->delim_char) { + // interior closer of size 2 can't match opener of size 1 + // or of size 1 can't match 2 + if (!(closer->can_open || opener->can_close) || + closer->length % 3 == 0 || + (opener->length + closer->length) % 3 != 0) { + opener_found = true; + break; + } + } + opener = opener->previous; + } + old_closer = closer; + if (closer->delim_char == '*' || closer->delim_char == '_') { + if (opener_found) { + closer = S_insert_emph(subj, opener, closer); + } else { + closer = closer->next; + } + } else if (closer->delim_char == '\'') { + cmark_node_set_literal(closer->inl_text, RIGHTSINGLEQUOTE); + if (opener_found) { + cmark_node_set_literal(opener->inl_text, LEFTSINGLEQUOTE); + } + closer = closer->next; + } else if (closer->delim_char == '"') { + cmark_node_set_literal(closer->inl_text, RIGHTDOUBLEQUOTE); + if (opener_found) { + cmark_node_set_literal(opener->inl_text, LEFTDOUBLEQUOTE); + } + closer = closer->next; + } + if (!opener_found) { + // set lower bound for future searches for openers + openers_bottom[openers_bottom_index] = old_closer->previous; + if (!old_closer->can_open) { + // we can remove a closer that can't be an + // opener, once we've seen there's no + // matching opener: + remove_delimiter(subj, old_closer); + } + } + } else { + closer = closer->next; + } + } + // free all delimiters in list until stack_bottom: + while (subj->last_delim != NULL && subj->last_delim != stack_bottom) { + remove_delimiter(subj, subj->last_delim); + } +} + +static delimiter *S_insert_emph(subject *subj, delimiter *opener, + delimiter *closer) { + delimiter *delim, *tmp_delim; + bufsize_t use_delims; + cmark_node *opener_inl = opener->inl_text; + cmark_node *closer_inl = closer->inl_text; + bufsize_t opener_num_chars = opener_inl->len; + bufsize_t closer_num_chars = closer_inl->len; + cmark_node *tmp, *tmpnext, *emph; + + // calculate the actual number of characters used from this closer + use_delims = (closer_num_chars >= 2 && opener_num_chars >= 2) ? 2 : 1; + + // remove used characters from associated inlines. + opener_num_chars -= use_delims; + closer_num_chars -= use_delims; + opener_inl->len = opener_num_chars; + opener_inl->data[opener_num_chars] = 0; + closer_inl->len = closer_num_chars; + closer_inl->data[closer_num_chars] = 0; + + // free delimiters between opener and closer + delim = closer->previous; + while (delim != NULL && delim != opener) { + tmp_delim = delim->previous; + remove_delimiter(subj, delim); + delim = tmp_delim; + } + + // create new emph or strong, and splice it in to our inlines + // between the opener and closer + emph = use_delims == 1 ? make_emph(subj->mem) : make_strong(subj->mem); + + tmp = opener_inl->next; + while (tmp && tmp != closer_inl) { + tmpnext = tmp->next; + cmark_node_append_child(emph, tmp); + tmp = tmpnext; + } + cmark_node_insert_after(opener_inl, emph); + + emph->start_line = opener_inl->start_line; + emph->end_line = closer_inl->end_line; + emph->start_column = opener_inl->start_column; + emph->end_column = closer_inl->end_column; + + // if opener has 0 characters, remove it and its associated inline + if (opener_num_chars == 0) { + cmark_node_free(opener_inl); + remove_delimiter(subj, opener); + } + + // if closer has 0 characters, remove it and its associated inline + if (closer_num_chars == 0) { + // remove empty closer inline + cmark_node_free(closer_inl); + // remove closer from list + tmp_delim = closer->next; + remove_delimiter(subj, closer); + closer = tmp_delim; + } + + return closer; +} + +// Parse backslash-escape or just a backslash, returning an inline. +static cmark_node *handle_backslash(subject *subj) { + advance(subj); + unsigned char nextchar = peek_char(subj); + if (cmark_ispunct( + nextchar)) { // only ascii symbols and newline can be escaped + advance(subj); + return make_str(subj, subj->pos - 2, subj->pos - 1, cmark_chunk_dup(&subj->input, subj->pos - 1, 1)); + } else if (!is_eof(subj) && skip_line_end(subj)) { + return make_linebreak(subj->mem); + } else { + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("\\")); + } +} + +// Parse an entity or a regular "&" string. +// Assumes the subject has an '&' character at the current position. +static cmark_node *handle_entity(subject *subj) { + cmark_strbuf ent = CMARK_BUF_INIT(subj->mem); + bufsize_t len; + + advance(subj); + + len = houdini_unescape_ent(&ent, subj->input.data + subj->pos, + subj->input.len - subj->pos); + + if (len <= 0) + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("&")); + + subj->pos += len; + return make_str_from_buf(subj, subj->pos - 1 - len, subj->pos - 1, &ent); +} + +// Clean a URL: remove surrounding whitespace, and remove \ that escape +// punctuation. +unsigned char *cmark_clean_url(cmark_mem *mem, cmark_chunk *url) { + cmark_strbuf buf = CMARK_BUF_INIT(mem); + + cmark_chunk_trim(url); + + houdini_unescape_html_f(&buf, url->data, url->len); + + cmark_strbuf_unescape(&buf); + return cmark_strbuf_detach(&buf); +} + +unsigned char *cmark_clean_title(cmark_mem *mem, cmark_chunk *title) { + cmark_strbuf buf = CMARK_BUF_INIT(mem); + unsigned char first, last; + + if (title->len == 0) { + return NULL; + } + + first = title->data[0]; + last = title->data[title->len - 1]; + + // remove surrounding quotes if any: + if ((first == '\'' && last == '\'') || (first == '(' && last == ')') || + (first == '"' && last == '"')) { + houdini_unescape_html_f(&buf, title->data + 1, title->len - 2); + } else { + houdini_unescape_html_f(&buf, title->data, title->len); + } + + cmark_strbuf_unescape(&buf); + return cmark_strbuf_detach(&buf); +} + +// Parse an autolink or HTML tag. +// Assumes the subject has a '<' character at the current position. +static cmark_node *handle_pointy_brace(subject *subj, int options) { + bufsize_t matchlen = 0; + cmark_chunk contents; + + advance(subj); // advance past first < + + // first try to match a URL autolink + matchlen = scan_autolink_uri(&subj->input, subj->pos); + if (matchlen > 0) { + contents = cmark_chunk_dup(&subj->input, subj->pos, matchlen - 1); + subj->pos += matchlen; + + return make_autolink(subj, subj->pos - 1 - matchlen, subj->pos - 1, contents, 0); + } + + // next try to match an email autolink + matchlen = scan_autolink_email(&subj->input, subj->pos); + if (matchlen > 0) { + contents = cmark_chunk_dup(&subj->input, subj->pos, matchlen - 1); + subj->pos += matchlen; + + return make_autolink(subj, subj->pos - 1 - matchlen, subj->pos - 1, contents, 1); + } + + // finally, try to match an html tag + matchlen = scan_html_tag(&subj->input, subj->pos); + if (matchlen > 0) { + const unsigned char *src = subj->input.data + subj->pos - 1; + bufsize_t len = matchlen + 1; + subj->pos += matchlen; + cmark_node *node = make_literal(subj, CMARK_NODE_HTML_INLINE, + subj->pos - matchlen - 1, subj->pos - 1); + node->data = (unsigned char *)subj->mem->realloc(NULL, len + 1); + memcpy(node->data, src, len); + node->data[len] = 0; + node->len = len; + adjust_subj_node_newlines(subj, node, matchlen, 1, options); + return node; + } + + // if nothing matches, just return the opening <: + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("<")); +} + +// Parse a link label. Returns 1 if successful. +// Note: unescaped brackets are not allowed in labels. +// The label begins with `[` and ends with the first `]` character +// encountered. Backticks in labels do not start code spans. +static int link_label(subject *subj, cmark_chunk *raw_label) { + bufsize_t startpos = subj->pos; + int length = 0; + unsigned char c; + + // advance past [ + if (peek_char(subj) == '[') { + advance(subj); + } else { + return 0; + } + + while ((c = peek_char(subj)) && c != '[' && c != ']') { + if (c == '\\') { + advance(subj); + length++; + if (cmark_ispunct(peek_char(subj))) { + advance(subj); + length++; + } + } else { + advance(subj); + length++; + } + if (length > MAX_LINK_LABEL_LENGTH) { + goto noMatch; + } + } + + if (c == ']') { // match found + *raw_label = + cmark_chunk_dup(&subj->input, startpos + 1, subj->pos - (startpos + 1)); + cmark_chunk_trim(raw_label); + advance(subj); // advance past ] + return 1; + } + +noMatch: + subj->pos = startpos; // rewind + return 0; +} + +static bufsize_t manual_scan_link_url_2(cmark_chunk *input, bufsize_t offset, + cmark_chunk *output) { + bufsize_t i = offset; + size_t nb_p = 0; + + while (i < input->len) { + if (input->data[i] == '\\' && + i + 1 < input-> len && + cmark_ispunct(input->data[i+1])) + i += 2; + else if (input->data[i] == '(') { + ++nb_p; + ++i; + if (nb_p > 32) + return -1; + } else if (input->data[i] == ')') { + if (nb_p == 0) + break; + --nb_p; + ++i; + } else if (cmark_isspace(input->data[i])) { + if (i == offset) { + return -1; + } + break; + } else { + ++i; + } + } + + if (i >= input->len || nb_p != 0) + return -1; + + { + cmark_chunk result = {input->data + offset, i - offset}; + *output = result; + } + return i - offset; +} + +static bufsize_t manual_scan_link_url(cmark_chunk *input, bufsize_t offset, + cmark_chunk *output) { + bufsize_t i = offset; + + if (i < input->len && input->data[i] == '<') { + ++i; + while (i < input->len) { + if (input->data[i] == '>') { + ++i; + break; + } else if (input->data[i] == '\\') + i += 2; + else if (input->data[i] == '\n' || input->data[i] == '<') + return -1; + else + ++i; + } + } else { + return manual_scan_link_url_2(input, offset, output); + } + + if (i >= input->len) + return -1; + + { + cmark_chunk result = {input->data + offset + 1, i - 2 - offset}; + *output = result; + } + return i - offset; +} + +// Return a link, an image, or a literal close bracket. +static cmark_node *handle_close_bracket(subject *subj) { + bufsize_t initial_pos, after_link_text_pos; + bufsize_t endurl, starttitle, endtitle, endall; + bufsize_t sps, n; + cmark_reference *ref = NULL; + cmark_chunk url_chunk, title_chunk; + unsigned char *url, *title; + bracket *opener; + cmark_node *inl; + cmark_chunk raw_label; + int found_label; + cmark_node *tmp, *tmpnext; + bool is_image; + + advance(subj); // advance past ] + initial_pos = subj->pos; + + // get last [ or ![ + opener = subj->last_bracket; + + if (opener == NULL) { + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("]")); + } + + if (!opener->active) { + // take delimiter off stack + pop_bracket(subj); + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("]")); + } + + // If we got here, we matched a potential link/image text. + // Now we check to see if it's a link/image. + is_image = opener->image; + + after_link_text_pos = subj->pos; + + // First, look for an inline link. + if (peek_char(subj) == '(' && + ((sps = scan_spacechars(&subj->input, subj->pos + 1)) > -1) && + ((n = manual_scan_link_url(&subj->input, subj->pos + 1 + sps, + &url_chunk)) > -1)) { + + // try to parse an explicit link: + endurl = subj->pos + 1 + sps + n; + starttitle = endurl + scan_spacechars(&subj->input, endurl); + + // ensure there are spaces btw url and title + endtitle = (starttitle == endurl) + ? starttitle + : starttitle + scan_link_title(&subj->input, starttitle); + + endall = endtitle + scan_spacechars(&subj->input, endtitle); + + if (peek_at(subj, endall) == ')') { + subj->pos = endall + 1; + + title_chunk = + cmark_chunk_dup(&subj->input, starttitle, endtitle - starttitle); + url = cmark_clean_url(subj->mem, &url_chunk); + title = cmark_clean_title(subj->mem, &title_chunk); + cmark_chunk_free(&url_chunk); + cmark_chunk_free(&title_chunk); + goto match; + + } else { + // it could still be a shortcut reference link + subj->pos = after_link_text_pos; + } + } + + // Next, look for a following [link label] that matches in refmap. + // skip spaces + raw_label = cmark_chunk_literal(""); + found_label = link_label(subj, &raw_label); + if (!found_label) { + // If we have a shortcut reference link, back up + // to before the spacse we skipped. + subj->pos = initial_pos; + } + + if ((!found_label || raw_label.len == 0) && !opener->bracket_after) { + cmark_chunk_free(&raw_label); + raw_label = cmark_chunk_dup(&subj->input, opener->position, + initial_pos - opener->position - 1); + found_label = true; + } + + if (found_label) { + ref = cmark_reference_lookup(subj->refmap, &raw_label); + cmark_chunk_free(&raw_label); + } + + if (ref != NULL) { // found + url = cmark_strdup(subj->mem, ref->url); + title = cmark_strdup(subj->mem, ref->title); + goto match; + } else { + goto noMatch; + } + +noMatch: + // If we fall through to here, it means we didn't match a link: + pop_bracket(subj); // remove this opener from delimiter list + subj->pos = initial_pos; + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("]")); + +match: + inl = make_simple(subj->mem, is_image ? CMARK_NODE_IMAGE : CMARK_NODE_LINK); + inl->as.link.url = url; + inl->as.link.title = title; + inl->start_line = inl->end_line = subj->line; + inl->start_column = opener->inl_text->start_column; + inl->end_column = subj->pos + subj->column_offset + subj->block_offset; + cmark_node_insert_before(opener->inl_text, inl); + // Add link text: + tmp = opener->inl_text->next; + while (tmp) { + tmpnext = tmp->next; + cmark_node_append_child(inl, tmp); + tmp = tmpnext; + } + + // Free the bracket [: + cmark_node_free(opener->inl_text); + + process_emphasis(subj, opener->previous_delimiter); + pop_bracket(subj); + + // Now, if we have a link, we also want to deactivate earlier link + // delimiters. (This code can be removed if we decide to allow links + // inside links.) + if (!is_image) { + opener = subj->last_bracket; + while (opener != NULL) { + if (!opener->image) { + if (!opener->active) { + break; + } else { + opener->active = false; + } + } + opener = opener->previous; + } + } + + return NULL; +} + +// Parse a hard or soft linebreak, returning an inline. +// Assumes the subject has a cr or newline at the current position. +static cmark_node *handle_newline(subject *subj) { + bufsize_t nlpos = subj->pos; + // skip over cr, crlf, or lf: + if (peek_at(subj, subj->pos) == '\r') { + advance(subj); + } + if (peek_at(subj, subj->pos) == '\n') { + advance(subj); + } + ++subj->line; + subj->column_offset = -subj->pos; + // skip spaces at beginning of line + skip_spaces(subj); + if (nlpos > 1 && peek_at(subj, nlpos - 1) == ' ' && + peek_at(subj, nlpos - 2) == ' ') { + return make_linebreak(subj->mem); + } else { + return make_softbreak(subj->mem); + } +} + +static bufsize_t subject_find_special_char(subject *subj, int options) { + // "\r\n\\`&_*[]<!" + static const int8_t SPECIAL_CHARS[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + // " ' . - + static const char SMART_PUNCT_CHARS[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + + bufsize_t n = subj->pos + 1; + + while (n < subj->input.len) { + if (SPECIAL_CHARS[subj->input.data[n]]) + return n; + if (options & CMARK_OPT_SMART && SMART_PUNCT_CHARS[subj->input.data[n]]) + return n; + n++; + } + + return subj->input.len; +} + +// Parse an inline, advancing subject, and add it as a child of parent. +// Return 0 if no inline can be parsed, 1 otherwise. +static int parse_inline(subject *subj, cmark_node *parent, int options) { + cmark_node *new_inl = NULL; + cmark_chunk contents; + unsigned char c; + bufsize_t startpos, endpos; + c = peek_char(subj); + if (c == 0) { + return 0; + } + switch (c) { + case '\r': + case '\n': + new_inl = handle_newline(subj); + break; + case '`': + new_inl = handle_backticks(subj, options); + break; + case '\\': + new_inl = handle_backslash(subj); + break; + case '&': + new_inl = handle_entity(subj); + break; + case '<': + new_inl = handle_pointy_brace(subj, options); + break; + case '*': + case '_': + case '\'': + case '"': + new_inl = handle_delim(subj, c, (options & CMARK_OPT_SMART) != 0); + break; + case '-': + new_inl = handle_hyphen(subj, (options & CMARK_OPT_SMART) != 0); + break; + case '.': + new_inl = handle_period(subj, (options & CMARK_OPT_SMART) != 0); + break; + case '[': + advance(subj); + new_inl = make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("[")); + push_bracket(subj, false, new_inl); + break; + case ']': + new_inl = handle_close_bracket(subj); + break; + case '!': + advance(subj); + if (peek_char(subj) == '[') { + advance(subj); + new_inl = make_str(subj, subj->pos - 2, subj->pos - 1, cmark_chunk_literal("![")); + push_bracket(subj, true, new_inl); + } else { + new_inl = make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("!")); + } + break; + default: + endpos = subject_find_special_char(subj, options); + contents = cmark_chunk_dup(&subj->input, subj->pos, endpos - subj->pos); + startpos = subj->pos; + subj->pos = endpos; + + // if we're at a newline, strip trailing spaces. + if (S_is_line_end_char(peek_char(subj))) { + cmark_chunk_rtrim(&contents); + } + + new_inl = make_str(subj, startpos, endpos - 1, contents); + } + if (new_inl != NULL) { + cmark_node_append_child(parent, new_inl); + } + + return 1; +} + +// Parse inlines from parent's string_content, adding as children of parent. +void cmark_parse_inlines(cmark_mem *mem, cmark_node *parent, + cmark_reference_map *refmap, int options) { + subject subj; + cmark_chunk content = {parent->data, parent->len}; + subject_from_buf(mem, parent->start_line, parent->start_column - 1 + parent->internal_offset, &subj, &content, refmap); + cmark_chunk_rtrim(&subj.input); + + while (!is_eof(&subj) && parse_inline(&subj, parent, options)) + ; + + process_emphasis(&subj, NULL); + // free bracket and delim stack + while (subj.last_delim) { + remove_delimiter(&subj, subj.last_delim); + } + while (subj.last_bracket) { + pop_bracket(&subj); + } +} + +// Parse zero or more space characters, including at most one newline. +static void spnl(subject *subj) { + skip_spaces(subj); + if (skip_line_end(subj)) { + skip_spaces(subj); + } +} + +// Parse reference. Assumes string begins with '[' character. +// Modify refmap if a reference is encountered. +// Return 0 if no reference found, otherwise position of subject +// after reference is parsed. +bufsize_t cmark_parse_reference_inline(cmark_mem *mem, cmark_chunk *input, + cmark_reference_map *refmap) { + subject subj; + + cmark_chunk lab; + cmark_chunk url; + cmark_chunk title; + + bufsize_t matchlen = 0; + bufsize_t beforetitle; + + subject_from_buf(mem, -1, 0, &subj, input, NULL); + + // parse label: + if (!link_label(&subj, &lab) || lab.len == 0) + return 0; + + // colon: + if (peek_char(&subj) == ':') { + advance(&subj); + } else { + return 0; + } + + // parse link url: + spnl(&subj); + if ((matchlen = manual_scan_link_url(&subj.input, subj.pos, &url)) > -1) { + subj.pos += matchlen; + } else { + return 0; + } + + // parse optional link_title + beforetitle = subj.pos; + spnl(&subj); + matchlen = subj.pos == beforetitle ? 0 : scan_link_title(&subj.input, subj.pos); + if (matchlen) { + title = cmark_chunk_dup(&subj.input, subj.pos, matchlen); + subj.pos += matchlen; + } else { + subj.pos = beforetitle; + title = cmark_chunk_literal(""); + } + + // parse final spaces and newline: + skip_spaces(&subj); + if (!skip_line_end(&subj)) { + if (matchlen) { // try rewinding before title + subj.pos = beforetitle; + skip_spaces(&subj); + if (!skip_line_end(&subj)) { + return 0; + } + } else { + return 0; + } + } + // insert reference into refmap + cmark_reference_create(refmap, &lab, &url, &title); + return subj.pos; +} diff --git a/lib/cmark/src/inlines.h b/lib/cmark/src/inlines.h new file mode 100644 index 0000000..800ed0c --- /dev/null +++ b/lib/cmark/src/inlines.h @@ -0,0 +1,24 @@ +#ifndef CMARK_INLINES_H +#define CMARK_INLINES_H + +#include "chunk.h" +#include "references.h" + +#ifdef __cplusplus +extern "C" { +#endif + +unsigned char *cmark_clean_url(cmark_mem *mem, cmark_chunk *url); +unsigned char *cmark_clean_title(cmark_mem *mem, cmark_chunk *title); + +void cmark_parse_inlines(cmark_mem *mem, cmark_node *parent, + cmark_reference_map *refmap, int options); + +bufsize_t cmark_parse_reference_inline(cmark_mem *mem, cmark_chunk *input, + cmark_reference_map *refmap); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/iterator.c b/lib/cmark/src/iterator.c new file mode 100644 index 0000000..63cbf9e --- /dev/null +++ b/lib/cmark/src/iterator.c @@ -0,0 +1,122 @@ +#include <assert.h> +#include <stdlib.h> + +#include "config.h" +#include "node.h" +#include "cmark.h" +#include "iterator.h" + +static const int S_leaf_mask = + (1 << CMARK_NODE_HTML_BLOCK) | (1 << CMARK_NODE_THEMATIC_BREAK) | + (1 << CMARK_NODE_CODE_BLOCK) | (1 << CMARK_NODE_TEXT) | + (1 << CMARK_NODE_SOFTBREAK) | (1 << CMARK_NODE_LINEBREAK) | + (1 << CMARK_NODE_CODE) | (1 << CMARK_NODE_HTML_INLINE); + +cmark_iter *cmark_iter_new(cmark_node *root) { + if (root == NULL) { + return NULL; + } + cmark_mem *mem = root->mem; + cmark_iter *iter = (cmark_iter *)mem->calloc(1, sizeof(cmark_iter)); + iter->mem = mem; + iter->root = root; + iter->cur.ev_type = CMARK_EVENT_NONE; + iter->cur.node = NULL; + iter->next.ev_type = CMARK_EVENT_ENTER; + iter->next.node = root; + return iter; +} + +void cmark_iter_free(cmark_iter *iter) { iter->mem->free(iter); } + +static bool S_is_leaf(cmark_node *node) { + return ((1 << node->type) & S_leaf_mask) != 0; +} + +cmark_event_type cmark_iter_next(cmark_iter *iter) { + cmark_event_type ev_type = iter->next.ev_type; + cmark_node *node = iter->next.node; + + iter->cur.ev_type = ev_type; + iter->cur.node = node; + + if (ev_type == CMARK_EVENT_DONE) { + return ev_type; + } + + /* roll forward to next item, setting both fields */ + if (ev_type == CMARK_EVENT_ENTER && !S_is_leaf(node)) { + if (node->first_child == NULL) { + /* stay on this node but exit */ + iter->next.ev_type = CMARK_EVENT_EXIT; + } else { + iter->next.ev_type = CMARK_EVENT_ENTER; + iter->next.node = node->first_child; + } + } else if (node == iter->root) { + /* don't move past root */ + iter->next.ev_type = CMARK_EVENT_DONE; + iter->next.node = NULL; + } else if (node->next) { + iter->next.ev_type = CMARK_EVENT_ENTER; + iter->next.node = node->next; + } else if (node->parent) { + iter->next.ev_type = CMARK_EVENT_EXIT; + iter->next.node = node->parent; + } else { + assert(false); + iter->next.ev_type = CMARK_EVENT_DONE; + iter->next.node = NULL; + } + + return ev_type; +} + +void cmark_iter_reset(cmark_iter *iter, cmark_node *current, + cmark_event_type event_type) { + iter->next.ev_type = event_type; + iter->next.node = current; + cmark_iter_next(iter); +} + +cmark_node *cmark_iter_get_node(cmark_iter *iter) { return iter->cur.node; } + +cmark_event_type cmark_iter_get_event_type(cmark_iter *iter) { + return iter->cur.ev_type; +} + +cmark_node *cmark_iter_get_root(cmark_iter *iter) { return iter->root; } + +void cmark_consolidate_text_nodes(cmark_node *root) { + if (root == NULL) { + return; + } + cmark_iter *iter = cmark_iter_new(root); + cmark_strbuf buf = CMARK_BUF_INIT(iter->mem); + cmark_event_type ev_type; + cmark_node *cur, *tmp, *next; + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + if (ev_type == CMARK_EVENT_ENTER && cur->type == CMARK_NODE_TEXT && + cur->next && cur->next->type == CMARK_NODE_TEXT) { + cmark_strbuf_clear(&buf); + cmark_strbuf_put(&buf, cur->data, cur->len); + tmp = cur->next; + while (tmp && tmp->type == CMARK_NODE_TEXT) { + cmark_iter_next(iter); // advance pointer + cmark_strbuf_put(&buf, tmp->data, tmp->len); + cur->end_column = tmp->end_column; + next = tmp->next; + cmark_node_free(tmp); + tmp = next; + } + iter->mem->free(cur->data); + cur->len = buf.size; + cur->data = cmark_strbuf_detach(&buf); + } + } + + cmark_strbuf_free(&buf); + cmark_iter_free(iter); +} diff --git a/lib/cmark/src/iterator.h b/lib/cmark/src/iterator.h new file mode 100644 index 0000000..30ce76f --- /dev/null +++ b/lib/cmark/src/iterator.h @@ -0,0 +1,26 @@ +#ifndef CMARK_ITERATOR_H +#define CMARK_ITERATOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "cmark.h" + +typedef struct { + cmark_event_type ev_type; + cmark_node *node; +} cmark_iter_state; + +struct cmark_iter { + cmark_mem *mem; + cmark_node *root; + cmark_iter_state cur; + cmark_iter_state next; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/latex.c b/lib/cmark/src/latex.c new file mode 100644 index 0000000..1d4d7bc --- /dev/null +++ b/lib/cmark/src/latex.c @@ -0,0 +1,453 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <assert.h> + +#include "config.h" +#include "cmark.h" +#include "node.h" +#include "buffer.h" +#include "utf8.h" +#include "scanners.h" +#include "render.h" + +#define OUT(s, wrap, escaping) renderer->out(renderer, s, wrap, escaping) +#define LIT(s) renderer->out(renderer, s, false, LITERAL) +#define CR() renderer->cr(renderer) +#define BLANKLINE() renderer->blankline(renderer) +#define LIST_NUMBER_STRING_SIZE 20 + +static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_escaping escape, + int32_t c, unsigned char nextc) { + if (escape == LITERAL) { + cmark_render_code_point(renderer, c); + return; + } + + switch (c) { + case 123: // '{' + case 125: // '}' + case 35: // '#' + case 37: // '%' + case 38: // '&' + cmark_render_ascii(renderer, "\\"); + cmark_render_code_point(renderer, c); + break; + case 36: // '$' + case 95: // '_' + if (escape == NORMAL) { + cmark_render_ascii(renderer, "\\"); + } + cmark_render_code_point(renderer, c); + break; + case 45: // '-' + if (nextc == 45) { // prevent ligature + cmark_render_ascii(renderer, "-{}"); + } else { + cmark_render_ascii(renderer, "-"); + } + break; + case 126: // '~' + if (escape == NORMAL) { + cmark_render_ascii(renderer, "\\textasciitilde{}"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 94: // '^' + cmark_render_ascii(renderer, "\\^{}"); + break; + case 92: // '\\' + if (escape == URL) { + // / acts as path sep even on windows: + cmark_render_ascii(renderer, "/"); + } else { + cmark_render_ascii(renderer, "\\textbackslash{}"); + } + break; + case 124: // '|' + cmark_render_ascii(renderer, "\\textbar{}"); + break; + case 60: // '<' + cmark_render_ascii(renderer, "\\textless{}"); + break; + case 62: // '>' + cmark_render_ascii(renderer, "\\textgreater{}"); + break; + case 91: // '[' + case 93: // ']' + cmark_render_ascii(renderer, "{"); + cmark_render_code_point(renderer, c); + cmark_render_ascii(renderer, "}"); + break; + case 34: // '"' + cmark_render_ascii(renderer, "\\textquotedbl{}"); + // requires \usepackage[T1]{fontenc} + break; + case 39: // '\'' + cmark_render_ascii(renderer, "\\textquotesingle{}"); + // requires \usepackage{textcomp} + break; + case 160: // nbsp + cmark_render_ascii(renderer, "~"); + break; + case 8230: // hellip + cmark_render_ascii(renderer, "\\ldots{}"); + break; + case 8216: // lsquo + if (escape == NORMAL) { + cmark_render_ascii(renderer, "`"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 8217: // rsquo + if (escape == NORMAL) { + cmark_render_ascii(renderer, "\'"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 8220: // ldquo + if (escape == NORMAL) { + cmark_render_ascii(renderer, "``"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 8221: // rdquo + if (escape == NORMAL) { + cmark_render_ascii(renderer, "''"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 8212: // emdash + if (escape == NORMAL) { + cmark_render_ascii(renderer, "---"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 8211: // endash + if (escape == NORMAL) { + cmark_render_ascii(renderer, "--"); + } else { + cmark_render_code_point(renderer, c); + } + break; + default: + cmark_render_code_point(renderer, c); + } +} + +typedef enum { + NO_LINK, + URL_AUTOLINK, + EMAIL_AUTOLINK, + NORMAL_LINK, + INTERNAL_LINK +} link_type; + +static link_type get_link_type(cmark_node *node) { + size_t title_len, url_len; + cmark_node *link_text; + char *realurl; + int realurllen; + bool isemail = false; + + if (node->type != CMARK_NODE_LINK) { + return NO_LINK; + } + + const char *url = cmark_node_get_url(node); + cmark_chunk url_chunk = cmark_chunk_literal(url); + + if (url && *url == '#') { + return INTERNAL_LINK; + } + + url_len = strlen(url); + if (url_len == 0 || scan_scheme(&url_chunk, 0) == 0) { + return NO_LINK; + } + + const char *title = cmark_node_get_title(node); + title_len = strlen(title); + // if it has a title, we can't treat it as an autolink: + if (title_len == 0) { + + link_text = node->first_child; + cmark_consolidate_text_nodes(link_text); + + if (!link_text) + return NO_LINK; + + realurl = (char *)url; + realurllen = (int)url_len; + if (strncmp(realurl, "mailto:", 7) == 0) { + realurl += 7; + realurllen -= 7; + isemail = true; + } + if (realurllen == link_text->len && + strncmp(realurl, (char *)link_text->data, + link_text->len) == 0) { + if (isemail) { + return EMAIL_AUTOLINK; + } else { + return URL_AUTOLINK; + } + } + } + + return NORMAL_LINK; +} + +static int S_get_enumlevel(cmark_node *node) { + int enumlevel = 0; + cmark_node *tmp = node; + while (tmp) { + if (tmp->type == CMARK_NODE_LIST && + cmark_node_get_list_type(node) == CMARK_ORDERED_LIST) { + enumlevel++; + } + tmp = tmp->parent; + } + return enumlevel; +} + +static int S_render_node(cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + int list_number; + int enumlevel; + char list_number_string[LIST_NUMBER_STRING_SIZE]; + bool entering = (ev_type == CMARK_EVENT_ENTER); + cmark_list_type list_type; + bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options); + + // avoid warning about unused parameter: + (void)(options); + + switch (node->type) { + case CMARK_NODE_DOCUMENT: + break; + + case CMARK_NODE_BLOCK_QUOTE: + if (entering) { + LIT("\\begin{quote}"); + CR(); + } else { + LIT("\\end{quote}"); + BLANKLINE(); + } + break; + + case CMARK_NODE_LIST: + list_type = cmark_node_get_list_type(node); + if (entering) { + LIT("\\begin{"); + LIT(list_type == CMARK_ORDERED_LIST ? "enumerate" : "itemize"); + LIT("}"); + CR(); + list_number = cmark_node_get_list_start(node); + if (list_number > 1) { + enumlevel = S_get_enumlevel(node); + // latex normally supports only five levels + if (enumlevel >= 1 && enumlevel <= 5) { + snprintf(list_number_string, LIST_NUMBER_STRING_SIZE, "%d", + list_number); + LIT("\\setcounter{enum"); + switch (enumlevel) { + case 1: LIT("i"); break; + case 2: LIT("ii"); break; + case 3: LIT("iii"); break; + case 4: LIT("iv"); break; + case 5: LIT("v"); break; + default: LIT("i"); break; + } + LIT("}{"); + OUT(list_number_string, false, NORMAL); + LIT("}"); + } + CR(); + } + } else { + LIT("\\end{"); + LIT(list_type == CMARK_ORDERED_LIST ? "enumerate" : "itemize"); + LIT("}"); + BLANKLINE(); + } + break; + + case CMARK_NODE_ITEM: + if (entering) { + LIT("\\item "); + } else { + CR(); + } + break; + + case CMARK_NODE_HEADING: + if (entering) { + switch (cmark_node_get_heading_level(node)) { + case 1: + LIT("\\section"); + break; + case 2: + LIT("\\subsection"); + break; + case 3: + LIT("\\subsubsection"); + break; + case 4: + LIT("\\paragraph"); + break; + case 5: + LIT("\\subparagraph"); + break; + } + LIT("{"); + } else { + LIT("}"); + BLANKLINE(); + } + break; + + case CMARK_NODE_CODE_BLOCK: + CR(); + LIT("\\begin{verbatim}"); + CR(); + OUT(cmark_node_get_literal(node), false, LITERAL); + CR(); + LIT("\\end{verbatim}"); + BLANKLINE(); + break; + + case CMARK_NODE_HTML_BLOCK: + break; + + case CMARK_NODE_CUSTOM_BLOCK: + CR(); + OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node), + false, LITERAL); + CR(); + break; + + case CMARK_NODE_THEMATIC_BREAK: + BLANKLINE(); + LIT("\\begin{center}\\rule{0.5\\linewidth}{\\linethickness}\\end{center}"); + BLANKLINE(); + break; + + case CMARK_NODE_PARAGRAPH: + if (!entering) { + BLANKLINE(); + } + break; + + case CMARK_NODE_TEXT: + OUT(cmark_node_get_literal(node), allow_wrap, NORMAL); + break; + + case CMARK_NODE_LINEBREAK: + LIT("\\\\"); + CR(); + break; + + case CMARK_NODE_SOFTBREAK: + if (options & CMARK_OPT_HARDBREAKS) { + LIT("\\\\"); + CR(); + } else if (renderer->width == 0 && !(CMARK_OPT_NOBREAKS & options)) { + CR(); + } else { + OUT(" ", allow_wrap, NORMAL); + } + break; + + case CMARK_NODE_CODE: + LIT("\\texttt{"); + OUT(cmark_node_get_literal(node), false, NORMAL); + LIT("}"); + break; + + case CMARK_NODE_HTML_INLINE: + break; + + case CMARK_NODE_CUSTOM_INLINE: + OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node), + false, LITERAL); + break; + + case CMARK_NODE_STRONG: + if (entering) { + LIT("\\textbf{"); + } else { + LIT("}"); + } + break; + + case CMARK_NODE_EMPH: + if (entering) { + LIT("\\emph{"); + } else { + LIT("}"); + } + break; + + case CMARK_NODE_LINK: + if (entering) { + const char *url = cmark_node_get_url(node); + // requires \usepackage{hyperref} + switch (get_link_type(node)) { + case URL_AUTOLINK: + LIT("\\url{"); + OUT(url, false, URL); + LIT("}"); + return 0; // Don't process further nodes to avoid double-rendering artefacts + case EMAIL_AUTOLINK: + LIT("\\href{"); + OUT(url, false, URL); + LIT("}\\nolinkurl{"); + break; + case NORMAL_LINK: + LIT("\\href{"); + OUT(url, false, URL); + LIT("}{"); + break; + case INTERNAL_LINK: + LIT("\\protect\\hyperlink{"); + OUT(url + 1, false, URL); + LIT("}{"); + break; + case NO_LINK: + LIT("{"); // error? + } + } else { + LIT("}"); + } + + break; + + case CMARK_NODE_IMAGE: + if (entering) { + LIT("\\protect\\includegraphics{"); + // requires \include{graphicx} + OUT(cmark_node_get_url(node), false, URL); + LIT("}"); + return 0; + } + break; + + default: + assert(false); + break; + } + + return 1; +} + +char *cmark_render_latex(cmark_node *root, int options, int width) { + return cmark_render(root, options, width, outc, S_render_node); +} diff --git a/lib/cmark/src/libcmark.pc.in b/lib/cmark/src/libcmark.pc.in new file mode 100644 index 0000000..0f87c30 --- /dev/null +++ b/lib/cmark/src/libcmark.pc.in @@ -0,0 +1,10 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@CMAKE_INSTALL_PREFIX@/@libdir@ +includedir=@CMAKE_INSTALL_PREFIX@/include + +Name: libcmark +Description: CommonMark parsing, rendering, and manipulation +Version: @PROJECT_VERSION@ +Libs: -L${libdir} -lcmark +Cflags: -I${includedir} diff --git a/lib/cmark/src/main.c b/lib/cmark/src/main.c new file mode 100644 index 0000000..6162704 --- /dev/null +++ b/lib/cmark/src/main.c @@ -0,0 +1,210 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include "config.h" +#include "cmark.h" +#include "node.h" + +#if defined(__OpenBSD__) +# include <sys/param.h> +# if OpenBSD >= 201605 +# define USE_PLEDGE +# include <unistd.h> +# endif +#endif + +#if defined(_WIN32) && !defined(__CYGWIN__) +#include <io.h> +#include <fcntl.h> +#endif + +typedef enum { + FORMAT_NONE, + FORMAT_HTML, + FORMAT_XML, + FORMAT_MAN, + FORMAT_COMMONMARK, + FORMAT_LATEX +} writer_format; + +void print_usage() { + printf("Usage: cmark [FILE*]\n"); + printf("Options:\n"); + printf(" --to, -t FORMAT Specify output format (html, xml, man, " + "commonmark, latex)\n"); + printf(" --width WIDTH Specify wrap width (default 0 = nowrap)\n"); + printf(" --sourcepos Include source position attribute\n"); + printf(" --hardbreaks Treat newlines as hard line breaks\n"); + printf(" --nobreaks Render soft line breaks as spaces\n"); + printf(" --unsafe Render raw HTML and dangerous URLs\n"); + printf(" --smart Use smart punctuation\n"); + printf(" --validate-utf8 Replace invalid UTF-8 sequences with U+FFFD\n"); + printf(" --help, -h Print usage information\n"); + printf(" --version Print version\n"); +} + +static void print_document(cmark_node *document, writer_format writer, + int options, int width) { + char *result; + + switch (writer) { + case FORMAT_HTML: + result = cmark_render_html(document, options); + break; + case FORMAT_XML: + result = cmark_render_xml(document, options); + break; + case FORMAT_MAN: + result = cmark_render_man(document, options, width); + break; + case FORMAT_COMMONMARK: + result = cmark_render_commonmark(document, options, width); + break; + case FORMAT_LATEX: + result = cmark_render_latex(document, options, width); + break; + default: + fprintf(stderr, "Unknown format %d\n", writer); + exit(1); + } + printf("%s", result); + document->mem->free(result); +} + +int main(int argc, char *argv[]) { + int i, numfps = 0; + int *files; + char buffer[4096]; + cmark_parser *parser; + size_t bytes; + cmark_node *document; + int width = 0; + char *unparsed; + writer_format writer = FORMAT_HTML; + int options = CMARK_OPT_DEFAULT; + +#ifdef USE_PLEDGE + if (pledge("stdio rpath", NULL) != 0) { + perror("pledge"); + return 1; + } +#endif + +#if defined(_WIN32) && !defined(__CYGWIN__) + _setmode(_fileno(stdin), _O_BINARY); + _setmode(_fileno(stdout), _O_BINARY); +#endif + + files = (int *)calloc(argc, sizeof(*files)); + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "--version") == 0) { + printf("cmark %s", CMARK_VERSION_STRING); + printf(" - CommonMark converter\n(C) 2014-2016 John MacFarlane\n"); + exit(0); + } else if (strcmp(argv[i], "--sourcepos") == 0) { + options |= CMARK_OPT_SOURCEPOS; + } else if (strcmp(argv[i], "--hardbreaks") == 0) { + options |= CMARK_OPT_HARDBREAKS; + } else if (strcmp(argv[i], "--nobreaks") == 0) { + options |= CMARK_OPT_NOBREAKS; + } else if (strcmp(argv[i], "--smart") == 0) { + options |= CMARK_OPT_SMART; + } else if (strcmp(argv[i], "--unsafe") == 0) { + options |= CMARK_OPT_UNSAFE; + } else if (strcmp(argv[i], "--validate-utf8") == 0) { + options |= CMARK_OPT_VALIDATE_UTF8; + } else if ((strcmp(argv[i], "--help") == 0) || + (strcmp(argv[i], "-h") == 0)) { + print_usage(); + exit(0); + } else if (strcmp(argv[i], "--width") == 0) { + i += 1; + if (i < argc) { + width = (int)strtol(argv[i], &unparsed, 10); + if (unparsed && strlen(unparsed) > 0) { + fprintf(stderr, "failed parsing width '%s' at '%s'\n", argv[i], + unparsed); + exit(1); + } + } else { + fprintf(stderr, "--width requires an argument\n"); + exit(1); + } + } else if ((strcmp(argv[i], "-t") == 0) || (strcmp(argv[i], "--to") == 0)) { + i += 1; + if (i < argc) { + if (strcmp(argv[i], "man") == 0) { + writer = FORMAT_MAN; + } else if (strcmp(argv[i], "html") == 0) { + writer = FORMAT_HTML; + } else if (strcmp(argv[i], "xml") == 0) { + writer = FORMAT_XML; + } else if (strcmp(argv[i], "commonmark") == 0) { + writer = FORMAT_COMMONMARK; + } else if (strcmp(argv[i], "latex") == 0) { + writer = FORMAT_LATEX; + } else { + fprintf(stderr, "Unknown format %s\n", argv[i]); + exit(1); + } + } else { + fprintf(stderr, "No argument provided for %s\n", argv[i - 1]); + exit(1); + } + } else if (*argv[i] == '-') { + print_usage(); + exit(1); + } else { // treat as file argument + files[numfps++] = i; + } + } + + parser = cmark_parser_new(options); + for (i = 0; i < numfps; i++) { + FILE *fp = fopen(argv[files[i]], "rb"); + if (fp == NULL) { + fprintf(stderr, "Error opening file %s: %s\n", argv[files[i]], + strerror(errno)); + exit(1); + } + + while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0) { + cmark_parser_feed(parser, buffer, bytes); + if (bytes < sizeof(buffer)) { + break; + } + } + + fclose(fp); + } + + if (numfps == 0) { + + while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0) { + cmark_parser_feed(parser, buffer, bytes); + if (bytes < sizeof(buffer)) { + break; + } + } + } + +#ifdef USE_PLEDGE + if (pledge("stdio", NULL) != 0) { + perror("pledge"); + return 1; + } +#endif + + document = cmark_parser_finish(parser); + cmark_parser_free(parser); + + print_document(document, writer, options, width); + + cmark_node_free(document); + + free(files); + + return 0; +} diff --git a/lib/cmark/src/man.c b/lib/cmark/src/man.c new file mode 100644 index 0000000..1c76f68 --- /dev/null +++ b/lib/cmark/src/man.c @@ -0,0 +1,252 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <assert.h> + +#include "config.h" +#include "cmark.h" +#include "node.h" +#include "buffer.h" +#include "utf8.h" +#include "render.h" + +#define OUT(s, wrap, escaping) renderer->out(renderer, s, wrap, escaping) +#define LIT(s) renderer->out(renderer, s, false, LITERAL) +#define CR() renderer->cr(renderer) +#define BLANKLINE() renderer->blankline(renderer) +#define LIST_NUMBER_SIZE 20 + +// Functions to convert cmark_nodes to groff man strings. +static void S_outc(cmark_renderer *renderer, cmark_escaping escape, int32_t c, + unsigned char nextc) { + (void)(nextc); + + if (escape == LITERAL) { + cmark_render_code_point(renderer, c); + return; + } + + switch (c) { + case 46: + if (renderer->begin_line) { + cmark_render_ascii(renderer, "\\&."); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 39: + if (renderer->begin_line) { + cmark_render_ascii(renderer, "\\&'"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 45: + cmark_render_ascii(renderer, "\\-"); + break; + case 92: + cmark_render_ascii(renderer, "\\e"); + break; + case 8216: // left single quote + cmark_render_ascii(renderer, "\\[oq]"); + break; + case 8217: // right single quote + cmark_render_ascii(renderer, "\\[cq]"); + break; + case 8220: // left double quote + cmark_render_ascii(renderer, "\\[lq]"); + break; + case 8221: // right double quote + cmark_render_ascii(renderer, "\\[rq]"); + break; + case 8212: // em dash + cmark_render_ascii(renderer, "\\[em]"); + break; + case 8211: // en dash + cmark_render_ascii(renderer, "\\[en]"); + break; + default: + cmark_render_code_point(renderer, c); + } +} + +static int S_render_node(cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + cmark_node *tmp; + int list_number; + bool entering = (ev_type == CMARK_EVENT_ENTER); + bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options); + + // avoid unused parameter error: + (void)(options); + + switch (node->type) { + case CMARK_NODE_DOCUMENT: + break; + + case CMARK_NODE_BLOCK_QUOTE: + if (entering) { + CR(); + LIT(".RS"); + CR(); + } else { + CR(); + LIT(".RE"); + CR(); + } + break; + + case CMARK_NODE_LIST: + break; + + case CMARK_NODE_ITEM: + if (entering) { + CR(); + LIT(".IP "); + if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) { + LIT("\\[bu] 2"); + } else { + list_number = cmark_node_get_list_start(node->parent); + tmp = node; + while (tmp->prev) { + tmp = tmp->prev; + list_number += 1; + } + char list_number_s[LIST_NUMBER_SIZE]; + snprintf(list_number_s, LIST_NUMBER_SIZE, "\"%d.\" 4", list_number); + LIT(list_number_s); + } + CR(); + } else { + CR(); + } + break; + + case CMARK_NODE_HEADING: + if (entering) { + CR(); + LIT(cmark_node_get_heading_level(node) == 1 ? ".SH" : ".SS"); + CR(); + } else { + CR(); + } + break; + + case CMARK_NODE_CODE_BLOCK: + CR(); + LIT(".IP\n.nf\n\\f[C]\n"); + OUT(cmark_node_get_literal(node), false, NORMAL); + CR(); + LIT("\\f[]\n.fi"); + CR(); + break; + + case CMARK_NODE_HTML_BLOCK: + break; + + case CMARK_NODE_CUSTOM_BLOCK: + CR(); + OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node), + false, LITERAL); + CR(); + break; + + case CMARK_NODE_THEMATIC_BREAK: + CR(); + LIT(".PP\n * * * * *"); + CR(); + break; + + case CMARK_NODE_PARAGRAPH: + if (entering) { + // no blank line if first paragraph in list: + if (node->parent && node->parent->type == CMARK_NODE_ITEM && + node->prev == NULL) { + // no blank line or .PP + } else { + CR(); + LIT(".PP"); + CR(); + } + } else { + CR(); + } + break; + + case CMARK_NODE_TEXT: + OUT(cmark_node_get_literal(node), allow_wrap, NORMAL); + break; + + case CMARK_NODE_LINEBREAK: + LIT(".PD 0\n.P\n.PD"); + CR(); + break; + + case CMARK_NODE_SOFTBREAK: + if (options & CMARK_OPT_HARDBREAKS) { + LIT(".PD 0\n.P\n.PD"); + CR(); + } else if (renderer->width == 0 && !(CMARK_OPT_NOBREAKS & options)) { + CR(); + } else { + OUT(" ", allow_wrap, LITERAL); + } + break; + + case CMARK_NODE_CODE: + LIT("\\f[C]"); + OUT(cmark_node_get_literal(node), allow_wrap, NORMAL); + LIT("\\f[]"); + break; + + case CMARK_NODE_HTML_INLINE: + break; + + case CMARK_NODE_CUSTOM_INLINE: + OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node), + false, LITERAL); + break; + + case CMARK_NODE_STRONG: + if (entering) { + LIT("\\f[B]"); + } else { + LIT("\\f[]"); + } + break; + + case CMARK_NODE_EMPH: + if (entering) { + LIT("\\f[I]"); + } else { + LIT("\\f[]"); + } + break; + + case CMARK_NODE_LINK: + if (!entering) { + LIT(" ("); + OUT(cmark_node_get_url(node), allow_wrap, URL); + LIT(")"); + } + break; + + case CMARK_NODE_IMAGE: + if (entering) { + LIT("[IMAGE: "); + } else { + LIT("]"); + } + break; + + default: + assert(false); + break; + } + + return 1; +} + +char *cmark_render_man(cmark_node *root, int options, int width) { + return cmark_render(root, options, width, S_outc, S_render_node); +} diff --git a/lib/cmark/src/node.c b/lib/cmark/src/node.c new file mode 100644 index 0000000..ea09c30 --- /dev/null +++ b/lib/cmark/src/node.c @@ -0,0 +1,871 @@ +#include <stdlib.h> +#include <string.h> + +#include "config.h" +#include "node.h" + +static void S_node_unlink(cmark_node *node); + +static CMARK_INLINE bool S_is_block(cmark_node *node) { + if (node == NULL) { + return false; + } + return node->type >= CMARK_NODE_FIRST_BLOCK && + node->type <= CMARK_NODE_LAST_BLOCK; +} + +static CMARK_INLINE bool S_is_inline(cmark_node *node) { + if (node == NULL) { + return false; + } + return node->type >= CMARK_NODE_FIRST_INLINE && + node->type <= CMARK_NODE_LAST_INLINE; +} + +static bool S_can_contain(cmark_node *node, cmark_node *child) { + cmark_node *cur; + + if (node == NULL || child == NULL) { + return false; + } + + // Verify that child is not an ancestor of node or equal to node. + cur = node; + do { + if (cur == child) { + return false; + } + cur = cur->parent; + } while (cur != NULL); + + if (child->type == CMARK_NODE_DOCUMENT) { + return false; + } + + switch (node->type) { + case CMARK_NODE_DOCUMENT: + case CMARK_NODE_BLOCK_QUOTE: + case CMARK_NODE_ITEM: + return S_is_block(child) && child->type != CMARK_NODE_ITEM; + + case CMARK_NODE_LIST: + return child->type == CMARK_NODE_ITEM; + + case CMARK_NODE_CUSTOM_BLOCK: + return true; + + case CMARK_NODE_PARAGRAPH: + case CMARK_NODE_HEADING: + case CMARK_NODE_EMPH: + case CMARK_NODE_STRONG: + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + case CMARK_NODE_CUSTOM_INLINE: + return S_is_inline(child); + + default: + break; + } + + return false; +} + +cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem) { + cmark_node *node = (cmark_node *)mem->calloc(1, sizeof(*node)); + node->mem = mem; + node->type = (uint16_t)type; + + switch (node->type) { + case CMARK_NODE_HEADING: + node->as.heading.level = 1; + break; + + case CMARK_NODE_LIST: { + cmark_list *list = &node->as.list; + list->list_type = CMARK_BULLET_LIST; + list->start = 0; + list->tight = false; + break; + } + + default: + break; + } + + return node; +} + +cmark_node *cmark_node_new(cmark_node_type type) { + extern cmark_mem DEFAULT_MEM_ALLOCATOR; + return cmark_node_new_with_mem(type, &DEFAULT_MEM_ALLOCATOR); +} + +// Free a cmark_node list and any children. +static void S_free_nodes(cmark_node *e) { + cmark_mem *mem = e->mem; + cmark_node *next; + while (e != NULL) { + switch (e->type) { + case CMARK_NODE_CODE_BLOCK: + mem->free(e->data); + mem->free(e->as.code.info); + break; + case CMARK_NODE_TEXT: + case CMARK_NODE_HTML_INLINE: + case CMARK_NODE_CODE: + case CMARK_NODE_HTML_BLOCK: + mem->free(e->data); + break; + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + mem->free(e->as.link.url); + mem->free(e->as.link.title); + break; + case CMARK_NODE_CUSTOM_BLOCK: + case CMARK_NODE_CUSTOM_INLINE: + mem->free(e->as.custom.on_enter); + mem->free(e->as.custom.on_exit); + break; + default: + break; + } + if (e->last_child) { + // Splice children into list + e->last_child->next = e->next; + e->next = e->first_child; + } + next = e->next; + mem->free(e); + e = next; + } +} + +void cmark_node_free(cmark_node *node) { + S_node_unlink(node); + node->next = NULL; + S_free_nodes(node); +} + +cmark_node_type cmark_node_get_type(cmark_node *node) { + if (node == NULL) { + return CMARK_NODE_NONE; + } else { + return (cmark_node_type)node->type; + } +} + +const char *cmark_node_get_type_string(cmark_node *node) { + if (node == NULL) { + return "NONE"; + } + + switch (node->type) { + case CMARK_NODE_NONE: + return "none"; + case CMARK_NODE_DOCUMENT: + return "document"; + case CMARK_NODE_BLOCK_QUOTE: + return "block_quote"; + case CMARK_NODE_LIST: + return "list"; + case CMARK_NODE_ITEM: + return "item"; + case CMARK_NODE_CODE_BLOCK: + return "code_block"; + case CMARK_NODE_HTML_BLOCK: + return "html_block"; + case CMARK_NODE_CUSTOM_BLOCK: + return "custom_block"; + case CMARK_NODE_PARAGRAPH: + return "paragraph"; + case CMARK_NODE_HEADING: + return "heading"; + case CMARK_NODE_THEMATIC_BREAK: + return "thematic_break"; + case CMARK_NODE_TEXT: + return "text"; + case CMARK_NODE_SOFTBREAK: + return "softbreak"; + case CMARK_NODE_LINEBREAK: + return "linebreak"; + case CMARK_NODE_CODE: + return "code"; + case CMARK_NODE_HTML_INLINE: + return "html_inline"; + case CMARK_NODE_CUSTOM_INLINE: + return "custom_inline"; + case CMARK_NODE_EMPH: + return "emph"; + case CMARK_NODE_STRONG: + return "strong"; + case CMARK_NODE_LINK: + return "link"; + case CMARK_NODE_IMAGE: + return "image"; + } + + return "<unknown>"; +} + +cmark_node *cmark_node_next(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->next; + } +} + +cmark_node *cmark_node_previous(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->prev; + } +} + +cmark_node *cmark_node_parent(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->parent; + } +} + +cmark_node *cmark_node_first_child(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->first_child; + } +} + +cmark_node *cmark_node_last_child(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->last_child; + } +} + +static bufsize_t cmark_set_cstr(cmark_mem *mem, unsigned char **dst, + const char *src) { + unsigned char *old = *dst; + bufsize_t len; + + if (src && src[0]) { + len = (bufsize_t)strlen(src); + *dst = (unsigned char *)mem->realloc(NULL, len + 1); + memcpy(*dst, src, len + 1); + } else { + len = 0; + *dst = NULL; + } + if (old) { + mem->free(old); + } + + return len; +} + +void *cmark_node_get_user_data(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->user_data; + } +} + +int cmark_node_set_user_data(cmark_node *node, void *user_data) { + if (node == NULL) { + return 0; + } + node->user_data = user_data; + return 1; +} + +const char *cmark_node_get_literal(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + switch (node->type) { + case CMARK_NODE_HTML_BLOCK: + case CMARK_NODE_TEXT: + case CMARK_NODE_HTML_INLINE: + case CMARK_NODE_CODE: + case CMARK_NODE_CODE_BLOCK: + return node->data ? (char *)node->data : ""; + + default: + break; + } + + return NULL; +} + +int cmark_node_set_literal(cmark_node *node, const char *content) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_HTML_BLOCK: + case CMARK_NODE_TEXT: + case CMARK_NODE_HTML_INLINE: + case CMARK_NODE_CODE: + case CMARK_NODE_CODE_BLOCK: + node->len = cmark_set_cstr(node->mem, &node->data, content); + return 1; + + default: + break; + } + + return 0; +} + +int cmark_node_get_heading_level(cmark_node *node) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_HEADING: + return node->as.heading.level; + + default: + break; + } + + return 0; +} + +int cmark_node_set_heading_level(cmark_node *node, int level) { + if (node == NULL || level < 1 || level > 6) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_HEADING: + node->as.heading.level = level; + return 1; + + default: + break; + } + + return 0; +} + +cmark_list_type cmark_node_get_list_type(cmark_node *node) { + if (node == NULL) { + return CMARK_NO_LIST; + } + + if (node->type == CMARK_NODE_LIST) { + return (cmark_list_type)node->as.list.list_type; + } else { + return CMARK_NO_LIST; + } +} + +int cmark_node_set_list_type(cmark_node *node, cmark_list_type type) { + if (!(type == CMARK_BULLET_LIST || type == CMARK_ORDERED_LIST)) { + return 0; + } + + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + node->as.list.list_type = (unsigned char)type; + return 1; + } else { + return 0; + } +} + +cmark_delim_type cmark_node_get_list_delim(cmark_node *node) { + if (node == NULL) { + return CMARK_NO_DELIM; + } + + if (node->type == CMARK_NODE_LIST) { + return (cmark_delim_type)node->as.list.delimiter; + } else { + return CMARK_NO_DELIM; + } +} + +int cmark_node_set_list_delim(cmark_node *node, cmark_delim_type delim) { + if (!(delim == CMARK_PERIOD_DELIM || delim == CMARK_PAREN_DELIM)) { + return 0; + } + + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + node->as.list.delimiter = (unsigned char)delim; + return 1; + } else { + return 0; + } +} + +int cmark_node_get_list_start(cmark_node *node) { + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + return node->as.list.start; + } else { + return 0; + } +} + +int cmark_node_set_list_start(cmark_node *node, int start) { + if (node == NULL || start < 0) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + node->as.list.start = start; + return 1; + } else { + return 0; + } +} + +int cmark_node_get_list_tight(cmark_node *node) { + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + return node->as.list.tight; + } else { + return 0; + } +} + +int cmark_node_set_list_tight(cmark_node *node, int tight) { + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + node->as.list.tight = tight == 1; + return 1; + } else { + return 0; + } +} + +const char *cmark_node_get_fence_info(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + if (node->type == CMARK_NODE_CODE_BLOCK) { + return node->as.code.info ? (char *)node->as.code.info : ""; + } else { + return NULL; + } +} + +int cmark_node_set_fence_info(cmark_node *node, const char *info) { + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_CODE_BLOCK) { + cmark_set_cstr(node->mem, &node->as.code.info, info); + return 1; + } else { + return 0; + } +} + +const char *cmark_node_get_url(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + switch (node->type) { + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + return node->as.link.url ? (char *)node->as.link.url : ""; + default: + break; + } + + return NULL; +} + +int cmark_node_set_url(cmark_node *node, const char *url) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + cmark_set_cstr(node->mem, &node->as.link.url, url); + return 1; + default: + break; + } + + return 0; +} + +const char *cmark_node_get_title(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + switch (node->type) { + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + return node->as.link.title ? (char *)node->as.link.title : ""; + default: + break; + } + + return NULL; +} + +int cmark_node_set_title(cmark_node *node, const char *title) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + cmark_set_cstr(node->mem, &node->as.link.title, title); + return 1; + default: + break; + } + + return 0; +} + +const char *cmark_node_get_on_enter(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + switch (node->type) { + case CMARK_NODE_CUSTOM_INLINE: + case CMARK_NODE_CUSTOM_BLOCK: + return node->as.custom.on_enter ? (char *)node->as.custom.on_enter : ""; + default: + break; + } + + return NULL; +} + +int cmark_node_set_on_enter(cmark_node *node, const char *on_enter) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_CUSTOM_INLINE: + case CMARK_NODE_CUSTOM_BLOCK: + cmark_set_cstr(node->mem, &node->as.custom.on_enter, on_enter); + return 1; + default: + break; + } + + return 0; +} + +const char *cmark_node_get_on_exit(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + switch (node->type) { + case CMARK_NODE_CUSTOM_INLINE: + case CMARK_NODE_CUSTOM_BLOCK: + return node->as.custom.on_exit ? (char *)node->as.custom.on_exit : ""; + default: + break; + } + + return NULL; +} + +int cmark_node_set_on_exit(cmark_node *node, const char *on_exit) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_CUSTOM_INLINE: + case CMARK_NODE_CUSTOM_BLOCK: + cmark_set_cstr(node->mem, &node->as.custom.on_exit, on_exit); + return 1; + default: + break; + } + + return 0; +} + +int cmark_node_get_start_line(cmark_node *node) { + if (node == NULL) { + return 0; + } + return node->start_line; +} + +int cmark_node_get_start_column(cmark_node *node) { + if (node == NULL) { + return 0; + } + return node->start_column; +} + +int cmark_node_get_end_line(cmark_node *node) { + if (node == NULL) { + return 0; + } + return node->end_line; +} + +int cmark_node_get_end_column(cmark_node *node) { + if (node == NULL) { + return 0; + } + return node->end_column; +} + +// Unlink a node without adjusting its next, prev, and parent pointers. +static void S_node_unlink(cmark_node *node) { + if (node == NULL) { + return; + } + + if (node->prev) { + node->prev->next = node->next; + } + if (node->next) { + node->next->prev = node->prev; + } + + // Adjust first_child and last_child of parent. + cmark_node *parent = node->parent; + if (parent) { + if (parent->first_child == node) { + parent->first_child = node->next; + } + if (parent->last_child == node) { + parent->last_child = node->prev; + } + } +} + +void cmark_node_unlink(cmark_node *node) { + S_node_unlink(node); + + node->next = NULL; + node->prev = NULL; + node->parent = NULL; +} + +int cmark_node_insert_before(cmark_node *node, cmark_node *sibling) { + if (node == NULL || sibling == NULL) { + return 0; + } + + if (!node->parent || !S_can_contain(node->parent, sibling)) { + return 0; + } + + S_node_unlink(sibling); + + cmark_node *old_prev = node->prev; + + // Insert 'sibling' between 'old_prev' and 'node'. + if (old_prev) { + old_prev->next = sibling; + } + sibling->prev = old_prev; + sibling->next = node; + node->prev = sibling; + + // Set new parent. + cmark_node *parent = node->parent; + sibling->parent = parent; + + // Adjust first_child of parent if inserted as first child. + if (parent && !old_prev) { + parent->first_child = sibling; + } + + return 1; +} + +int cmark_node_insert_after(cmark_node *node, cmark_node *sibling) { + if (node == NULL || sibling == NULL) { + return 0; + } + + if (!node->parent || !S_can_contain(node->parent, sibling)) { + return 0; + } + + S_node_unlink(sibling); + + cmark_node *old_next = node->next; + + // Insert 'sibling' between 'node' and 'old_next'. + if (old_next) { + old_next->prev = sibling; + } + sibling->next = old_next; + sibling->prev = node; + node->next = sibling; + + // Set new parent. + cmark_node *parent = node->parent; + sibling->parent = parent; + + // Adjust last_child of parent if inserted as last child. + if (parent && !old_next) { + parent->last_child = sibling; + } + + return 1; +} + +int cmark_node_replace(cmark_node *oldnode, cmark_node *newnode) { + if (!cmark_node_insert_before(oldnode, newnode)) { + return 0; + } + cmark_node_unlink(oldnode); + return 1; +} + +int cmark_node_prepend_child(cmark_node *node, cmark_node *child) { + if (!S_can_contain(node, child)) { + return 0; + } + + S_node_unlink(child); + + cmark_node *old_first_child = node->first_child; + + child->next = old_first_child; + child->prev = NULL; + child->parent = node; + node->first_child = child; + + if (old_first_child) { + old_first_child->prev = child; + } else { + // Also set last_child if node previously had no children. + node->last_child = child; + } + + return 1; +} + +int cmark_node_append_child(cmark_node *node, cmark_node *child) { + if (!S_can_contain(node, child)) { + return 0; + } + + S_node_unlink(child); + + cmark_node *old_last_child = node->last_child; + + child->next = NULL; + child->prev = old_last_child; + child->parent = node; + node->last_child = child; + + if (old_last_child) { + old_last_child->next = child; + } else { + // Also set first_child if node previously had no children. + node->first_child = child; + } + + return 1; +} + +static void S_print_error(FILE *out, cmark_node *node, const char *elem) { + if (out == NULL) { + return; + } + fprintf(out, "Invalid '%s' in node type %s at %d:%d\n", elem, + cmark_node_get_type_string(node), node->start_line, + node->start_column); +} + +int cmark_node_check(cmark_node *node, FILE *out) { + cmark_node *cur; + int errors = 0; + + if (!node) { + return 0; + } + + cur = node; + for (;;) { + if (cur->first_child) { + if (cur->first_child->prev != NULL) { + S_print_error(out, cur->first_child, "prev"); + cur->first_child->prev = NULL; + ++errors; + } + if (cur->first_child->parent != cur) { + S_print_error(out, cur->first_child, "parent"); + cur->first_child->parent = cur; + ++errors; + } + cur = cur->first_child; + continue; + } + + next_sibling: + if (cur == node) { + break; + } + if (cur->next) { + if (cur->next->prev != cur) { + S_print_error(out, cur->next, "prev"); + cur->next->prev = cur; + ++errors; + } + if (cur->next->parent != cur->parent) { + S_print_error(out, cur->next, "parent"); + cur->next->parent = cur->parent; + ++errors; + } + cur = cur->next; + continue; + } + + if (cur->parent->last_child != cur) { + S_print_error(out, cur->parent, "last_child"); + cur->parent->last_child = cur; + ++errors; + } + cur = cur->parent; + goto next_sibling; + } + + return errors; +} diff --git a/lib/cmark/src/node.h b/lib/cmark/src/node.h new file mode 100644 index 0000000..6bf6677 --- /dev/null +++ b/lib/cmark/src/node.h @@ -0,0 +1,92 @@ +#ifndef CMARK_NODE_H +#define CMARK_NODE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdio.h> +#include <stdint.h> + +#include "config.h" +#include "cmark.h" +#include "buffer.h" + +typedef struct { + int marker_offset; + int padding; + int start; + unsigned char list_type; + unsigned char delimiter; + unsigned char bullet_char; + bool tight; +} cmark_list; + +typedef struct { + unsigned char *info; + uint8_t fence_length; + uint8_t fence_offset; + unsigned char fence_char; + int8_t fenced; +} cmark_code; + +typedef struct { + int level; + bool setext; +} cmark_heading; + +typedef struct { + unsigned char *url; + unsigned char *title; +} cmark_link; + +typedef struct { + unsigned char *on_enter; + unsigned char *on_exit; +} cmark_custom; + +enum cmark_node__internal_flags { + CMARK_NODE__OPEN = (1 << 0), + CMARK_NODE__LAST_LINE_BLANK = (1 << 1), + CMARK_NODE__LAST_LINE_CHECKED = (1 << 2), +}; + +struct cmark_node { + cmark_mem *mem; + + struct cmark_node *next; + struct cmark_node *prev; + struct cmark_node *parent; + struct cmark_node *first_child; + struct cmark_node *last_child; + + void *user_data; + + unsigned char *data; + bufsize_t len; + + int start_line; + int start_column; + int end_line; + int end_column; + int internal_offset; + uint16_t type; + uint16_t flags; + + union { + cmark_list list; + cmark_code code; + cmark_heading heading; + cmark_link link; + cmark_custom custom; + int html_block_type; + } as; +}; + +CMARK_EXPORT int cmark_node_check(cmark_node *node, FILE *out); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/parser.h b/lib/cmark/src/parser.h new file mode 100644 index 0000000..8f6c694 --- /dev/null +++ b/lib/cmark/src/parser.h @@ -0,0 +1,41 @@ +#ifndef CMARK_AST_H +#define CMARK_AST_H + +#include <stdio.h> +#include "references.h" +#include "node.h" +#include "buffer.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_LINK_LABEL_LENGTH 1000 + +struct cmark_parser { + struct cmark_mem *mem; + struct cmark_reference_map *refmap; + struct cmark_node *root; + struct cmark_node *current; + int line_number; + bufsize_t offset; + bufsize_t column; + bufsize_t first_nonspace; + bufsize_t first_nonspace_column; + bufsize_t thematic_break_kill_pos; + int indent; + bool blank; + bool partially_consumed_tab; + cmark_strbuf curline; + bufsize_t last_line_length; + cmark_strbuf linebuf; + cmark_strbuf content; + int options; + bool last_buffer_ended_with_cr; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/references.c b/lib/cmark/src/references.c new file mode 100644 index 0000000..623006a --- /dev/null +++ b/lib/cmark/src/references.c @@ -0,0 +1,156 @@ +#include "cmark.h" +#include "utf8.h" +#include "parser.h" +#include "references.h" +#include "inlines.h" +#include "chunk.h" + +static void reference_free(cmark_reference_map *map, cmark_reference *ref) { + cmark_mem *mem = map->mem; + if (ref != NULL) { + mem->free(ref->label); + mem->free(ref->url); + mem->free(ref->title); + mem->free(ref); + } +} + +// normalize reference: collapse internal whitespace to single space, +// remove leading/trailing whitespace, case fold +// Return NULL if the reference name is actually empty (i.e. composed +// solely from whitespace) +static unsigned char *normalize_reference(cmark_mem *mem, cmark_chunk *ref) { + cmark_strbuf normalized = CMARK_BUF_INIT(mem); + unsigned char *result; + + if (ref == NULL) + return NULL; + + if (ref->len == 0) + return NULL; + + cmark_utf8proc_case_fold(&normalized, ref->data, ref->len); + cmark_strbuf_trim(&normalized); + cmark_strbuf_normalize_whitespace(&normalized); + + result = cmark_strbuf_detach(&normalized); + assert(result); + + if (result[0] == '\0') { + mem->free(result); + return NULL; + } + + return result; +} + +void cmark_reference_create(cmark_reference_map *map, cmark_chunk *label, + cmark_chunk *url, cmark_chunk *title) { + cmark_reference *ref; + unsigned char *reflabel = normalize_reference(map->mem, label); + + /* empty reference name, or composed from only whitespace */ + if (reflabel == NULL) + return; + + assert(map->sorted == NULL); + + ref = (cmark_reference *)map->mem->calloc(1, sizeof(*ref)); + ref->label = reflabel; + ref->url = cmark_clean_url(map->mem, url); + ref->title = cmark_clean_title(map->mem, title); + ref->age = map->size; + ref->next = map->refs; + + map->refs = ref; + map->size++; +} + +static int +labelcmp(const unsigned char *a, const unsigned char *b) { + return strcmp((const char *)a, (const char *)b); +} + +static int +refcmp(const void *p1, const void *p2) { + cmark_reference *r1 = *(cmark_reference **)p1; + cmark_reference *r2 = *(cmark_reference **)p2; + int res = labelcmp(r1->label, r2->label); + return res ? res : ((int)r1->age - (int)r2->age); +} + +static int +refsearch(const void *label, const void *p2) { + cmark_reference *ref = *(cmark_reference **)p2; + return labelcmp((const unsigned char *)label, ref->label); +} + +static void sort_references(cmark_reference_map *map) { + unsigned int i = 0, last = 0, size = map->size; + cmark_reference *r = map->refs, **sorted = NULL; + + sorted = (cmark_reference **)map->mem->calloc(size, sizeof(cmark_reference *)); + while (r) { + sorted[i++] = r; + r = r->next; + } + + qsort(sorted, size, sizeof(cmark_reference *), refcmp); + + for (i = 1; i < size; i++) { + if (labelcmp(sorted[i]->label, sorted[last]->label) != 0) + sorted[++last] = sorted[i]; + } + map->sorted = sorted; + map->size = last + 1; +} + +// Returns reference if refmap contains a reference with matching +// label, otherwise NULL. +cmark_reference *cmark_reference_lookup(cmark_reference_map *map, + cmark_chunk *label) { + cmark_reference **ref = NULL; + unsigned char *norm; + + if (label->len < 1 || label->len > MAX_LINK_LABEL_LENGTH) + return NULL; + + if (map == NULL || !map->size) + return NULL; + + norm = normalize_reference(map->mem, label); + if (norm == NULL) + return NULL; + + if (!map->sorted) + sort_references(map); + + ref = (cmark_reference **)bsearch(norm, map->sorted, map->size, sizeof(cmark_reference *), + refsearch); + map->mem->free(norm); + return ref ? ref[0] : NULL; +} + +void cmark_reference_map_free(cmark_reference_map *map) { + cmark_reference *ref; + + if (map == NULL) + return; + + ref = map->refs; + while (ref) { + cmark_reference *next = ref->next; + reference_free(map, ref); + ref = next; + } + + map->mem->free(map->sorted); + map->mem->free(map); +} + +cmark_reference_map *cmark_reference_map_new(cmark_mem *mem) { + cmark_reference_map *map = + (cmark_reference_map *)mem->calloc(1, sizeof(cmark_reference_map)); + map->mem = mem; + return map; +} diff --git a/lib/cmark/src/references.h b/lib/cmark/src/references.h new file mode 100644 index 0000000..cc59509 --- /dev/null +++ b/lib/cmark/src/references.h @@ -0,0 +1,40 @@ +#ifndef CMARK_REFERENCES_H +#define CMARK_REFERENCES_H + +#include "chunk.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct cmark_reference { + struct cmark_reference *next; + unsigned char *label; + unsigned char *url; + unsigned char *title; + unsigned int age; +}; + +typedef struct cmark_reference cmark_reference; + +struct cmark_reference_map { + cmark_mem *mem; + cmark_reference *refs; + cmark_reference **sorted; + unsigned int size; +}; + +typedef struct cmark_reference_map cmark_reference_map; + +cmark_reference_map *cmark_reference_map_new(cmark_mem *mem); +void cmark_reference_map_free(cmark_reference_map *map); +cmark_reference *cmark_reference_lookup(cmark_reference_map *map, + cmark_chunk *label); +extern void cmark_reference_create(cmark_reference_map *map, cmark_chunk *label, + cmark_chunk *url, cmark_chunk *title); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/render.c b/lib/cmark/src/render.c new file mode 100644 index 0000000..dfdd855 --- /dev/null +++ b/lib/cmark/src/render.c @@ -0,0 +1,192 @@ +#include <stdlib.h> +#include "buffer.h" +#include "cmark.h" +#include "utf8.h" +#include "render.h" +#include "node.h" +#include "cmark_ctype.h" + +static CMARK_INLINE void S_cr(cmark_renderer *renderer) { + if (renderer->need_cr < 1) { + renderer->need_cr = 1; + } +} + +static CMARK_INLINE void S_blankline(cmark_renderer *renderer) { + if (renderer->need_cr < 2) { + renderer->need_cr = 2; + } +} + +static void S_out(cmark_renderer *renderer, const char *source, bool wrap, + cmark_escaping escape) { + int length = strlen(source); + unsigned char nextc; + int32_t c; + int i = 0; + int last_nonspace; + int len; + int k = renderer->buffer->size - 1; + + wrap = wrap && !renderer->no_linebreaks; + + if (renderer->in_tight_list_item && renderer->need_cr > 1) { + renderer->need_cr = 1; + } + while (renderer->need_cr) { + if (k < 0 || renderer->buffer->ptr[k] == '\n') { + k -= 1; + } else { + cmark_strbuf_putc(renderer->buffer, '\n'); + if (renderer->need_cr > 1) { + cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, + renderer->prefix->size); + } + } + renderer->column = 0; + renderer->last_breakable = 0; + renderer->begin_line = true; + renderer->begin_content = true; + renderer->need_cr -= 1; + } + + while (i < length) { + if (renderer->begin_line) { + cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, + renderer->prefix->size); + // note: this assumes prefix is ascii: + renderer->column = renderer->prefix->size; + } + + len = cmark_utf8proc_iterate((const uint8_t *)source + i, length - i, &c); + if (len == -1) { // error condition + return; // return without rendering rest of string + } + nextc = source[i + len]; + if (c == 32 && wrap) { + if (!renderer->begin_line) { + last_nonspace = renderer->buffer->size; + cmark_strbuf_putc(renderer->buffer, ' '); + renderer->column += 1; + renderer->begin_line = false; + renderer->begin_content = false; + // skip following spaces + while (source[i + 1] == ' ') { + i++; + } + // We don't allow breaks that make a digit the first character + // because this causes problems with commonmark output. + if (!cmark_isdigit(source[i + 1])) { + renderer->last_breakable = last_nonspace; + } + } + + } else if (escape == LITERAL) { + if (c == 10) { + cmark_strbuf_putc(renderer->buffer, '\n'); + renderer->column = 0; + renderer->begin_line = true; + renderer->begin_content = true; + renderer->last_breakable = 0; + } else { + cmark_render_code_point(renderer, c); + renderer->begin_line = false; + // we don't set 'begin_content' to false til we've + // finished parsing a digit. Reason: in commonmark + // we need to escape a potential list marker after + // a digit: + renderer->begin_content = + renderer->begin_content && cmark_isdigit(c) == 1; + } + } else { + (renderer->outc)(renderer, escape, c, nextc); + renderer->begin_line = false; + renderer->begin_content = + renderer->begin_content && cmark_isdigit(c) == 1; + } + + // If adding the character went beyond width, look for an + // earlier place where the line could be broken: + if (renderer->width > 0 && renderer->column > renderer->width && + !renderer->begin_line && renderer->last_breakable > 0) { + + // copy from last_breakable to remainder + unsigned char *src = renderer->buffer->ptr + + renderer->last_breakable + 1; + bufsize_t remainder_len = renderer->buffer->size - + renderer->last_breakable - 1; + unsigned char *remainder = + (unsigned char *)renderer->mem->realloc(NULL, remainder_len); + memcpy(remainder, src, remainder_len); + // truncate at last_breakable + cmark_strbuf_truncate(renderer->buffer, renderer->last_breakable); + // add newline, prefix, and remainder + cmark_strbuf_putc(renderer->buffer, '\n'); + cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, + renderer->prefix->size); + cmark_strbuf_put(renderer->buffer, remainder, remainder_len); + renderer->column = renderer->prefix->size + remainder_len; + renderer->mem->free(remainder); + renderer->last_breakable = 0; + renderer->begin_line = false; + renderer->begin_content = false; + } + + i += len; + } +} + +// Assumes no newlines, assumes ascii content: +void cmark_render_ascii(cmark_renderer *renderer, const char *s) { + int origsize = renderer->buffer->size; + cmark_strbuf_puts(renderer->buffer, s); + renderer->column += renderer->buffer->size - origsize; +} + +void cmark_render_code_point(cmark_renderer *renderer, uint32_t c) { + cmark_utf8proc_encode_char(c, renderer->buffer); + renderer->column += 1; +} + +char *cmark_render(cmark_node *root, int options, int width, + void (*outc)(cmark_renderer *, cmark_escaping, int32_t, + unsigned char), + int (*render_node)(cmark_renderer *renderer, + cmark_node *node, + cmark_event_type ev_type, int options)) { + cmark_mem *mem = root->mem; + cmark_strbuf pref = CMARK_BUF_INIT(mem); + cmark_strbuf buf = CMARK_BUF_INIT(mem); + cmark_node *cur; + cmark_event_type ev_type; + char *result; + cmark_iter *iter = cmark_iter_new(root); + + cmark_renderer renderer = {options, + mem, &buf, &pref, 0, width, + 0, 0, true, true, false, + false, outc, S_cr, S_blankline, S_out}; + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + if (!render_node(&renderer, cur, ev_type, options)) { + // a false value causes us to skip processing + // the node's contents. this is used for + // autolinks. + cmark_iter_reset(iter, cur, CMARK_EVENT_EXIT); + } + } + + // ensure final newline + if (renderer.buffer->size == 0 || renderer.buffer->ptr[renderer.buffer->size - 1] != '\n') { + cmark_strbuf_putc(renderer.buffer, '\n'); + } + + result = (char *)cmark_strbuf_detach(renderer.buffer); + + cmark_iter_free(iter); + cmark_strbuf_free(renderer.prefix); + cmark_strbuf_free(renderer.buffer); + + return result; +} diff --git a/lib/cmark/src/render.h b/lib/cmark/src/render.h new file mode 100644 index 0000000..15f6c2c --- /dev/null +++ b/lib/cmark/src/render.h @@ -0,0 +1,49 @@ +#ifndef CMARK_RENDER_H +#define CMARK_RENDER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdlib.h> +#include "buffer.h" + +typedef enum { LITERAL, NORMAL, TITLE, URL } cmark_escaping; + +struct cmark_renderer { + int options; + cmark_mem *mem; + cmark_strbuf *buffer; + cmark_strbuf *prefix; + int column; + int width; + int need_cr; + bufsize_t last_breakable; + bool begin_line; + bool begin_content; + bool no_linebreaks; + bool in_tight_list_item; + void (*outc)(struct cmark_renderer *, cmark_escaping, int32_t, unsigned char); + void (*cr)(struct cmark_renderer *); + void (*blankline)(struct cmark_renderer *); + void (*out)(struct cmark_renderer *, const char *, bool, cmark_escaping); +}; + +typedef struct cmark_renderer cmark_renderer; + +void cmark_render_ascii(cmark_renderer *renderer, const char *s); + +void cmark_render_code_point(cmark_renderer *renderer, uint32_t c); + +char *cmark_render(cmark_node *root, int options, int width, + void (*outc)(cmark_renderer *, cmark_escaping, int32_t, + unsigned char), + int (*render_node)(cmark_renderer *renderer, + cmark_node *node, + cmark_event_type ev_type, int options)); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/scanners.c b/lib/cmark/src/scanners.c new file mode 100644 index 0000000..f8e6c15 --- /dev/null +++ b/lib/cmark/src/scanners.c @@ -0,0 +1,13787 @@ +/* Generated by re2c 0.16 */ +#include <stdlib.h> +#include "chunk.h" +#include "scanners.h" + +bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c, + bufsize_t offset) { + bufsize_t res; + unsigned char *ptr = (unsigned char *)c->data; + + if (ptr == NULL || offset > c->len) { + return 0; + } else { + unsigned char lim = ptr[c->len]; + + ptr[c->len] = '\0'; + res = scanner(ptr + offset); + ptr[c->len] = lim; + } + + return res; +} + +// Try to match a scheme including colon. +bufsize_t _scan_scheme(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + yych = *p; + if (yych <= '@') + goto yy2; + if (yych <= 'Z') + goto yy4; + if (yych <= '`') + goto yy2; + if (yych <= 'z') + goto yy4; + yy2: + ++p; + yy3 : { return 0; } + yy4: + yych = *(marker = ++p); + if (yych <= '/') { + if (yych <= '+') { + if (yych <= '*') + goto yy3; + } else { + if (yych <= ',') + goto yy3; + if (yych >= '/') + goto yy3; + } + } else { + if (yych <= 'Z') { + if (yych <= '9') + goto yy5; + if (yych <= '@') + goto yy3; + } else { + if (yych <= '`') + goto yy3; + if (yych >= '{') + goto yy3; + } + } + yy5: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych == '+') + goto yy7; + } else { + if (yych != '/') + goto yy7; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych >= 'A') + goto yy7; + } else { + if (yych <= '`') + goto yy6; + if (yych <= 'z') + goto yy7; + } + } + yy6: + p = marker; + goto yy3; + yy7: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych == '+') + goto yy10; + goto yy6; + } else { + if (yych == '/') + goto yy6; + goto yy10; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + goto yy10; + } else { + if (yych <= '`') + goto yy6; + if (yych <= 'z') + goto yy10; + goto yy6; + } + } + yy8: + ++p; + { return (bufsize_t)(p - start); } + yy10: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy6; + } else { + if (yych == '/') + goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy8; + if (yych <= '@') + goto yy6; + } else { + if (yych <= '`') + goto yy6; + if (yych >= '{') + goto yy6; + } + } + ++p; + if ((yych = *p) == ':') + goto yy8; + goto yy6; + } +} + +// Try to match URI autolink after first <, returning number of chars matched. +bufsize_t _scan_autolink_uri(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 0, 128, 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }; + yych = *p; + if (yych <= '@') + goto yy41; + if (yych <= 'Z') + goto yy43; + if (yych <= '`') + goto yy41; + if (yych <= 'z') + goto yy43; + yy41: + ++p; + yy42 : { return 0; } + yy43: + yych = *(marker = ++p); + if (yych <= '/') { + if (yych <= '+') { + if (yych <= '*') + goto yy42; + } else { + if (yych <= ',') + goto yy42; + if (yych >= '/') + goto yy42; + } + } else { + if (yych <= 'Z') { + if (yych <= '9') + goto yy44; + if (yych <= '@') + goto yy42; + } else { + if (yych <= '`') + goto yy42; + if (yych >= '{') + goto yy42; + } + } + yy44: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych == '+') + goto yy46; + } else { + if (yych != '/') + goto yy46; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych >= 'A') + goto yy46; + } else { + if (yych <= '`') + goto yy45; + if (yych <= 'z') + goto yy46; + } + } + yy45: + p = marker; + goto yy42; + yy46: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych == '+') + goto yy49; + goto yy45; + } else { + if (yych == '/') + goto yy45; + goto yy49; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + goto yy49; + } else { + if (yych <= '`') + goto yy45; + if (yych <= 'z') + goto yy49; + goto yy45; + } + } + yy47: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy47; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '<') + goto yy45; + if (yych <= '>') + goto yy50; + goto yy45; + } else { + if (yych <= 0xDF) + goto yy52; + if (yych <= 0xE0) + goto yy53; + goto yy54; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy55; + if (yych <= 0xEF) + goto yy54; + goto yy56; + } else { + if (yych <= 0xF3) + goto yy57; + if (yych <= 0xF4) + goto yy58; + goto yy45; + } + } + yy49: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych == '+') + goto yy59; + goto yy45; + } else { + if (yych == '/') + goto yy45; + goto yy59; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + goto yy59; + } else { + if (yych <= '`') + goto yy45; + if (yych <= 'z') + goto yy59; + goto yy45; + } + } + yy50: + ++p; + { return (bufsize_t)(p - start); } + yy52: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy45; + if (yych <= 0xBF) + goto yy47; + goto yy45; + yy53: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy45; + if (yych <= 0xBF) + goto yy52; + goto yy45; + yy54: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy45; + if (yych <= 0xBF) + goto yy52; + goto yy45; + yy55: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy45; + if (yych <= 0x9F) + goto yy52; + goto yy45; + yy56: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy45; + if (yych <= 0xBF) + goto yy54; + goto yy45; + yy57: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy45; + if (yych <= 0xBF) + goto yy54; + goto yy45; + yy58: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy45; + if (yych <= 0x8F) + goto yy54; + goto yy45; + yy59: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') + goto yy45; + } else { + if (yych == '/') + goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') + goto yy47; + if (yych <= '@') + goto yy45; + } else { + if (yych <= '`') + goto yy45; + if (yych >= '{') + goto yy45; + } + } + ++p; + if ((yych = *p) == ':') + goto yy47; + goto yy45; + } +} + +// Try to match email autolink after first <, returning num of chars matched. +bufsize_t _scan_autolink_email(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 128, 128, 128, 128, 128, 0, 0, + 128, 128, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 128, 0, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }; + yych = *p; + if (yych <= '9') { + if (yych <= '\'') { + if (yych == '!') + goto yy91; + if (yych >= '#') + goto yy91; + } else { + if (yych <= ')') + goto yy89; + if (yych != ',') + goto yy91; + } + } else { + if (yych <= '?') { + if (yych == '=') + goto yy91; + if (yych >= '?') + goto yy91; + } else { + if (yych <= 'Z') { + if (yych >= 'A') + goto yy91; + } else { + if (yych <= ']') + goto yy89; + if (yych <= '~') + goto yy91; + } + } + } + yy89: + ++p; + yy90 : { return 0; } + yy91: + yych = *(marker = ++p); + if (yych <= ',') { + if (yych <= '"') { + if (yych == '!') + goto yy93; + goto yy90; + } else { + if (yych <= '\'') + goto yy93; + if (yych <= ')') + goto yy90; + if (yych <= '+') + goto yy93; + goto yy90; + } + } else { + if (yych <= '>') { + if (yych <= '9') + goto yy93; + if (yych == '=') + goto yy93; + goto yy90; + } else { + if (yych <= 'Z') + goto yy93; + if (yych <= ']') + goto yy90; + if (yych <= '~') + goto yy93; + goto yy90; + } + } + yy92: + ++p; + yych = *p; + yy93: + if (yybm[0 + yych] & 128) { + goto yy92; + } + if (yych <= '>') + goto yy94; + if (yych <= '@') + goto yy95; + yy94: + p = marker; + goto yy90; + yy95: + ++p; + yych = *p; + if (yych <= '@') { + if (yych <= '/') + goto yy94; + if (yych >= ':') + goto yy94; + } else { + if (yych <= 'Z') + goto yy96; + if (yych <= '`') + goto yy94; + if (yych >= '{') + goto yy94; + } + yy96: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy98; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy98; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy98; + goto yy94; + } + } + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy101; + if (yych <= '/') + goto yy94; + goto yy102; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy102; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy102; + goto yy94; + } + } + yy98: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych <= '-') + goto yy101; + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy102; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy102; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy102; + goto yy94; + } + } + yy99: + ++p; + { return (bufsize_t)(p - start); } + yy101: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy103; + if (yych <= '/') + goto yy94; + goto yy104; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy104; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy104; + goto yy94; + } + } + yy102: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy104; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy104; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy104; + goto yy94; + } + } + yy103: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy105; + if (yych <= '/') + goto yy94; + goto yy106; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy106; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy106; + goto yy94; + } + } + yy104: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy106; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy106; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy106; + goto yy94; + } + } + yy105: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy107; + if (yych <= '/') + goto yy94; + goto yy108; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy108; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy108; + goto yy94; + } + } + yy106: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy108; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy108; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy108; + goto yy94; + } + } + yy107: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy109; + if (yych <= '/') + goto yy94; + goto yy110; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy110; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy110; + goto yy94; + } + } + yy108: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy110; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy110; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy110; + goto yy94; + } + } + yy109: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy111; + if (yych <= '/') + goto yy94; + goto yy112; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy112; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy112; + goto yy94; + } + } + yy110: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy112; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy112; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy112; + goto yy94; + } + } + yy111: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy113; + if (yych <= '/') + goto yy94; + goto yy114; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy114; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy114; + goto yy94; + } + } + yy112: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy114; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy114; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy114; + goto yy94; + } + } + yy113: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy115; + if (yych <= '/') + goto yy94; + goto yy116; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy116; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy116; + goto yy94; + } + } + yy114: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy116; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy116; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy116; + goto yy94; + } + } + yy115: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy117; + if (yych <= '/') + goto yy94; + goto yy118; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy118; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy118; + goto yy94; + } + } + yy116: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy118; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy118; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy118; + goto yy94; + } + } + yy117: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy119; + if (yych <= '/') + goto yy94; + goto yy120; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy120; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy120; + goto yy94; + } + } + yy118: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy120; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy120; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy120; + goto yy94; + } + } + yy119: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy121; + if (yych <= '/') + goto yy94; + goto yy122; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy122; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy122; + goto yy94; + } + } + yy120: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy122; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy122; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy122; + goto yy94; + } + } + yy121: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy123; + if (yych <= '/') + goto yy94; + goto yy124; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy124; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy124; + goto yy94; + } + } + yy122: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy124; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy124; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy124; + goto yy94; + } + } + yy123: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy125; + if (yych <= '/') + goto yy94; + goto yy126; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy126; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy126; + goto yy94; + } + } + yy124: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy126; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy126; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy126; + goto yy94; + } + } + yy125: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy127; + if (yych <= '/') + goto yy94; + goto yy128; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy128; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy128; + goto yy94; + } + } + yy126: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy128; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy128; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy128; + goto yy94; + } + } + yy127: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy129; + if (yych <= '/') + goto yy94; + goto yy130; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy130; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy130; + goto yy94; + } + } + yy128: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy130; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy130; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy130; + goto yy94; + } + } + yy129: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy131; + if (yych <= '/') + goto yy94; + goto yy132; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy132; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy132; + goto yy94; + } + } + yy130: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy132; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy132; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy132; + goto yy94; + } + } + yy131: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy133; + if (yych <= '/') + goto yy94; + goto yy134; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy134; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy134; + goto yy94; + } + } + yy132: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy134; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy134; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy134; + goto yy94; + } + } + yy133: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy135; + if (yych <= '/') + goto yy94; + goto yy136; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy136; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy136; + goto yy94; + } + } + yy134: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy136; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy136; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy136; + goto yy94; + } + } + yy135: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy137; + if (yych <= '/') + goto yy94; + goto yy138; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy138; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy138; + goto yy94; + } + } + yy136: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy138; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy138; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy138; + goto yy94; + } + } + yy137: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy139; + if (yych <= '/') + goto yy94; + goto yy140; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy140; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy140; + goto yy94; + } + } + yy138: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy140; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy140; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy140; + goto yy94; + } + } + yy139: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy141; + if (yych <= '/') + goto yy94; + goto yy142; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy142; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy142; + goto yy94; + } + } + yy140: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy142; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy142; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy142; + goto yy94; + } + } + yy141: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy143; + if (yych <= '/') + goto yy94; + goto yy144; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy144; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy144; + goto yy94; + } + } + yy142: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy144; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy144; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy144; + goto yy94; + } + } + yy143: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy145; + if (yych <= '/') + goto yy94; + goto yy146; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy146; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy146; + goto yy94; + } + } + yy144: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy146; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy146; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy146; + goto yy94; + } + } + yy145: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy147; + if (yych <= '/') + goto yy94; + goto yy148; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy148; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy148; + goto yy94; + } + } + yy146: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy148; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy148; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy148; + goto yy94; + } + } + yy147: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy149; + if (yych <= '/') + goto yy94; + goto yy150; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy150; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy150; + goto yy94; + } + } + yy148: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy150; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy150; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy150; + goto yy94; + } + } + yy149: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy151; + if (yych <= '/') + goto yy94; + goto yy152; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy152; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy152; + goto yy94; + } + } + yy150: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy152; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy152; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy152; + goto yy94; + } + } + yy151: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy153; + if (yych <= '/') + goto yy94; + goto yy154; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy154; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy154; + goto yy94; + } + } + yy152: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy154; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy154; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy154; + goto yy94; + } + } + yy153: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy155; + if (yych <= '/') + goto yy94; + goto yy156; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy156; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy156; + goto yy94; + } + } + yy154: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy156; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy156; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy156; + goto yy94; + } + } + yy155: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy157; + if (yych <= '/') + goto yy94; + goto yy158; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy158; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy158; + goto yy94; + } + } + yy156: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy158; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy158; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy158; + goto yy94; + } + } + yy157: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy159; + if (yych <= '/') + goto yy94; + goto yy160; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy160; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy160; + goto yy94; + } + } + yy158: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy160; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy160; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy160; + goto yy94; + } + } + yy159: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy161; + if (yych <= '/') + goto yy94; + goto yy162; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy162; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy162; + goto yy94; + } + } + yy160: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy162; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy162; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy162; + goto yy94; + } + } + yy161: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy163; + if (yych <= '/') + goto yy94; + goto yy164; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy164; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy164; + goto yy94; + } + } + yy162: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy164; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy164; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy164; + goto yy94; + } + } + yy163: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy165; + if (yych <= '/') + goto yy94; + goto yy166; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy166; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy166; + goto yy94; + } + } + yy164: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy166; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy166; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy166; + goto yy94; + } + } + yy165: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy167; + if (yych <= '/') + goto yy94; + goto yy168; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy168; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy168; + goto yy94; + } + } + yy166: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy168; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy168; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy168; + goto yy94; + } + } + yy167: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy169; + if (yych <= '/') + goto yy94; + goto yy170; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy170; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy170; + goto yy94; + } + } + yy168: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy170; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy170; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy170; + goto yy94; + } + } + yy169: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy171; + if (yych <= '/') + goto yy94; + goto yy172; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy172; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy172; + goto yy94; + } + } + yy170: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy172; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy172; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy172; + goto yy94; + } + } + yy171: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy173; + if (yych <= '/') + goto yy94; + goto yy174; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy174; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy174; + goto yy94; + } + } + yy172: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy174; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy174; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy174; + goto yy94; + } + } + yy173: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy175; + if (yych <= '/') + goto yy94; + goto yy176; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy176; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy176; + goto yy94; + } + } + yy174: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy176; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy176; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy176; + goto yy94; + } + } + yy175: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy177; + if (yych <= '/') + goto yy94; + goto yy178; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy178; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy178; + goto yy94; + } + } + yy176: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy178; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy178; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy178; + goto yy94; + } + } + yy177: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy179; + if (yych <= '/') + goto yy94; + goto yy180; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy180; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy180; + goto yy94; + } + } + yy178: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy180; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy180; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy180; + goto yy94; + } + } + yy179: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy181; + if (yych <= '/') + goto yy94; + goto yy182; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy182; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy182; + goto yy94; + } + } + yy180: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy182; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy182; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy182; + goto yy94; + } + } + yy181: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy183; + if (yych <= '/') + goto yy94; + goto yy184; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy184; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy184; + goto yy94; + } + } + yy182: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy184; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy184; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy184; + goto yy94; + } + } + yy183: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy185; + if (yych <= '/') + goto yy94; + goto yy186; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy186; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy186; + goto yy94; + } + } + yy184: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy186; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy186; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy186; + goto yy94; + } + } + yy185: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy187; + if (yych <= '/') + goto yy94; + goto yy188; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy188; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy188; + goto yy94; + } + } + yy186: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy188; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy188; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy188; + goto yy94; + } + } + yy187: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy189; + if (yych <= '/') + goto yy94; + goto yy190; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy190; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy190; + goto yy94; + } + } + yy188: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy190; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy190; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy190; + goto yy94; + } + } + yy189: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy191; + if (yych <= '/') + goto yy94; + goto yy192; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy192; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy192; + goto yy94; + } + } + yy190: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy192; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy192; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy192; + goto yy94; + } + } + yy191: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy193; + if (yych <= '/') + goto yy94; + goto yy194; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy194; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy194; + goto yy94; + } + } + yy192: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy194; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy194; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy194; + goto yy94; + } + } + yy193: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy195; + if (yych <= '/') + goto yy94; + goto yy196; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy196; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy196; + goto yy94; + } + } + yy194: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy196; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy196; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy196; + goto yy94; + } + } + yy195: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy197; + if (yych <= '/') + goto yy94; + goto yy198; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy198; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy198; + goto yy94; + } + } + yy196: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy198; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy198; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy198; + goto yy94; + } + } + yy197: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy199; + if (yych <= '/') + goto yy94; + goto yy200; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy200; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy200; + goto yy94; + } + } + yy198: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy200; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy200; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy200; + goto yy94; + } + } + yy199: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy201; + if (yych <= '/') + goto yy94; + goto yy202; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy202; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy202; + goto yy94; + } + } + yy200: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy202; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy202; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy202; + goto yy94; + } + } + yy201: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy203; + if (yych <= '/') + goto yy94; + goto yy204; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy204; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy204; + goto yy94; + } + } + yy202: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy204; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy204; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy204; + goto yy94; + } + } + yy203: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy205; + if (yych <= '/') + goto yy94; + goto yy206; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy206; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy206; + goto yy94; + } + } + yy204: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy206; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy206; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy206; + goto yy94; + } + } + yy205: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy207; + if (yych <= '/') + goto yy94; + goto yy208; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy208; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy208; + goto yy94; + } + } + yy206: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy208; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy208; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy208; + goto yy94; + } + } + yy207: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy209; + if (yych <= '/') + goto yy94; + goto yy210; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy210; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy210; + goto yy94; + } + } + yy208: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy210; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy210; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy210; + goto yy94; + } + } + yy209: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy211; + if (yych <= '/') + goto yy94; + goto yy212; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy212; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy212; + goto yy94; + } + } + yy210: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy212; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy212; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy212; + goto yy94; + } + } + yy211: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy213; + if (yych <= '/') + goto yy94; + goto yy214; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy214; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy214; + goto yy94; + } + } + yy212: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy214; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy214; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy214; + goto yy94; + } + } + yy213: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy215; + if (yych <= '/') + goto yy94; + goto yy216; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy216; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy216; + goto yy94; + } + } + yy214: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy216; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy216; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy216; + goto yy94; + } + } + yy215: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy217; + if (yych <= '/') + goto yy94; + goto yy218; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy218; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy218; + goto yy94; + } + } + yy216: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy218; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy218; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy218; + goto yy94; + } + } + yy217: + ++p; + yych = *p; + if (yych <= '9') { + if (yych == '-') + goto yy219; + if (yych <= '/') + goto yy94; + goto yy220; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy94; + goto yy220; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy220; + goto yy94; + } + } + yy218: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') + goto yy94; + if (yych >= '.') + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy220; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + goto yy220; + } else { + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy220; + goto yy94; + } + } + yy219: + ++p; + yych = *p; + if (yych <= '@') { + if (yych <= '/') + goto yy94; + if (yych <= '9') + goto yy221; + goto yy94; + } else { + if (yych <= 'Z') + goto yy221; + if (yych <= '`') + goto yy94; + if (yych <= 'z') + goto yy221; + goto yy94; + } + yy220: + ++p; + yych = *p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= '-') + goto yy94; + goto yy95; + } else { + if (yych <= '/') + goto yy94; + if (yych >= ':') + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy99; + if (yych <= '@') + goto yy94; + } else { + if (yych <= '`') + goto yy94; + if (yych >= '{') + goto yy94; + } + } + yy221: + ++p; + yych = *p; + if (yych == '.') + goto yy95; + if (yych == '>') + goto yy99; + goto yy94; + } +} + +// Try to match an HTML tag after first <, returning num of chars matched. +bufsize_t _scan_html_tag(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + static const unsigned char yybm[] = { + /* table 1 .. 8: 0 */ + 0, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 235, + 235, + 235, + 235, + 235, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 250, + 235, + 250, + 202, + 250, + 250, + 250, + 250, + 170, + 250, + 250, + 250, + 250, + 250, + 246, + 254, + 250, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 250, + 234, + 234, + 232, + 250, + 250, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 250, + 250, + 122, + 250, + 254, + 234, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 254, + 250, + 250, + 250, + 250, + 250, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + /* table 9 .. 11: 256 */ + 0, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 128, + 192, + 128, + 128, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 128, + 128, + 128, + 128, + 128, + 0, + 128, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 224, + 128, + 128, + 128, + 128, + 128, + 128, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 192, + 128, + 128, + 128, + 128, + 128, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + }; + yych = *p; + if (yych <= '>') { + if (yych <= '!') { + if (yych >= '!') + goto yy226; + } else { + if (yych == '/') + goto yy227; + } + } else { + if (yych <= 'Z') { + if (yych <= '?') + goto yy228; + if (yych >= 'A') + goto yy229; + } else { + if (yych <= '`') + goto yy224; + if (yych <= 'z') + goto yy229; + } + } + yy224: + ++p; + yy225 : { return 0; } + yy226: + yych = *(marker = ++p); + if (yybm[256 + yych] & 32) { + goto yy232; + } + if (yych == '-') + goto yy230; + if (yych <= '@') + goto yy225; + if (yych <= '[') + goto yy234; + goto yy225; + yy227: + yych = *(marker = ++p); + if (yych <= '@') + goto yy225; + if (yych <= 'Z') + goto yy235; + if (yych <= '`') + goto yy225; + if (yych <= 'z') + goto yy235; + goto yy225; + yy228: + yych = *(marker = ++p); + if (yych <= 0x00) + goto yy225; + if (yych <= 0x7F) + goto yy238; + if (yych <= 0xC1) + goto yy225; + if (yych <= 0xF4) + goto yy238; + goto yy225; + yy229: + yych = *(marker = ++p); + if (yybm[0 + yych] & 1) { + goto yy247; + } + if (yych <= '=') { + if (yych <= '.') { + if (yych == '-') + goto yy249; + goto yy225; + } else { + if (yych <= '/') + goto yy251; + if (yych <= '9') + goto yy249; + goto yy225; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy252; + if (yych <= '@') + goto yy225; + goto yy249; + } else { + if (yych <= '`') + goto yy225; + if (yych <= 'z') + goto yy249; + goto yy225; + } + } + yy230: + yych = *++p; + if (yych == '-') + goto yy254; + yy231: + p = marker; + goto yy225; + yy232: + ++p; + yych = *p; + if (yybm[256 + yych] & 32) { + goto yy232; + } + if (yych <= 0x08) + goto yy231; + if (yych <= '\r') + goto yy255; + if (yych == ' ') + goto yy255; + goto yy231; + yy234: + yych = *++p; + if (yych == 'C') + goto yy257; + if (yych == 'c') + goto yy257; + goto yy231; + yy235: + ++p; + yych = *p; + if (yybm[256 + yych] & 64) { + goto yy235; + } + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy231; + if (yych <= '\r') + goto yy258; + goto yy231; + } else { + if (yych <= ' ') + goto yy258; + if (yych == '>') + goto yy252; + goto yy231; + } + yy237: + ++p; + yych = *p; + yy238: + if (yybm[256 + yych] & 128) { + goto yy237; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy231; + if (yych >= '@') + goto yy231; + } else { + if (yych <= 0xDF) + goto yy240; + if (yych <= 0xE0) + goto yy241; + goto yy242; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy243; + if (yych <= 0xEF) + goto yy242; + goto yy244; + } else { + if (yych <= 0xF3) + goto yy245; + if (yych <= 0xF4) + goto yy246; + goto yy231; + } + } + ++p; + yych = *p; + if (yych <= 0xE0) { + if (yych <= '>') { + if (yych <= 0x00) + goto yy231; + if (yych <= '=') + goto yy237; + goto yy252; + } else { + if (yych <= 0x7F) + goto yy237; + if (yych <= 0xC1) + goto yy231; + if (yych >= 0xE0) + goto yy241; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy243; + goto yy242; + } else { + if (yych <= 0xF0) + goto yy244; + if (yych <= 0xF3) + goto yy245; + if (yych <= 0xF4) + goto yy246; + goto yy231; + } + } + yy240: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy237; + goto yy231; + yy241: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy231; + if (yych <= 0xBF) + goto yy240; + goto yy231; + yy242: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy240; + goto yy231; + yy243: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x9F) + goto yy240; + goto yy231; + yy244: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy231; + if (yych <= 0xBF) + goto yy242; + goto yy231; + yy245: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy242; + goto yy231; + yy246: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x8F) + goto yy242; + goto yy231; + yy247: + ++p; + yych = *p; + if (yybm[0 + yych] & 1) { + goto yy247; + } + if (yych <= '>') { + if (yych <= '9') { + if (yych == '/') + goto yy251; + goto yy231; + } else { + if (yych <= ':') + goto yy260; + if (yych <= '=') + goto yy231; + goto yy252; + } + } else { + if (yych <= '^') { + if (yych <= '@') + goto yy231; + if (yych <= 'Z') + goto yy260; + goto yy231; + } else { + if (yych == '`') + goto yy231; + if (yych <= 'z') + goto yy260; + goto yy231; + } + } + yy249: + ++p; + yych = *p; + if (yybm[0 + yych] & 1) { + goto yy247; + } + if (yych <= '=') { + if (yych <= '.') { + if (yych == '-') + goto yy249; + goto yy231; + } else { + if (yych <= '/') + goto yy251; + if (yych <= '9') + goto yy249; + goto yy231; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy252; + if (yych <= '@') + goto yy231; + goto yy249; + } else { + if (yych <= '`') + goto yy231; + if (yych <= 'z') + goto yy249; + goto yy231; + } + } + yy251: + yych = *++p; + if (yych != '>') + goto yy231; + yy252: + ++p; + { return (bufsize_t)(p - start); } + yy254: + yych = *++p; + if (yych == '-') + goto yy264; + if (yych == '>') + goto yy231; + goto yy263; + yy255: + ++p; + yych = *p; + if (yybm[0 + yych] & 2) { + goto yy255; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy231; + if (yych <= '>') + goto yy252; + goto yy231; + } else { + if (yych <= 0xDF) + goto yy272; + if (yych <= 0xE0) + goto yy273; + goto yy274; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy275; + if (yych <= 0xEF) + goto yy274; + goto yy276; + } else { + if (yych <= 0xF3) + goto yy277; + if (yych <= 0xF4) + goto yy278; + goto yy231; + } + } + yy257: + yych = *++p; + if (yych == 'D') + goto yy279; + if (yych == 'd') + goto yy279; + goto yy231; + yy258: + ++p; + yych = *p; + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy231; + if (yych <= '\r') + goto yy258; + goto yy231; + } else { + if (yych <= ' ') + goto yy258; + if (yych == '>') + goto yy252; + goto yy231; + } + yy260: + ++p; + yych = *p; + if (yybm[0 + yych] & 4) { + goto yy260; + } + if (yych <= ',') { + if (yych <= '\r') { + if (yych <= 0x08) + goto yy231; + goto yy280; + } else { + if (yych == ' ') + goto yy280; + goto yy231; + } + } else { + if (yych <= '<') { + if (yych <= '/') + goto yy251; + goto yy231; + } else { + if (yych <= '=') + goto yy282; + if (yych <= '>') + goto yy252; + goto yy231; + } + } + yy262: + ++p; + yych = *p; + yy263: + if (yybm[0 + yych] & 8) { + goto yy262; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy231; + if (yych <= '-') + goto yy284; + goto yy231; + } else { + if (yych <= 0xDF) + goto yy265; + if (yych <= 0xE0) + goto yy266; + goto yy267; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy268; + if (yych <= 0xEF) + goto yy267; + goto yy269; + } else { + if (yych <= 0xF3) + goto yy270; + if (yych <= 0xF4) + goto yy271; + goto yy231; + } + } + yy264: + yych = *++p; + if (yych == '-') + goto yy251; + if (yych == '>') + goto yy231; + goto yy263; + yy265: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy262; + goto yy231; + yy266: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy231; + if (yych <= 0xBF) + goto yy265; + goto yy231; + yy267: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy265; + goto yy231; + yy268: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x9F) + goto yy265; + goto yy231; + yy269: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy231; + if (yych <= 0xBF) + goto yy267; + goto yy231; + yy270: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy267; + goto yy231; + yy271: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x8F) + goto yy267; + goto yy231; + yy272: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy255; + goto yy231; + yy273: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy231; + if (yych <= 0xBF) + goto yy272; + goto yy231; + yy274: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy272; + goto yy231; + yy275: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x9F) + goto yy272; + goto yy231; + yy276: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy231; + if (yych <= 0xBF) + goto yy274; + goto yy231; + yy277: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy274; + goto yy231; + yy278: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x8F) + goto yy274; + goto yy231; + yy279: + yych = *++p; + if (yych == 'A') + goto yy285; + if (yych == 'a') + goto yy285; + goto yy231; + yy280: + ++p; + yych = *p; + if (yych <= '<') { + if (yych <= ' ') { + if (yych <= 0x08) + goto yy231; + if (yych <= '\r') + goto yy280; + if (yych <= 0x1F) + goto yy231; + goto yy280; + } else { + if (yych <= '/') { + if (yych <= '.') + goto yy231; + goto yy251; + } else { + if (yych == ':') + goto yy260; + goto yy231; + } + } + } else { + if (yych <= 'Z') { + if (yych <= '=') + goto yy282; + if (yych <= '>') + goto yy252; + if (yych <= '@') + goto yy231; + goto yy260; + } else { + if (yych <= '_') { + if (yych <= '^') + goto yy231; + goto yy260; + } else { + if (yych <= '`') + goto yy231; + if (yych <= 'z') + goto yy260; + goto yy231; + } + } + } + yy282: + ++p; + yych = *p; + if (yybm[0 + yych] & 16) { + goto yy286; + } + if (yych <= 0xE0) { + if (yych <= '"') { + if (yych <= 0x00) + goto yy231; + if (yych <= ' ') + goto yy282; + goto yy288; + } else { + if (yych <= '\'') + goto yy290; + if (yych <= 0xC1) + goto yy231; + if (yych <= 0xDF) + goto yy292; + goto yy293; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy295; + goto yy294; + } else { + if (yych <= 0xF0) + goto yy296; + if (yych <= 0xF3) + goto yy297; + if (yych <= 0xF4) + goto yy298; + goto yy231; + } + } + yy284: + ++p; + yych = *p; + if (yybm[0 + yych] & 8) { + goto yy262; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy231; + if (yych <= '-') + goto yy251; + goto yy231; + } else { + if (yych <= 0xDF) + goto yy265; + if (yych <= 0xE0) + goto yy266; + goto yy267; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy268; + if (yych <= 0xEF) + goto yy267; + goto yy269; + } else { + if (yych <= 0xF3) + goto yy270; + if (yych <= 0xF4) + goto yy271; + goto yy231; + } + } + yy285: + yych = *++p; + if (yych == 'T') + goto yy299; + if (yych == 't') + goto yy299; + goto yy231; + yy286: + ++p; + yych = *p; + if (yybm[0 + yych] & 16) { + goto yy286; + } + if (yych <= 0xE0) { + if (yych <= '=') { + if (yych <= 0x00) + goto yy231; + if (yych <= ' ') + goto yy247; + goto yy231; + } else { + if (yych <= '>') + goto yy252; + if (yych <= 0xC1) + goto yy231; + if (yych <= 0xDF) + goto yy292; + goto yy293; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy295; + goto yy294; + } else { + if (yych <= 0xF0) + goto yy296; + if (yych <= 0xF3) + goto yy297; + if (yych <= 0xF4) + goto yy298; + goto yy231; + } + } + yy288: + ++p; + yych = *p; + if (yybm[0 + yych] & 32) { + goto yy288; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy231; + if (yych <= '"') + goto yy300; + goto yy231; + } else { + if (yych <= 0xDF) + goto yy301; + if (yych <= 0xE0) + goto yy302; + goto yy303; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy304; + if (yych <= 0xEF) + goto yy303; + goto yy305; + } else { + if (yych <= 0xF3) + goto yy306; + if (yych <= 0xF4) + goto yy307; + goto yy231; + } + } + yy290: + ++p; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy290; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy231; + if (yych <= '\'') + goto yy300; + goto yy231; + } else { + if (yych <= 0xDF) + goto yy308; + if (yych <= 0xE0) + goto yy309; + goto yy310; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy311; + if (yych <= 0xEF) + goto yy310; + goto yy312; + } else { + if (yych <= 0xF3) + goto yy313; + if (yych <= 0xF4) + goto yy314; + goto yy231; + } + } + yy292: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy286; + goto yy231; + yy293: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy231; + if (yych <= 0xBF) + goto yy292; + goto yy231; + yy294: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy292; + goto yy231; + yy295: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x9F) + goto yy292; + goto yy231; + yy296: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy231; + if (yych <= 0xBF) + goto yy294; + goto yy231; + yy297: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy294; + goto yy231; + yy298: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x8F) + goto yy294; + goto yy231; + yy299: + yych = *++p; + if (yych == 'A') + goto yy315; + if (yych == 'a') + goto yy315; + goto yy231; + yy300: + ++p; + yych = *p; + if (yybm[0 + yych] & 1) { + goto yy247; + } + if (yych == '/') + goto yy251; + if (yych == '>') + goto yy252; + goto yy231; + yy301: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy288; + goto yy231; + yy302: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy231; + if (yych <= 0xBF) + goto yy301; + goto yy231; + yy303: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy301; + goto yy231; + yy304: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x9F) + goto yy301; + goto yy231; + yy305: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy231; + if (yych <= 0xBF) + goto yy303; + goto yy231; + yy306: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy303; + goto yy231; + yy307: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x8F) + goto yy303; + goto yy231; + yy308: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy290; + goto yy231; + yy309: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy231; + if (yych <= 0xBF) + goto yy308; + goto yy231; + yy310: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy308; + goto yy231; + yy311: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x9F) + goto yy308; + goto yy231; + yy312: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy231; + if (yych <= 0xBF) + goto yy310; + goto yy231; + yy313: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy310; + goto yy231; + yy314: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x8F) + goto yy310; + goto yy231; + yy315: + yych = *++p; + if (yych != '[') + goto yy231; + yy316: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy316; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy231; + if (yych >= '^') + goto yy231; + } else { + if (yych <= 0xDF) + goto yy319; + if (yych <= 0xE0) + goto yy320; + goto yy321; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy322; + if (yych <= 0xEF) + goto yy321; + goto yy323; + } else { + if (yych <= 0xF3) + goto yy324; + if (yych <= 0xF4) + goto yy325; + goto yy231; + } + } + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy316; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy231; + if (yych <= ']') + goto yy326; + goto yy231; + } else { + if (yych <= 0xDF) + goto yy319; + if (yych <= 0xE0) + goto yy320; + goto yy321; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy322; + if (yych <= 0xEF) + goto yy321; + goto yy323; + } else { + if (yych <= 0xF3) + goto yy324; + if (yych <= 0xF4) + goto yy325; + goto yy231; + } + } + yy319: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy316; + goto yy231; + yy320: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy231; + if (yych <= 0xBF) + goto yy319; + goto yy231; + yy321: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy319; + goto yy231; + yy322: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x9F) + goto yy319; + goto yy231; + yy323: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy231; + if (yych <= 0xBF) + goto yy321; + goto yy231; + yy324: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0xBF) + goto yy321; + goto yy231; + yy325: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy231; + if (yych <= 0x8F) + goto yy321; + goto yy231; + yy326: + ++p; + yych = *p; + if (yych <= 0xE0) { + if (yych <= '>') { + if (yych <= 0x00) + goto yy231; + if (yych <= '=') + goto yy316; + goto yy252; + } else { + if (yych <= 0x7F) + goto yy316; + if (yych <= 0xC1) + goto yy231; + if (yych <= 0xDF) + goto yy319; + goto yy320; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy322; + goto yy321; + } else { + if (yych <= 0xF0) + goto yy323; + if (yych <= 0xF3) + goto yy324; + if (yych <= 0xF4) + goto yy325; + goto yy231; + } + } + } +} + +// Try to match an HTML block tag start line, returning +// an integer code for the type of block (1-6, matching the spec). +// #7 is handled by a separate function, below. +bufsize_t _scan_html_block_start(const unsigned char *p) { + const unsigned char *marker = NULL; + + { + unsigned char yych; + yych = *p; + if (yych == '<') + goto yy331; + ++p; + yy330 : { return 0; } + yy331: + yych = *(marker = ++p); + switch (yych) { + case '!': + goto yy332; + case '/': + goto yy334; + case '?': + goto yy335; + case 'A': + case 'a': + goto yy337; + case 'B': + case 'b': + goto yy338; + case 'C': + case 'c': + goto yy339; + case 'D': + case 'd': + goto yy340; + case 'F': + case 'f': + goto yy341; + case 'H': + case 'h': + goto yy342; + case 'I': + case 'i': + goto yy343; + case 'L': + case 'l': + goto yy344; + case 'M': + case 'm': + goto yy345; + case 'N': + case 'n': + goto yy346; + case 'O': + case 'o': + goto yy347; + case 'P': + case 'p': + goto yy348; + case 'S': + case 's': + goto yy349; + case 'T': + case 't': + goto yy350; + case 'U': + case 'u': + goto yy351; + default: + goto yy330; + } + yy332: + yych = *++p; + if (yych <= '@') { + if (yych == '-') + goto yy352; + } else { + if (yych <= 'Z') + goto yy353; + if (yych <= '[') + goto yy355; + } + yy333: + p = marker; + goto yy330; + yy334: + yych = *++p; + switch (yych) { + case 'A': + case 'a': + goto yy337; + case 'B': + case 'b': + goto yy338; + case 'C': + case 'c': + goto yy339; + case 'D': + case 'd': + goto yy340; + case 'F': + case 'f': + goto yy341; + case 'H': + case 'h': + goto yy342; + case 'I': + case 'i': + goto yy343; + case 'L': + case 'l': + goto yy344; + case 'M': + case 'm': + goto yy345; + case 'N': + case 'n': + goto yy346; + case 'O': + case 'o': + goto yy347; + case 'P': + case 'p': + goto yy356; + case 'S': + case 's': + goto yy357; + case 'T': + case 't': + goto yy350; + case 'U': + case 'u': + goto yy351; + default: + goto yy333; + } + yy335: + ++p; + { return 3; } + yy337: + yych = *++p; + if (yych <= 'S') { + if (yych <= 'D') { + if (yych <= 'C') + goto yy333; + goto yy358; + } else { + if (yych <= 'Q') + goto yy333; + if (yych <= 'R') + goto yy359; + goto yy360; + } + } else { + if (yych <= 'q') { + if (yych == 'd') + goto yy358; + goto yy333; + } else { + if (yych <= 'r') + goto yy359; + if (yych <= 's') + goto yy360; + goto yy333; + } + } + yy338: + yych = *++p; + if (yych <= 'O') { + if (yych <= 'K') { + if (yych == 'A') + goto yy361; + goto yy333; + } else { + if (yych <= 'L') + goto yy362; + if (yych <= 'N') + goto yy333; + goto yy363; + } + } else { + if (yych <= 'k') { + if (yych == 'a') + goto yy361; + goto yy333; + } else { + if (yych <= 'l') + goto yy362; + if (yych == 'o') + goto yy363; + goto yy333; + } + } + yy339: + yych = *++p; + if (yych <= 'O') { + if (yych <= 'D') { + if (yych == 'A') + goto yy364; + goto yy333; + } else { + if (yych <= 'E') + goto yy365; + if (yych <= 'N') + goto yy333; + goto yy366; + } + } else { + if (yych <= 'd') { + if (yych == 'a') + goto yy364; + goto yy333; + } else { + if (yych <= 'e') + goto yy365; + if (yych == 'o') + goto yy366; + goto yy333; + } + } + yy340: + yych = *++p; + switch (yych) { + case 'D': + case 'L': + case 'T': + case 'd': + case 'l': + case 't': + goto yy367; + case 'E': + case 'e': + goto yy368; + case 'I': + case 'i': + goto yy369; + default: + goto yy333; + } + yy341: + yych = *++p; + if (yych <= 'R') { + if (yych <= 'N') { + if (yych == 'I') + goto yy370; + goto yy333; + } else { + if (yych <= 'O') + goto yy371; + if (yych <= 'Q') + goto yy333; + goto yy372; + } + } else { + if (yych <= 'n') { + if (yych == 'i') + goto yy370; + goto yy333; + } else { + if (yych <= 'o') + goto yy371; + if (yych == 'r') + goto yy372; + goto yy333; + } + } + yy342: + yych = *++p; + if (yych <= 'S') { + if (yych <= 'D') { + if (yych <= '0') + goto yy333; + if (yych <= '6') + goto yy367; + goto yy333; + } else { + if (yych <= 'E') + goto yy373; + if (yych == 'R') + goto yy367; + goto yy333; + } + } else { + if (yych <= 'q') { + if (yych <= 'T') + goto yy374; + if (yych == 'e') + goto yy373; + goto yy333; + } else { + if (yych <= 'r') + goto yy367; + if (yych == 't') + goto yy374; + goto yy333; + } + } + yy343: + yych = *++p; + if (yych == 'F') + goto yy375; + if (yych == 'f') + goto yy375; + goto yy333; + yy344: + yych = *++p; + if (yych <= 'I') { + if (yych == 'E') + goto yy376; + if (yych <= 'H') + goto yy333; + goto yy377; + } else { + if (yych <= 'e') { + if (yych <= 'd') + goto yy333; + goto yy376; + } else { + if (yych == 'i') + goto yy377; + goto yy333; + } + } + yy345: + yych = *++p; + if (yych <= 'E') { + if (yych == 'A') + goto yy378; + if (yych <= 'D') + goto yy333; + goto yy379; + } else { + if (yych <= 'a') { + if (yych <= '`') + goto yy333; + goto yy378; + } else { + if (yych == 'e') + goto yy379; + goto yy333; + } + } + yy346: + yych = *++p; + if (yych <= 'O') { + if (yych == 'A') + goto yy380; + if (yych <= 'N') + goto yy333; + goto yy381; + } else { + if (yych <= 'a') { + if (yych <= '`') + goto yy333; + goto yy380; + } else { + if (yych == 'o') + goto yy381; + goto yy333; + } + } + yy347: + yych = *++p; + if (yych <= 'P') { + if (yych == 'L') + goto yy367; + if (yych <= 'O') + goto yy333; + goto yy382; + } else { + if (yych <= 'l') { + if (yych <= 'k') + goto yy333; + goto yy367; + } else { + if (yych == 'p') + goto yy382; + goto yy333; + } + } + yy348: + yych = *++p; + if (yych <= '>') { + if (yych <= ' ') { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy383; + if (yych <= 0x1F) + goto yy333; + goto yy383; + } else { + if (yych == '/') + goto yy385; + if (yych <= '=') + goto yy333; + goto yy383; + } + } else { + if (yych <= 'R') { + if (yych == 'A') + goto yy386; + if (yych <= 'Q') + goto yy333; + goto yy387; + } else { + if (yych <= 'a') { + if (yych <= '`') + goto yy333; + goto yy386; + } else { + if (yych == 'r') + goto yy387; + goto yy333; + } + } + } + yy349: + yych = *++p; + switch (yych) { + case 'C': + case 'c': + goto yy388; + case 'E': + case 'e': + goto yy389; + case 'O': + case 'o': + goto yy390; + case 'T': + case 't': + goto yy391; + case 'U': + case 'u': + goto yy392; + default: + goto yy333; + } + yy350: + yych = *++p; + switch (yych) { + case 'A': + case 'a': + goto yy393; + case 'B': + case 'b': + goto yy394; + case 'D': + case 'd': + goto yy367; + case 'F': + case 'f': + goto yy395; + case 'H': + case 'h': + goto yy396; + case 'I': + case 'i': + goto yy397; + case 'R': + case 'r': + goto yy398; + default: + goto yy333; + } + yy351: + yych = *++p; + if (yych == 'L') + goto yy367; + if (yych == 'l') + goto yy367; + goto yy333; + yy352: + yych = *++p; + if (yych == '-') + goto yy399; + goto yy333; + yy353: + ++p; + { return 4; } + yy355: + yych = *++p; + if (yych == 'C') + goto yy401; + if (yych == 'c') + goto yy401; + goto yy333; + yy356: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy383; + goto yy333; + } else { + if (yych <= ' ') + goto yy383; + if (yych <= '.') + goto yy333; + goto yy385; + } + } else { + if (yych <= '@') { + if (yych == '>') + goto yy383; + goto yy333; + } else { + if (yych <= 'A') + goto yy386; + if (yych == 'a') + goto yy386; + goto yy333; + } + } + yy357: + yych = *++p; + if (yych <= 'U') { + if (yych <= 'N') { + if (yych == 'E') + goto yy389; + goto yy333; + } else { + if (yych <= 'O') + goto yy390; + if (yych <= 'T') + goto yy333; + goto yy392; + } + } else { + if (yych <= 'n') { + if (yych == 'e') + goto yy389; + goto yy333; + } else { + if (yych <= 'o') + goto yy390; + if (yych == 'u') + goto yy392; + goto yy333; + } + } + yy358: + yych = *++p; + if (yych == 'D') + goto yy402; + if (yych == 'd') + goto yy402; + goto yy333; + yy359: + yych = *++p; + if (yych == 'T') + goto yy403; + if (yych == 't') + goto yy403; + goto yy333; + yy360: + yych = *++p; + if (yych == 'I') + goto yy404; + if (yych == 'i') + goto yy404; + goto yy333; + yy361: + yych = *++p; + if (yych == 'S') + goto yy405; + if (yych == 's') + goto yy405; + goto yy333; + yy362: + yych = *++p; + if (yych == 'O') + goto yy406; + if (yych == 'o') + goto yy406; + goto yy333; + yy363: + yych = *++p; + if (yych == 'D') + goto yy407; + if (yych == 'd') + goto yy407; + goto yy333; + yy364: + yych = *++p; + if (yych == 'P') + goto yy408; + if (yych == 'p') + goto yy408; + goto yy333; + yy365: + yych = *++p; + if (yych == 'N') + goto yy409; + if (yych == 'n') + goto yy409; + goto yy333; + yy366: + yych = *++p; + if (yych == 'L') + goto yy410; + if (yych == 'l') + goto yy410; + goto yy333; + yy367: + yych = *++p; + if (yych <= ' ') { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy383; + if (yych <= 0x1F) + goto yy333; + goto yy383; + } else { + if (yych <= '/') { + if (yych <= '.') + goto yy333; + goto yy385; + } else { + if (yych == '>') + goto yy383; + goto yy333; + } + } + yy368: + yych = *++p; + if (yych == 'T') + goto yy411; + if (yych == 't') + goto yy411; + goto yy333; + yy369: + yych = *++p; + if (yych <= 'V') { + if (yych <= 'Q') { + if (yych == 'A') + goto yy412; + goto yy333; + } else { + if (yych <= 'R') + goto yy367; + if (yych <= 'U') + goto yy333; + goto yy367; + } + } else { + if (yych <= 'q') { + if (yych == 'a') + goto yy412; + goto yy333; + } else { + if (yych <= 'r') + goto yy367; + if (yych == 'v') + goto yy367; + goto yy333; + } + } + yy370: + yych = *++p; + if (yych <= 'G') { + if (yych == 'E') + goto yy413; + if (yych <= 'F') + goto yy333; + goto yy414; + } else { + if (yych <= 'e') { + if (yych <= 'd') + goto yy333; + goto yy413; + } else { + if (yych == 'g') + goto yy414; + goto yy333; + } + } + yy371: + yych = *++p; + if (yych <= 'R') { + if (yych == 'O') + goto yy409; + if (yych <= 'Q') + goto yy333; + goto yy415; + } else { + if (yych <= 'o') { + if (yych <= 'n') + goto yy333; + goto yy409; + } else { + if (yych == 'r') + goto yy415; + goto yy333; + } + } + yy372: + yych = *++p; + if (yych == 'A') + goto yy416; + if (yych == 'a') + goto yy416; + goto yy333; + yy373: + yych = *++p; + if (yych == 'A') + goto yy417; + if (yych == 'a') + goto yy417; + goto yy333; + yy374: + yych = *++p; + if (yych == 'M') + goto yy351; + if (yych == 'm') + goto yy351; + goto yy333; + yy375: + yych = *++p; + if (yych == 'R') + goto yy418; + if (yych == 'r') + goto yy418; + goto yy333; + yy376: + yych = *++p; + if (yych == 'G') + goto yy419; + if (yych == 'g') + goto yy419; + goto yy333; + yy377: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy383; + goto yy333; + } else { + if (yych <= ' ') + goto yy383; + if (yych <= '.') + goto yy333; + goto yy385; + } + } else { + if (yych <= 'M') { + if (yych == '>') + goto yy383; + goto yy333; + } else { + if (yych <= 'N') + goto yy420; + if (yych == 'n') + goto yy420; + goto yy333; + } + } + yy378: + yych = *++p; + if (yych == 'I') + goto yy421; + if (yych == 'i') + goto yy421; + goto yy333; + yy379: + yych = *++p; + if (yych == 'N') + goto yy422; + if (yych == 'n') + goto yy422; + goto yy333; + yy380: + yych = *++p; + if (yych == 'V') + goto yy367; + if (yych == 'v') + goto yy367; + goto yy333; + yy381: + yych = *++p; + if (yych == 'F') + goto yy423; + if (yych == 'f') + goto yy423; + goto yy333; + yy382: + yych = *++p; + if (yych == 'T') + goto yy424; + if (yych == 't') + goto yy424; + goto yy333; + yy383: + ++p; + { return 6; } + yy385: + yych = *++p; + if (yych == '>') + goto yy383; + goto yy333; + yy386: + yych = *++p; + if (yych == 'R') + goto yy425; + if (yych == 'r') + goto yy425; + goto yy333; + yy387: + yych = *++p; + if (yych == 'E') + goto yy426; + if (yych == 'e') + goto yy426; + goto yy333; + yy388: + yych = *++p; + if (yych == 'R') + goto yy427; + if (yych == 'r') + goto yy427; + goto yy333; + yy389: + yych = *++p; + if (yych == 'C') + goto yy408; + if (yych == 'c') + goto yy408; + goto yy333; + yy390: + yych = *++p; + if (yych == 'U') + goto yy428; + if (yych == 'u') + goto yy428; + goto yy333; + yy391: + yych = *++p; + if (yych == 'Y') + goto yy429; + if (yych == 'y') + goto yy429; + goto yy333; + yy392: + yych = *++p; + if (yych == 'M') + goto yy430; + if (yych == 'm') + goto yy430; + goto yy333; + yy393: + yych = *++p; + if (yych == 'B') + goto yy431; + if (yych == 'b') + goto yy431; + goto yy333; + yy394: + yych = *++p; + if (yych == 'O') + goto yy363; + if (yych == 'o') + goto yy363; + goto yy333; + yy395: + yych = *++p; + if (yych == 'O') + goto yy432; + if (yych == 'o') + goto yy432; + goto yy333; + yy396: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy383; + goto yy333; + } else { + if (yych <= ' ') + goto yy383; + if (yych <= '.') + goto yy333; + goto yy385; + } + } else { + if (yych <= 'D') { + if (yych == '>') + goto yy383; + goto yy333; + } else { + if (yych <= 'E') + goto yy433; + if (yych == 'e') + goto yy433; + goto yy333; + } + } + yy397: + yych = *++p; + if (yych == 'T') + goto yy431; + if (yych == 't') + goto yy431; + goto yy333; + yy398: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy383; + goto yy333; + } else { + if (yych <= ' ') + goto yy383; + if (yych <= '.') + goto yy333; + goto yy385; + } + } else { + if (yych <= '@') { + if (yych == '>') + goto yy383; + goto yy333; + } else { + if (yych <= 'A') + goto yy434; + if (yych == 'a') + goto yy434; + goto yy333; + } + } + yy399: + ++p; + { return 2; } + yy401: + yych = *++p; + if (yych == 'D') + goto yy435; + if (yych == 'd') + goto yy435; + goto yy333; + yy402: + yych = *++p; + if (yych == 'R') + goto yy436; + if (yych == 'r') + goto yy436; + goto yy333; + yy403: + yych = *++p; + if (yych == 'I') + goto yy437; + if (yych == 'i') + goto yy437; + goto yy333; + yy404: + yych = *++p; + if (yych == 'D') + goto yy438; + if (yych == 'd') + goto yy438; + goto yy333; + yy405: + yych = *++p; + if (yych == 'E') + goto yy439; + if (yych == 'e') + goto yy439; + goto yy333; + yy406: + yych = *++p; + if (yych == 'C') + goto yy440; + if (yych == 'c') + goto yy440; + goto yy333; + yy407: + yych = *++p; + if (yych == 'Y') + goto yy367; + if (yych == 'y') + goto yy367; + goto yy333; + yy408: + yych = *++p; + if (yych == 'T') + goto yy441; + if (yych == 't') + goto yy441; + goto yy333; + yy409: + yych = *++p; + if (yych == 'T') + goto yy442; + if (yych == 't') + goto yy442; + goto yy333; + yy410: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy383; + goto yy333; + } else { + if (yych <= ' ') + goto yy383; + if (yych <= '.') + goto yy333; + goto yy385; + } + } else { + if (yych <= 'F') { + if (yych == '>') + goto yy383; + goto yy333; + } else { + if (yych <= 'G') + goto yy443; + if (yych == 'g') + goto yy443; + goto yy333; + } + } + yy411: + yych = *++p; + if (yych == 'A') + goto yy444; + if (yych == 'a') + goto yy444; + goto yy333; + yy412: + yych = *++p; + if (yych == 'L') + goto yy445; + if (yych == 'l') + goto yy445; + goto yy333; + yy413: + yych = *++p; + if (yych == 'L') + goto yy446; + if (yych == 'l') + goto yy446; + goto yy333; + yy414: + yych = *++p; + if (yych <= 'U') { + if (yych == 'C') + goto yy447; + if (yych <= 'T') + goto yy333; + goto yy448; + } else { + if (yych <= 'c') { + if (yych <= 'b') + goto yy333; + goto yy447; + } else { + if (yych == 'u') + goto yy448; + goto yy333; + } + } + yy415: + yych = *++p; + if (yych == 'M') + goto yy367; + if (yych == 'm') + goto yy367; + goto yy333; + yy416: + yych = *++p; + if (yych == 'M') + goto yy449; + if (yych == 'm') + goto yy449; + goto yy333; + yy417: + yych = *++p; + if (yych == 'D') + goto yy450; + if (yych == 'd') + goto yy450; + goto yy333; + yy418: + yych = *++p; + if (yych == 'A') + goto yy451; + if (yych == 'a') + goto yy451; + goto yy333; + yy419: + yych = *++p; + if (yych == 'E') + goto yy452; + if (yych == 'e') + goto yy452; + goto yy333; + yy420: + yych = *++p; + if (yych == 'K') + goto yy367; + if (yych == 'k') + goto yy367; + goto yy333; + yy421: + yych = *++p; + if (yych == 'N') + goto yy367; + if (yych == 'n') + goto yy367; + goto yy333; + yy422: + yych = *++p; + if (yych == 'U') + goto yy453; + if (yych == 'u') + goto yy453; + goto yy333; + yy423: + yych = *++p; + if (yych == 'R') + goto yy454; + if (yych == 'r') + goto yy454; + goto yy333; + yy424: + yych = *++p; + if (yych <= 'I') { + if (yych == 'G') + goto yy443; + if (yych <= 'H') + goto yy333; + goto yy455; + } else { + if (yych <= 'g') { + if (yych <= 'f') + goto yy333; + goto yy443; + } else { + if (yych == 'i') + goto yy455; + goto yy333; + } + } + yy425: + yych = *++p; + if (yych == 'A') + goto yy415; + if (yych == 'a') + goto yy415; + goto yy333; + yy426: + yych = *++p; + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy456; + goto yy333; + } else { + if (yych <= ' ') + goto yy456; + if (yych == '>') + goto yy456; + goto yy333; + } + yy427: + yych = *++p; + if (yych == 'I') + goto yy458; + if (yych == 'i') + goto yy458; + goto yy333; + yy428: + yych = *++p; + if (yych == 'R') + goto yy459; + if (yych == 'r') + goto yy459; + goto yy333; + yy429: + yych = *++p; + if (yych == 'L') + goto yy387; + if (yych == 'l') + goto yy387; + goto yy333; + yy430: + yych = *++p; + if (yych == 'M') + goto yy460; + if (yych == 'm') + goto yy460; + goto yy333; + yy431: + yych = *++p; + if (yych == 'L') + goto yy438; + if (yych == 'l') + goto yy438; + goto yy333; + yy432: + yych = *++p; + if (yych == 'O') + goto yy461; + if (yych == 'o') + goto yy461; + goto yy333; + yy433: + yych = *++p; + if (yych == 'A') + goto yy462; + if (yych == 'a') + goto yy462; + goto yy333; + yy434: + yych = *++p; + if (yych == 'C') + goto yy420; + if (yych == 'c') + goto yy420; + goto yy333; + yy435: + yych = *++p; + if (yych == 'A') + goto yy463; + if (yych == 'a') + goto yy463; + goto yy333; + yy436: + yych = *++p; + if (yych == 'E') + goto yy464; + if (yych == 'e') + goto yy464; + goto yy333; + yy437: + yych = *++p; + if (yych == 'C') + goto yy431; + if (yych == 'c') + goto yy431; + goto yy333; + yy438: + yych = *++p; + if (yych == 'E') + goto yy367; + if (yych == 'e') + goto yy367; + goto yy333; + yy439: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy383; + goto yy333; + } else { + if (yych <= ' ') + goto yy383; + if (yych <= '.') + goto yy333; + goto yy385; + } + } else { + if (yych <= 'E') { + if (yych == '>') + goto yy383; + goto yy333; + } else { + if (yych <= 'F') + goto yy465; + if (yych == 'f') + goto yy465; + goto yy333; + } + } + yy440: + yych = *++p; + if (yych == 'K') + goto yy466; + if (yych == 'k') + goto yy466; + goto yy333; + yy441: + yych = *++p; + if (yych == 'I') + goto yy455; + if (yych == 'i') + goto yy455; + goto yy333; + yy442: + yych = *++p; + if (yych == 'E') + goto yy467; + if (yych == 'e') + goto yy467; + goto yy333; + yy443: + yych = *++p; + if (yych == 'R') + goto yy468; + if (yych == 'r') + goto yy468; + goto yy333; + yy444: + yych = *++p; + if (yych == 'I') + goto yy469; + if (yych == 'i') + goto yy469; + goto yy333; + yy445: + yych = *++p; + if (yych == 'O') + goto yy470; + if (yych == 'o') + goto yy470; + goto yy333; + yy446: + yych = *++p; + if (yych == 'D') + goto yy471; + if (yych == 'd') + goto yy471; + goto yy333; + yy447: + yych = *++p; + if (yych == 'A') + goto yy364; + if (yych == 'a') + goto yy364; + goto yy333; + yy448: + yych = *++p; + if (yych == 'R') + goto yy438; + if (yych == 'r') + goto yy438; + goto yy333; + yy449: + yych = *++p; + if (yych == 'E') + goto yy472; + if (yych == 'e') + goto yy472; + goto yy333; + yy450: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy383; + goto yy333; + } else { + if (yych <= ' ') + goto yy383; + if (yych <= '.') + goto yy333; + goto yy385; + } + } else { + if (yych <= 'D') { + if (yych == '>') + goto yy383; + goto yy333; + } else { + if (yych <= 'E') + goto yy467; + if (yych == 'e') + goto yy467; + goto yy333; + } + } + yy451: + yych = *++p; + if (yych == 'M') + goto yy438; + if (yych == 'm') + goto yy438; + goto yy333; + yy452: + yych = *++p; + if (yych == 'N') + goto yy462; + if (yych == 'n') + goto yy462; + goto yy333; + yy453: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy383; + goto yy333; + } else { + if (yych <= ' ') + goto yy383; + if (yych <= '.') + goto yy333; + goto yy385; + } + } else { + if (yych <= 'H') { + if (yych == '>') + goto yy383; + goto yy333; + } else { + if (yych <= 'I') + goto yy473; + if (yych == 'i') + goto yy473; + goto yy333; + } + } + yy454: + yych = *++p; + if (yych == 'A') + goto yy474; + if (yych == 'a') + goto yy474; + goto yy333; + yy455: + yych = *++p; + if (yych == 'O') + goto yy421; + if (yych == 'o') + goto yy421; + goto yy333; + yy456: + ++p; + { return 1; } + yy458: + yych = *++p; + if (yych == 'P') + goto yy475; + if (yych == 'p') + goto yy475; + goto yy333; + yy459: + yych = *++p; + if (yych == 'C') + goto yy438; + if (yych == 'c') + goto yy438; + goto yy333; + yy460: + yych = *++p; + if (yych == 'A') + goto yy476; + if (yych == 'a') + goto yy476; + goto yy333; + yy461: + yych = *++p; + if (yych == 'T') + goto yy367; + if (yych == 't') + goto yy367; + goto yy333; + yy462: + yych = *++p; + if (yych == 'D') + goto yy367; + if (yych == 'd') + goto yy367; + goto yy333; + yy463: + yych = *++p; + if (yych == 'T') + goto yy477; + if (yych == 't') + goto yy477; + goto yy333; + yy464: + yych = *++p; + if (yych == 'S') + goto yy478; + if (yych == 's') + goto yy478; + goto yy333; + yy465: + yych = *++p; + if (yych == 'O') + goto yy479; + if (yych == 'o') + goto yy479; + goto yy333; + yy466: + yych = *++p; + if (yych == 'Q') + goto yy480; + if (yych == 'q') + goto yy480; + goto yy333; + yy467: + yych = *++p; + if (yych == 'R') + goto yy367; + if (yych == 'r') + goto yy367; + goto yy333; + yy468: + yych = *++p; + if (yych == 'O') + goto yy481; + if (yych == 'o') + goto yy481; + goto yy333; + yy469: + yych = *++p; + if (yych == 'L') + goto yy478; + if (yych == 'l') + goto yy478; + goto yy333; + yy470: + yych = *++p; + if (yych == 'G') + goto yy367; + if (yych == 'g') + goto yy367; + goto yy333; + yy471: + yych = *++p; + if (yych == 'S') + goto yy482; + if (yych == 's') + goto yy482; + goto yy333; + yy472: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy333; + if (yych <= '\r') + goto yy383; + goto yy333; + } else { + if (yych <= ' ') + goto yy383; + if (yych <= '.') + goto yy333; + goto yy385; + } + } else { + if (yych <= 'R') { + if (yych == '>') + goto yy383; + goto yy333; + } else { + if (yych <= 'S') + goto yy482; + if (yych == 's') + goto yy482; + goto yy333; + } + } + yy473: + yych = *++p; + if (yych == 'T') + goto yy483; + if (yych == 't') + goto yy483; + goto yy333; + yy474: + yych = *++p; + if (yych == 'M') + goto yy484; + if (yych == 'm') + goto yy484; + goto yy333; + yy475: + yych = *++p; + if (yych == 'T') + goto yy426; + if (yych == 't') + goto yy426; + goto yy333; + yy476: + yych = *++p; + if (yych == 'R') + goto yy407; + if (yych == 'r') + goto yy407; + goto yy333; + yy477: + yych = *++p; + if (yych == 'A') + goto yy485; + if (yych == 'a') + goto yy485; + goto yy333; + yy478: + yych = *++p; + if (yych == 'S') + goto yy367; + if (yych == 's') + goto yy367; + goto yy333; + yy479: + yych = *++p; + if (yych == 'N') + goto yy461; + if (yych == 'n') + goto yy461; + goto yy333; + yy480: + yych = *++p; + if (yych == 'U') + goto yy486; + if (yych == 'u') + goto yy486; + goto yy333; + yy481: + yych = *++p; + if (yych == 'U') + goto yy487; + if (yych == 'u') + goto yy487; + goto yy333; + yy482: + yych = *++p; + if (yych == 'E') + goto yy461; + if (yych == 'e') + goto yy461; + goto yy333; + yy483: + yych = *++p; + if (yych == 'E') + goto yy415; + if (yych == 'e') + goto yy415; + goto yy333; + yy484: + yych = *++p; + if (yych == 'E') + goto yy478; + if (yych == 'e') + goto yy478; + goto yy333; + yy485: + yych = *++p; + if (yych == '[') + goto yy488; + goto yy333; + yy486: + yych = *++p; + if (yych == 'O') + goto yy490; + if (yych == 'o') + goto yy490; + goto yy333; + yy487: + yych = *++p; + if (yych == 'P') + goto yy367; + if (yych == 'p') + goto yy367; + goto yy333; + yy488: + ++p; + { return 5; } + yy490: + ++p; + if ((yych = *p) == 'T') + goto yy438; + if (yych == 't') + goto yy438; + goto yy333; + } +} + +// Try to match an HTML block tag start line of type 7, returning +// 7 if successful, 0 if not. +bufsize_t _scan_html_block_start_7(const unsigned char *p) { + const unsigned char *marker = NULL; + + { + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 224, 224, 224, 224, 224, 224, 224, 224, 198, 210, 194, 198, 194, + 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 198, 224, 128, 224, 224, 224, 224, 64, 224, 224, + 224, 224, 224, 233, 232, 224, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 232, 224, 192, 192, 192, 224, 224, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 224, 224, 224, 224, 232, 192, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 224, 224, 224, + 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }; + yych = *p; + if (yych == '<') + goto yy495; + ++p; + yy494 : { return 0; } + yy495: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '@') { + if (yych != '/') + goto yy494; + } else { + if (yych <= 'Z') + goto yy498; + if (yych <= '`') + goto yy494; + if (yych <= 'z') + goto yy498; + goto yy494; + } + yych = *++p; + if (yych <= '@') + goto yy497; + if (yych <= 'Z') + goto yy500; + if (yych <= '`') + goto yy497; + if (yych <= 'z') + goto yy500; + yy497: + p = marker; + if (yyaccept == 0) { + goto yy494; + } else { + goto yy513; + } + yy498: + ++p; + yych = *p; + if (yybm[0 + yych] & 2) { + goto yy502; + } + if (yych <= '=') { + if (yych <= '.') { + if (yych == '-') + goto yy498; + goto yy497; + } else { + if (yych <= '/') + goto yy504; + if (yych <= '9') + goto yy498; + goto yy497; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') + goto yy505; + if (yych <= '@') + goto yy497; + goto yy498; + } else { + if (yych <= '`') + goto yy497; + if (yych <= 'z') + goto yy498; + goto yy497; + } + } + yy500: + ++p; + yych = *p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy497; + if (yych <= '\r') + goto yy507; + goto yy497; + } else { + if (yych <= ' ') + goto yy507; + if (yych == '-') + goto yy500; + goto yy497; + } + } else { + if (yych <= '@') { + if (yych <= '9') + goto yy500; + if (yych == '>') + goto yy505; + goto yy497; + } else { + if (yych <= 'Z') + goto yy500; + if (yych <= '`') + goto yy497; + if (yych <= 'z') + goto yy500; + goto yy497; + } + } + yy502: + ++p; + yych = *p; + if (yybm[0 + yych] & 2) { + goto yy502; + } + if (yych <= '>') { + if (yych <= '9') { + if (yych != '/') + goto yy497; + } else { + if (yych <= ':') + goto yy509; + if (yych <= '=') + goto yy497; + goto yy505; + } + } else { + if (yych <= '^') { + if (yych <= '@') + goto yy497; + if (yych <= 'Z') + goto yy509; + goto yy497; + } else { + if (yych == '`') + goto yy497; + if (yych <= 'z') + goto yy509; + goto yy497; + } + } + yy504: + yych = *++p; + if (yych != '>') + goto yy497; + yy505: + ++p; + yych = *p; + if (yybm[0 + yych] & 4) { + goto yy505; + } + if (yych <= 0x08) + goto yy497; + if (yych <= '\n') + goto yy511; + if (yych <= '\v') + goto yy497; + if (yych <= '\r') + goto yy514; + goto yy497; + yy507: + ++p; + yych = *p; + if (yych <= 0x1F) { + if (yych <= 0x08) + goto yy497; + if (yych <= '\r') + goto yy507; + goto yy497; + } else { + if (yych <= ' ') + goto yy507; + if (yych == '>') + goto yy505; + goto yy497; + } + yy509: + ++p; + yych = *p; + if (yybm[0 + yych] & 8) { + goto yy509; + } + if (yych <= ',') { + if (yych <= '\r') { + if (yych <= 0x08) + goto yy497; + goto yy515; + } else { + if (yych == ' ') + goto yy515; + goto yy497; + } + } else { + if (yych <= '<') { + if (yych <= '/') + goto yy504; + goto yy497; + } else { + if (yych <= '=') + goto yy517; + if (yych <= '>') + goto yy505; + goto yy497; + } + } + yy511: + yyaccept = 1; + marker = ++p; + yych = *p; + if (yybm[0 + yych] & 4) { + goto yy505; + } + if (yych <= 0x08) + goto yy513; + if (yych <= '\n') + goto yy511; + if (yych <= '\v') + goto yy513; + if (yych <= '\r') + goto yy514; + yy513 : { return 7; } + yy514: + yych = *++p; + goto yy513; + yy515: + ++p; + yych = *p; + if (yych <= '<') { + if (yych <= ' ') { + if (yych <= 0x08) + goto yy497; + if (yych <= '\r') + goto yy515; + if (yych <= 0x1F) + goto yy497; + goto yy515; + } else { + if (yych <= '/') { + if (yych <= '.') + goto yy497; + goto yy504; + } else { + if (yych == ':') + goto yy509; + goto yy497; + } + } + } else { + if (yych <= 'Z') { + if (yych <= '=') + goto yy517; + if (yych <= '>') + goto yy505; + if (yych <= '@') + goto yy497; + goto yy509; + } else { + if (yych <= '_') { + if (yych <= '^') + goto yy497; + goto yy509; + } else { + if (yych <= '`') + goto yy497; + if (yych <= 'z') + goto yy509; + goto yy497; + } + } + } + yy517: + ++p; + yych = *p; + if (yybm[0 + yych] & 32) { + goto yy519; + } + if (yych <= 0xE0) { + if (yych <= '"') { + if (yych <= 0x00) + goto yy497; + if (yych <= ' ') + goto yy517; + goto yy521; + } else { + if (yych <= '\'') + goto yy523; + if (yych <= 0xC1) + goto yy497; + if (yych <= 0xDF) + goto yy525; + goto yy526; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy528; + goto yy527; + } else { + if (yych <= 0xF0) + goto yy529; + if (yych <= 0xF3) + goto yy530; + if (yych <= 0xF4) + goto yy531; + goto yy497; + } + } + yy519: + ++p; + yych = *p; + if (yybm[0 + yych] & 32) { + goto yy519; + } + if (yych <= 0xE0) { + if (yych <= '=') { + if (yych <= 0x00) + goto yy497; + if (yych <= ' ') + goto yy502; + goto yy497; + } else { + if (yych <= '>') + goto yy505; + if (yych <= 0xC1) + goto yy497; + if (yych <= 0xDF) + goto yy525; + goto yy526; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy528; + goto yy527; + } else { + if (yych <= 0xF0) + goto yy529; + if (yych <= 0xF3) + goto yy530; + if (yych <= 0xF4) + goto yy531; + goto yy497; + } + } + yy521: + ++p; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy521; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy497; + if (yych <= '"') + goto yy532; + goto yy497; + } else { + if (yych <= 0xDF) + goto yy533; + if (yych <= 0xE0) + goto yy534; + goto yy535; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy536; + if (yych <= 0xEF) + goto yy535; + goto yy537; + } else { + if (yych <= 0xF3) + goto yy538; + if (yych <= 0xF4) + goto yy539; + goto yy497; + } + } + yy523: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy523; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy497; + if (yych <= '\'') + goto yy532; + goto yy497; + } else { + if (yych <= 0xDF) + goto yy540; + if (yych <= 0xE0) + goto yy541; + goto yy542; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy543; + if (yych <= 0xEF) + goto yy542; + goto yy544; + } else { + if (yych <= 0xF3) + goto yy545; + if (yych <= 0xF4) + goto yy546; + goto yy497; + } + } + yy525: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0xBF) + goto yy519; + goto yy497; + yy526: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy497; + if (yych <= 0xBF) + goto yy525; + goto yy497; + yy527: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0xBF) + goto yy525; + goto yy497; + yy528: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0x9F) + goto yy525; + goto yy497; + yy529: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy497; + if (yych <= 0xBF) + goto yy527; + goto yy497; + yy530: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0xBF) + goto yy527; + goto yy497; + yy531: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0x8F) + goto yy527; + goto yy497; + yy532: + ++p; + yych = *p; + if (yybm[0 + yych] & 2) { + goto yy502; + } + if (yych == '/') + goto yy504; + if (yych == '>') + goto yy505; + goto yy497; + yy533: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0xBF) + goto yy521; + goto yy497; + yy534: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy497; + if (yych <= 0xBF) + goto yy533; + goto yy497; + yy535: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0xBF) + goto yy533; + goto yy497; + yy536: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0x9F) + goto yy533; + goto yy497; + yy537: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy497; + if (yych <= 0xBF) + goto yy535; + goto yy497; + yy538: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0xBF) + goto yy535; + goto yy497; + yy539: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0x8F) + goto yy535; + goto yy497; + yy540: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0xBF) + goto yy523; + goto yy497; + yy541: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy497; + if (yych <= 0xBF) + goto yy540; + goto yy497; + yy542: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0xBF) + goto yy540; + goto yy497; + yy543: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0x9F) + goto yy540; + goto yy497; + yy544: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy497; + if (yych <= 0xBF) + goto yy542; + goto yy497; + yy545: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0xBF) + goto yy542; + goto yy497; + yy546: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy497; + if (yych <= 0x8F) + goto yy542; + goto yy497; + } +} + +// Try to match an HTML block end line of type 1 +bufsize_t _scan_html_block_end_1(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }; + yych = *p; + if (yych <= 0xDF) { + if (yych <= ';') { + if (yych <= 0x00) + goto yy549; + if (yych != '\n') + goto yy551; + } else { + if (yych <= '<') + goto yy552; + if (yych <= 0x7F) + goto yy551; + if (yych >= 0xC2) + goto yy553; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) + goto yy554; + if (yych == 0xED) + goto yy556; + goto yy555; + } else { + if (yych <= 0xF0) + goto yy557; + if (yych <= 0xF3) + goto yy558; + if (yych <= 0xF4) + goto yy559; + } + } + yy549: + ++p; + yy550 : { return 0; } + yy551: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '\n') { + if (yych <= 0x00) + goto yy550; + if (yych <= '\t') + goto yy561; + goto yy550; + } else { + if (yych <= 0x7F) + goto yy561; + if (yych <= 0xC1) + goto yy550; + if (yych <= 0xF4) + goto yy561; + goto yy550; + } + yy552: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '.') { + if (yych <= 0x00) + goto yy550; + if (yych == '\n') + goto yy550; + goto yy561; + } else { + if (yych <= 0x7F) { + if (yych <= '/') + goto yy572; + goto yy561; + } else { + if (yych <= 0xC1) + goto yy550; + if (yych <= 0xF4) + goto yy561; + goto yy550; + } + } + yy553: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy550; + if (yych <= 0xBF) + goto yy560; + goto yy550; + yy554: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x9F) + goto yy550; + if (yych <= 0xBF) + goto yy565; + goto yy550; + yy555: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy550; + if (yych <= 0xBF) + goto yy565; + goto yy550; + yy556: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy550; + if (yych <= 0x9F) + goto yy565; + goto yy550; + yy557: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x8F) + goto yy550; + if (yych <= 0xBF) + goto yy567; + goto yy550; + yy558: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy550; + if (yych <= 0xBF) + goto yy567; + goto yy550; + yy559: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy550; + if (yych <= 0x8F) + goto yy567; + goto yy550; + yy560: + ++p; + yych = *p; + yy561: + if (yybm[0 + yych] & 64) { + goto yy560; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy562; + if (yych <= '<') + goto yy563; + } else { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + goto yy567; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy568; + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + } + } + yy562: + p = marker; + if (yyaccept == 0) { + goto yy550; + } else { + goto yy582; + } + yy563: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 0xDF) { + if (yych <= '.') { + if (yych <= 0x00) + goto yy562; + if (yych == '\n') + goto yy562; + goto yy560; + } else { + if (yych <= '/') + goto yy572; + if (yych <= 0x7F) + goto yy560; + if (yych <= 0xC1) + goto yy562; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) + goto yy566; + if (yych == 0xED) + goto yy568; + goto yy567; + } else { + if (yych <= 0xF0) + goto yy569; + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + yy565: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy562; + if (yych <= 0xBF) + goto yy560; + goto yy562; + yy566: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy562; + if (yych <= 0xBF) + goto yy565; + goto yy562; + yy567: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy562; + if (yych <= 0xBF) + goto yy565; + goto yy562; + yy568: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy562; + if (yych <= 0x9F) + goto yy565; + goto yy562; + yy569: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy562; + if (yych <= 0xBF) + goto yy567; + goto yy562; + yy570: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy562; + if (yych <= 0xBF) + goto yy567; + goto yy562; + yy571: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy562; + if (yych <= 0x8F) + goto yy567; + goto yy562; + yy572: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 's') { + if (yych <= 'P') { + if (yych <= '\t') { + if (yych <= 0x00) + goto yy562; + goto yy560; + } else { + if (yych <= '\n') + goto yy562; + if (yych <= 'O') + goto yy560; + } + } else { + if (yych <= 'o') { + if (yych == 'S') + goto yy574; + goto yy560; + } else { + if (yych <= 'p') + goto yy573; + if (yych <= 'r') + goto yy560; + goto yy574; + } + } + } else { + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x7F) + goto yy560; + goto yy562; + } else { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + goto yy567; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy568; + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + } + yy573: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 0xC1) { + if (yych <= 'Q') { + if (yych <= 0x00) + goto yy562; + if (yych == '\n') + goto yy562; + goto yy560; + } else { + if (yych <= 'q') { + if (yych <= 'R') + goto yy575; + goto yy560; + } else { + if (yych <= 'r') + goto yy575; + if (yych <= 0x7F) + goto yy560; + goto yy562; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + if (yych <= 0xEC) + goto yy567; + goto yy568; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + } + yy574: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 't') { + if (yych <= 'C') { + if (yych <= '\t') { + if (yych <= 0x00) + goto yy562; + goto yy560; + } else { + if (yych <= '\n') + goto yy562; + if (yych <= 'B') + goto yy560; + goto yy576; + } + } else { + if (yych <= 'b') { + if (yych == 'T') + goto yy577; + goto yy560; + } else { + if (yych <= 'c') + goto yy576; + if (yych <= 's') + goto yy560; + goto yy577; + } + } + } else { + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x7F) + goto yy560; + goto yy562; + } else { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + goto yy567; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy568; + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + } + yy575: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 0xC1) { + if (yych <= 'D') { + if (yych <= 0x00) + goto yy562; + if (yych == '\n') + goto yy562; + goto yy560; + } else { + if (yych <= 'd') { + if (yych <= 'E') + goto yy578; + goto yy560; + } else { + if (yych <= 'e') + goto yy578; + if (yych <= 0x7F) + goto yy560; + goto yy562; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + if (yych <= 0xEC) + goto yy567; + goto yy568; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + } + yy576: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 0xC1) { + if (yych <= 'Q') { + if (yych <= 0x00) + goto yy562; + if (yych == '\n') + goto yy562; + goto yy560; + } else { + if (yych <= 'q') { + if (yych <= 'R') + goto yy579; + goto yy560; + } else { + if (yych <= 'r') + goto yy579; + if (yych <= 0x7F) + goto yy560; + goto yy562; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + if (yych <= 0xEC) + goto yy567; + goto yy568; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + } + yy577: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 0xC1) { + if (yych <= 'X') { + if (yych <= 0x00) + goto yy562; + if (yych == '\n') + goto yy562; + goto yy560; + } else { + if (yych <= 'x') { + if (yych <= 'Y') + goto yy580; + goto yy560; + } else { + if (yych <= 'y') + goto yy580; + if (yych <= 0x7F) + goto yy560; + goto yy562; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + if (yych <= 0xEC) + goto yy567; + goto yy568; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + } + yy578: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 0xDF) { + if (yych <= '=') { + if (yych <= 0x00) + goto yy562; + if (yych == '\n') + goto yy562; + goto yy560; + } else { + if (yych <= '>') + goto yy581; + if (yych <= 0x7F) + goto yy560; + if (yych <= 0xC1) + goto yy562; + goto yy565; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) + goto yy566; + if (yych == 0xED) + goto yy568; + goto yy567; + } else { + if (yych <= 0xF0) + goto yy569; + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + yy579: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 0xC1) { + if (yych <= 'H') { + if (yych <= 0x00) + goto yy562; + if (yych == '\n') + goto yy562; + goto yy560; + } else { + if (yych <= 'h') { + if (yych <= 'I') + goto yy583; + goto yy560; + } else { + if (yych <= 'i') + goto yy583; + if (yych <= 0x7F) + goto yy560; + goto yy562; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + if (yych <= 0xEC) + goto yy567; + goto yy568; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + } + yy580: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 0xC1) { + if (yych <= 'K') { + if (yych <= 0x00) + goto yy562; + if (yych == '\n') + goto yy562; + goto yy560; + } else { + if (yych <= 'k') { + if (yych <= 'L') + goto yy575; + goto yy560; + } else { + if (yych <= 'l') + goto yy575; + if (yych <= 0x7F) + goto yy560; + goto yy562; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + if (yych <= 0xEC) + goto yy567; + goto yy568; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + } + yy581: + yyaccept = 1; + marker = ++p; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy560; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy582; + if (yych <= '<') + goto yy563; + } else { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + goto yy567; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy568; + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + } + } + yy582 : { return (bufsize_t)(p - start); } + yy583: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 0xC1) { + if (yych <= 'O') { + if (yych <= 0x00) + goto yy562; + if (yych == '\n') + goto yy562; + goto yy560; + } else { + if (yych <= 'o') { + if (yych >= 'Q') + goto yy560; + } else { + if (yych <= 'p') + goto yy584; + if (yych <= 0x7F) + goto yy560; + goto yy562; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + if (yych <= 0xEC) + goto yy567; + goto yy568; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + } + yy584: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy563; + } + if (yych <= 0xC1) { + if (yych <= 'S') { + if (yych <= 0x00) + goto yy562; + if (yych == '\n') + goto yy562; + goto yy560; + } else { + if (yych <= 's') { + if (yych <= 'T') + goto yy578; + goto yy560; + } else { + if (yych <= 't') + goto yy578; + if (yych <= 0x7F) + goto yy560; + goto yy562; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) + goto yy565; + if (yych <= 0xE0) + goto yy566; + if (yych <= 0xEC) + goto yy567; + goto yy568; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) + goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) + goto yy570; + if (yych <= 0xF4) + goto yy571; + goto yy562; + } + } + } + } +} + +// Try to match an HTML block end line of type 2 +bufsize_t _scan_html_block_end_2(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }; + yych = *p; + if (yych <= 0xDF) { + if (yych <= ',') { + if (yych <= 0x00) + goto yy587; + if (yych != '\n') + goto yy589; + } else { + if (yych <= '-') + goto yy590; + if (yych <= 0x7F) + goto yy589; + if (yych >= 0xC2) + goto yy591; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) + goto yy592; + if (yych == 0xED) + goto yy594; + goto yy593; + } else { + if (yych <= 0xF0) + goto yy595; + if (yych <= 0xF3) + goto yy596; + if (yych <= 0xF4) + goto yy597; + } + } + yy587: + ++p; + yy588 : { return 0; } + yy589: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '\n') { + if (yych <= 0x00) + goto yy588; + if (yych <= '\t') + goto yy599; + goto yy588; + } else { + if (yych <= 0x7F) + goto yy599; + if (yych <= 0xC1) + goto yy588; + if (yych <= 0xF4) + goto yy599; + goto yy588; + } + yy590: + yyaccept = 0; + yych = *(marker = ++p); + if (yybm[0 + yych] & 128) { + goto yy609; + } + if (yych <= '\n') { + if (yych <= 0x00) + goto yy588; + if (yych <= '\t') + goto yy599; + goto yy588; + } else { + if (yych <= 0x7F) + goto yy599; + if (yych <= 0xC1) + goto yy588; + if (yych <= 0xF4) + goto yy599; + goto yy588; + } + yy591: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy588; + if (yych <= 0xBF) + goto yy598; + goto yy588; + yy592: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x9F) + goto yy588; + if (yych <= 0xBF) + goto yy602; + goto yy588; + yy593: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy588; + if (yych <= 0xBF) + goto yy602; + goto yy588; + yy594: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy588; + if (yych <= 0x9F) + goto yy602; + goto yy588; + yy595: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x8F) + goto yy588; + if (yych <= 0xBF) + goto yy604; + goto yy588; + yy596: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy588; + if (yych <= 0xBF) + goto yy604; + goto yy588; + yy597: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy588; + if (yych <= 0x8F) + goto yy604; + goto yy588; + yy598: + ++p; + yych = *p; + yy599: + if (yybm[0 + yych] & 64) { + goto yy598; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy600; + if (yych <= '-') + goto yy601; + } else { + if (yych <= 0xDF) + goto yy602; + if (yych <= 0xE0) + goto yy603; + goto yy604; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy605; + if (yych <= 0xEF) + goto yy604; + goto yy606; + } else { + if (yych <= 0xF3) + goto yy607; + if (yych <= 0xF4) + goto yy608; + } + } + yy600: + p = marker; + if (yyaccept == 0) { + goto yy588; + } else { + goto yy612; + } + yy601: + ++p; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy598; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy600; + if (yych <= '-') + goto yy609; + goto yy600; + } else { + if (yych <= 0xDF) + goto yy602; + if (yych <= 0xE0) + goto yy603; + goto yy604; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy605; + if (yych <= 0xEF) + goto yy604; + goto yy606; + } else { + if (yych <= 0xF3) + goto yy607; + if (yych <= 0xF4) + goto yy608; + goto yy600; + } + } + yy602: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy600; + if (yych <= 0xBF) + goto yy598; + goto yy600; + yy603: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy600; + if (yych <= 0xBF) + goto yy602; + goto yy600; + yy604: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy600; + if (yych <= 0xBF) + goto yy602; + goto yy600; + yy605: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy600; + if (yych <= 0x9F) + goto yy602; + goto yy600; + yy606: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy600; + if (yych <= 0xBF) + goto yy604; + goto yy600; + yy607: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy600; + if (yych <= 0xBF) + goto yy604; + goto yy600; + yy608: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy600; + if (yych <= 0x8F) + goto yy604; + goto yy600; + yy609: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy609; + } + if (yych <= 0xDF) { + if (yych <= '=') { + if (yych <= 0x00) + goto yy600; + if (yych == '\n') + goto yy600; + goto yy598; + } else { + if (yych <= '>') + goto yy611; + if (yych <= 0x7F) + goto yy598; + if (yych <= 0xC1) + goto yy600; + goto yy602; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) + goto yy603; + if (yych == 0xED) + goto yy605; + goto yy604; + } else { + if (yych <= 0xF0) + goto yy606; + if (yych <= 0xF3) + goto yy607; + if (yych <= 0xF4) + goto yy608; + goto yy600; + } + } + yy611: + yyaccept = 1; + marker = ++p; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy598; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy612; + if (yych <= '-') + goto yy601; + } else { + if (yych <= 0xDF) + goto yy602; + if (yych <= 0xE0) + goto yy603; + goto yy604; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy605; + if (yych <= 0xEF) + goto yy604; + goto yy606; + } else { + if (yych <= 0xF3) + goto yy607; + if (yych <= 0xF4) + goto yy608; + } + } + yy612 : { return (bufsize_t)(p - start); } + } +} + +// Try to match an HTML block end line of type 3 +bufsize_t _scan_html_block_end_3(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }; + yych = *p; + if (yych <= 0xDF) { + if (yych <= '>') { + if (yych <= 0x00) + goto yy615; + if (yych != '\n') + goto yy617; + } else { + if (yych <= '?') + goto yy618; + if (yych <= 0x7F) + goto yy617; + if (yych >= 0xC2) + goto yy619; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) + goto yy620; + if (yych == 0xED) + goto yy622; + goto yy621; + } else { + if (yych <= 0xF0) + goto yy623; + if (yych <= 0xF3) + goto yy624; + if (yych <= 0xF4) + goto yy625; + } + } + yy615: + ++p; + yy616 : { return 0; } + yy617: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '\n') { + if (yych <= 0x00) + goto yy616; + if (yych <= '\t') + goto yy627; + goto yy616; + } else { + if (yych <= 0x7F) + goto yy627; + if (yych <= 0xC1) + goto yy616; + if (yych <= 0xF4) + goto yy627; + goto yy616; + } + yy618: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '=') { + if (yych <= 0x00) + goto yy616; + if (yych == '\n') + goto yy616; + goto yy627; + } else { + if (yych <= 0x7F) { + if (yych <= '>') + goto yy638; + goto yy627; + } else { + if (yych <= 0xC1) + goto yy616; + if (yych <= 0xF4) + goto yy627; + goto yy616; + } + } + yy619: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy616; + if (yych <= 0xBF) + goto yy626; + goto yy616; + yy620: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x9F) + goto yy616; + if (yych <= 0xBF) + goto yy631; + goto yy616; + yy621: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy616; + if (yych <= 0xBF) + goto yy631; + goto yy616; + yy622: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy616; + if (yych <= 0x9F) + goto yy631; + goto yy616; + yy623: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x8F) + goto yy616; + if (yych <= 0xBF) + goto yy633; + goto yy616; + yy624: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy616; + if (yych <= 0xBF) + goto yy633; + goto yy616; + yy625: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy616; + if (yych <= 0x8F) + goto yy633; + goto yy616; + yy626: + ++p; + yych = *p; + yy627: + if (yybm[0 + yych] & 64) { + goto yy626; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy628; + if (yych <= '?') + goto yy629; + } else { + if (yych <= 0xDF) + goto yy631; + if (yych <= 0xE0) + goto yy632; + goto yy633; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy634; + if (yych <= 0xEF) + goto yy633; + goto yy635; + } else { + if (yych <= 0xF3) + goto yy636; + if (yych <= 0xF4) + goto yy637; + } + } + yy628: + p = marker; + if (yyaccept == 0) { + goto yy616; + } else { + goto yy639; + } + yy629: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy629; + } + if (yych <= 0xDF) { + if (yych <= '=') { + if (yych <= 0x00) + goto yy628; + if (yych == '\n') + goto yy628; + goto yy626; + } else { + if (yych <= '>') + goto yy638; + if (yych <= 0x7F) + goto yy626; + if (yych <= 0xC1) + goto yy628; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) + goto yy632; + if (yych == 0xED) + goto yy634; + goto yy633; + } else { + if (yych <= 0xF0) + goto yy635; + if (yych <= 0xF3) + goto yy636; + if (yych <= 0xF4) + goto yy637; + goto yy628; + } + } + yy631: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy628; + if (yych <= 0xBF) + goto yy626; + goto yy628; + yy632: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy628; + if (yych <= 0xBF) + goto yy631; + goto yy628; + yy633: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy628; + if (yych <= 0xBF) + goto yy631; + goto yy628; + yy634: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy628; + if (yych <= 0x9F) + goto yy631; + goto yy628; + yy635: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy628; + if (yych <= 0xBF) + goto yy633; + goto yy628; + yy636: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy628; + if (yych <= 0xBF) + goto yy633; + goto yy628; + yy637: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy628; + if (yych <= 0x8F) + goto yy633; + goto yy628; + yy638: + yyaccept = 1; + marker = ++p; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy626; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy639; + if (yych <= '?') + goto yy629; + } else { + if (yych <= 0xDF) + goto yy631; + if (yych <= 0xE0) + goto yy632; + goto yy633; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy634; + if (yych <= 0xEF) + goto yy633; + goto yy635; + } else { + if (yych <= 0xF3) + goto yy636; + if (yych <= 0xF4) + goto yy637; + } + } + yy639 : { return (bufsize_t)(p - start); } + } +} + +// Try to match an HTML block end line of type 4 +bufsize_t _scan_html_block_end_4(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 64, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy645; + } + if (yych <= 0xE0) { + if (yych <= '\n') { + if (yych <= 0x00) + goto yy642; + if (yych <= '\t') + goto yy644; + } else { + if (yych <= 0x7F) + goto yy644; + if (yych <= 0xC1) + goto yy642; + if (yych <= 0xDF) + goto yy648; + goto yy649; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy651; + goto yy650; + } else { + if (yych <= 0xF0) + goto yy652; + if (yych <= 0xF3) + goto yy653; + if (yych <= 0xF4) + goto yy654; + } + } + yy642: + ++p; + yy643 : { return 0; } + yy644: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '\n') { + if (yych <= 0x00) + goto yy643; + if (yych <= '\t') + goto yy656; + goto yy643; + } else { + if (yych <= 0x7F) + goto yy656; + if (yych <= 0xC1) + goto yy643; + if (yych <= 0xF4) + goto yy656; + goto yy643; + } + yy645: + yyaccept = 1; + marker = ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy655; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy647; + if (yych <= '>') + goto yy645; + } else { + if (yych <= 0xDF) + goto yy658; + if (yych <= 0xE0) + goto yy659; + goto yy660; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy661; + if (yych <= 0xEF) + goto yy660; + goto yy662; + } else { + if (yych <= 0xF3) + goto yy663; + if (yych <= 0xF4) + goto yy664; + } + } + yy647 : { return (bufsize_t)(p - start); } + yy648: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy643; + if (yych <= 0xBF) + goto yy655; + goto yy643; + yy649: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x9F) + goto yy643; + if (yych <= 0xBF) + goto yy658; + goto yy643; + yy650: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy643; + if (yych <= 0xBF) + goto yy658; + goto yy643; + yy651: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy643; + if (yych <= 0x9F) + goto yy658; + goto yy643; + yy652: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x8F) + goto yy643; + if (yych <= 0xBF) + goto yy660; + goto yy643; + yy653: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy643; + if (yych <= 0xBF) + goto yy660; + goto yy643; + yy654: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy643; + if (yych <= 0x8F) + goto yy660; + goto yy643; + yy655: + ++p; + yych = *p; + yy656: + if (yybm[0 + yych] & 128) { + goto yy655; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy657; + if (yych <= '>') + goto yy645; + } else { + if (yych <= 0xDF) + goto yy658; + if (yych <= 0xE0) + goto yy659; + goto yy660; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy661; + if (yych <= 0xEF) + goto yy660; + goto yy662; + } else { + if (yych <= 0xF3) + goto yy663; + if (yych <= 0xF4) + goto yy664; + } + } + yy657: + p = marker; + if (yyaccept == 0) { + goto yy643; + } else { + goto yy647; + } + yy658: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy657; + if (yych <= 0xBF) + goto yy655; + goto yy657; + yy659: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy657; + if (yych <= 0xBF) + goto yy658; + goto yy657; + yy660: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy657; + if (yych <= 0xBF) + goto yy658; + goto yy657; + yy661: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy657; + if (yych <= 0x9F) + goto yy658; + goto yy657; + yy662: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy657; + if (yych <= 0xBF) + goto yy660; + goto yy657; + yy663: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy657; + if (yych <= 0xBF) + goto yy660; + goto yy657; + yy664: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy657; + if (yych <= 0x8F) + goto yy660; + goto yy657; + } +} + +// Try to match an HTML block end line of type 5 +bufsize_t _scan_html_block_end_5(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }; + yych = *p; + if (yych <= 0xDF) { + if (yych <= '\\') { + if (yych <= 0x00) + goto yy667; + if (yych != '\n') + goto yy669; + } else { + if (yych <= ']') + goto yy670; + if (yych <= 0x7F) + goto yy669; + if (yych >= 0xC2) + goto yy671; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) + goto yy672; + if (yych == 0xED) + goto yy674; + goto yy673; + } else { + if (yych <= 0xF0) + goto yy675; + if (yych <= 0xF3) + goto yy676; + if (yych <= 0xF4) + goto yy677; + } + } + yy667: + ++p; + yy668 : { return 0; } + yy669: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '\n') { + if (yych <= 0x00) + goto yy668; + if (yych <= '\t') + goto yy679; + goto yy668; + } else { + if (yych <= 0x7F) + goto yy679; + if (yych <= 0xC1) + goto yy668; + if (yych <= 0xF4) + goto yy679; + goto yy668; + } + yy670: + yyaccept = 0; + yych = *(marker = ++p); + if (yybm[0 + yych] & 128) { + goto yy689; + } + if (yych <= '\n') { + if (yych <= 0x00) + goto yy668; + if (yych <= '\t') + goto yy679; + goto yy668; + } else { + if (yych <= 0x7F) + goto yy679; + if (yych <= 0xC1) + goto yy668; + if (yych <= 0xF4) + goto yy679; + goto yy668; + } + yy671: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy668; + if (yych <= 0xBF) + goto yy678; + goto yy668; + yy672: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x9F) + goto yy668; + if (yych <= 0xBF) + goto yy682; + goto yy668; + yy673: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy668; + if (yych <= 0xBF) + goto yy682; + goto yy668; + yy674: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy668; + if (yych <= 0x9F) + goto yy682; + goto yy668; + yy675: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x8F) + goto yy668; + if (yych <= 0xBF) + goto yy684; + goto yy668; + yy676: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy668; + if (yych <= 0xBF) + goto yy684; + goto yy668; + yy677: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) + goto yy668; + if (yych <= 0x8F) + goto yy684; + goto yy668; + yy678: + ++p; + yych = *p; + yy679: + if (yybm[0 + yych] & 64) { + goto yy678; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy680; + if (yych <= ']') + goto yy681; + } else { + if (yych <= 0xDF) + goto yy682; + if (yych <= 0xE0) + goto yy683; + goto yy684; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy685; + if (yych <= 0xEF) + goto yy684; + goto yy686; + } else { + if (yych <= 0xF3) + goto yy687; + if (yych <= 0xF4) + goto yy688; + } + } + yy680: + p = marker; + if (yyaccept == 0) { + goto yy668; + } else { + goto yy692; + } + yy681: + ++p; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy678; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy680; + if (yych <= ']') + goto yy689; + goto yy680; + } else { + if (yych <= 0xDF) + goto yy682; + if (yych <= 0xE0) + goto yy683; + goto yy684; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy685; + if (yych <= 0xEF) + goto yy684; + goto yy686; + } else { + if (yych <= 0xF3) + goto yy687; + if (yych <= 0xF4) + goto yy688; + goto yy680; + } + } + yy682: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy680; + if (yych <= 0xBF) + goto yy678; + goto yy680; + yy683: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy680; + if (yych <= 0xBF) + goto yy682; + goto yy680; + yy684: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy680; + if (yych <= 0xBF) + goto yy682; + goto yy680; + yy685: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy680; + if (yych <= 0x9F) + goto yy682; + goto yy680; + yy686: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy680; + if (yych <= 0xBF) + goto yy684; + goto yy680; + yy687: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy680; + if (yych <= 0xBF) + goto yy684; + goto yy680; + yy688: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy680; + if (yych <= 0x8F) + goto yy684; + goto yy680; + yy689: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy689; + } + if (yych <= 0xDF) { + if (yych <= '=') { + if (yych <= 0x00) + goto yy680; + if (yych == '\n') + goto yy680; + goto yy678; + } else { + if (yych <= '>') + goto yy691; + if (yych <= 0x7F) + goto yy678; + if (yych <= 0xC1) + goto yy680; + goto yy682; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) + goto yy683; + if (yych == 0xED) + goto yy685; + goto yy684; + } else { + if (yych <= 0xF0) + goto yy686; + if (yych <= 0xF3) + goto yy687; + if (yych <= 0xF4) + goto yy688; + goto yy680; + } + } + yy691: + yyaccept = 1; + marker = ++p; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy678; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') + goto yy692; + if (yych <= ']') + goto yy681; + } else { + if (yych <= 0xDF) + goto yy682; + if (yych <= 0xE0) + goto yy683; + goto yy684; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy685; + if (yych <= 0xEF) + goto yy684; + goto yy686; + } else { + if (yych <= 0xF3) + goto yy687; + if (yych <= 0xF4) + goto yy688; + } + } + yy692 : { return (bufsize_t)(p - start); } + } +} + +// Try to match a link title (in single quotes, in double quotes, or +// in parentheses), returning number of chars matched. Allow one +// level of internal nesting (quotes within quotes). +bufsize_t _scan_link_title(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 192, 208, 208, 208, 208, 144, 80, 80, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 32, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }; + yych = *p; + if (yych <= '&') { + if (yych == '"') + goto yy697; + } else { + if (yych <= '\'') + goto yy698; + if (yych <= '(') + goto yy699; + } + ++p; + yy696 : { return 0; } + yy697: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x00) + goto yy696; + if (yych <= 0x7F) + goto yy701; + if (yych <= 0xC1) + goto yy696; + if (yych <= 0xF4) + goto yy701; + goto yy696; + yy698: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x00) + goto yy696; + if (yych <= 0x7F) + goto yy715; + if (yych <= 0xC1) + goto yy696; + if (yych <= 0xF4) + goto yy715; + goto yy696; + yy699: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '(') { + if (yych <= 0x00) + goto yy696; + if (yych <= '\'') + goto yy728; + goto yy696; + } else { + if (yych <= 0x7F) + goto yy728; + if (yych <= 0xC1) + goto yy696; + if (yych <= 0xF4) + goto yy728; + goto yy696; + } + yy700: + ++p; + yych = *p; + yy701: + if (yybm[0 + yych] & 16) { + goto yy700; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) + goto yy702; + if (yych <= '"') + goto yy703; + goto yy705; + } else { + if (yych <= 0xC1) + goto yy702; + if (yych <= 0xDF) + goto yy707; + goto yy708; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy710; + goto yy709; + } else { + if (yych <= 0xF0) + goto yy711; + if (yych <= 0xF3) + goto yy712; + if (yych <= 0xF4) + goto yy713; + } + } + yy702: + p = marker; + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy696; + } else { + goto yy704; + } + } else { + if (yyaccept == 2) { + goto yy717; + } else { + goto yy730; + } + } + yy703: + ++p; + yy704 : { return (bufsize_t)(p - start); } + yy705: + ++p; + yych = *p; + if (yybm[0 + yych] & 16) { + goto yy700; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) + goto yy702; + if (yych <= '"') + goto yy740; + goto yy705; + } else { + if (yych <= 0xC1) + goto yy702; + if (yych >= 0xE0) + goto yy708; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy710; + goto yy709; + } else { + if (yych <= 0xF0) + goto yy711; + if (yych <= 0xF3) + goto yy712; + if (yych <= 0xF4) + goto yy713; + goto yy702; + } + } + yy707: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0xBF) + goto yy700; + goto yy702; + yy708: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy702; + if (yych <= 0xBF) + goto yy707; + goto yy702; + yy709: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0xBF) + goto yy707; + goto yy702; + yy710: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0x9F) + goto yy707; + goto yy702; + yy711: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy702; + if (yych <= 0xBF) + goto yy709; + goto yy702; + yy712: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0xBF) + goto yy709; + goto yy702; + yy713: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0x8F) + goto yy709; + goto yy702; + yy714: + ++p; + yych = *p; + yy715: + if (yybm[0 + yych] & 64) { + goto yy714; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) + goto yy702; + if (yych >= '(') + goto yy718; + } else { + if (yych <= 0xC1) + goto yy702; + if (yych <= 0xDF) + goto yy720; + goto yy721; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy723; + goto yy722; + } else { + if (yych <= 0xF0) + goto yy724; + if (yych <= 0xF3) + goto yy725; + if (yych <= 0xF4) + goto yy726; + goto yy702; + } + } + yy716: + ++p; + yy717 : { return (bufsize_t)(p - start); } + yy718: + ++p; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy714; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) + goto yy702; + if (yych <= '\'') + goto yy741; + goto yy718; + } else { + if (yych <= 0xC1) + goto yy702; + if (yych >= 0xE0) + goto yy721; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy723; + goto yy722; + } else { + if (yych <= 0xF0) + goto yy724; + if (yych <= 0xF3) + goto yy725; + if (yych <= 0xF4) + goto yy726; + goto yy702; + } + } + yy720: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0xBF) + goto yy714; + goto yy702; + yy721: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy702; + if (yych <= 0xBF) + goto yy720; + goto yy702; + yy722: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0xBF) + goto yy720; + goto yy702; + yy723: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0x9F) + goto yy720; + goto yy702; + yy724: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy702; + if (yych <= 0xBF) + goto yy722; + goto yy702; + yy725: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0xBF) + goto yy722; + goto yy702; + yy726: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0x8F) + goto yy722; + goto yy702; + yy727: + ++p; + yych = *p; + yy728: + if (yybm[0 + yych] & 128) { + goto yy727; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= '(') + goto yy702; + if (yych >= '*') + goto yy731; + } else { + if (yych <= 0xC1) + goto yy702; + if (yych <= 0xDF) + goto yy733; + goto yy734; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy736; + goto yy735; + } else { + if (yych <= 0xF0) + goto yy737; + if (yych <= 0xF3) + goto yy738; + if (yych <= 0xF4) + goto yy739; + goto yy702; + } + } + yy729: + ++p; + yy730 : { return (bufsize_t)(p - start); } + yy731: + ++p; + yych = *p; + if (yych <= 0xDF) { + if (yych <= '[') { + if (yych <= 0x00) + goto yy702; + if (yych == ')') + goto yy742; + goto yy727; + } else { + if (yych <= '\\') + goto yy731; + if (yych <= 0x7F) + goto yy727; + if (yych <= 0xC1) + goto yy702; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) + goto yy734; + if (yych == 0xED) + goto yy736; + goto yy735; + } else { + if (yych <= 0xF0) + goto yy737; + if (yych <= 0xF3) + goto yy738; + if (yych <= 0xF4) + goto yy739; + goto yy702; + } + } + yy733: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0xBF) + goto yy727; + goto yy702; + yy734: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy702; + if (yych <= 0xBF) + goto yy733; + goto yy702; + yy735: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0xBF) + goto yy733; + goto yy702; + yy736: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0x9F) + goto yy733; + goto yy702; + yy737: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy702; + if (yych <= 0xBF) + goto yy735; + goto yy702; + yy738: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0xBF) + goto yy735; + goto yy702; + yy739: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy702; + if (yych <= 0x8F) + goto yy735; + goto yy702; + yy740: + yyaccept = 1; + marker = ++p; + yych = *p; + if (yybm[0 + yych] & 16) { + goto yy700; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) + goto yy704; + if (yych <= '"') + goto yy703; + goto yy705; + } else { + if (yych <= 0xC1) + goto yy704; + if (yych <= 0xDF) + goto yy707; + goto yy708; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy710; + goto yy709; + } else { + if (yych <= 0xF0) + goto yy711; + if (yych <= 0xF3) + goto yy712; + if (yych <= 0xF4) + goto yy713; + goto yy704; + } + } + yy741: + yyaccept = 2; + marker = ++p; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy714; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) + goto yy717; + if (yych <= '\'') + goto yy716; + goto yy718; + } else { + if (yych <= 0xC1) + goto yy717; + if (yych <= 0xDF) + goto yy720; + goto yy721; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy723; + goto yy722; + } else { + if (yych <= 0xF0) + goto yy724; + if (yych <= 0xF3) + goto yy725; + if (yych <= 0xF4) + goto yy726; + goto yy717; + } + } + yy742: + yyaccept = 3; + marker = ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy727; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= '(') + goto yy730; + if (yych <= ')') + goto yy729; + goto yy731; + } else { + if (yych <= 0xC1) + goto yy730; + if (yych <= 0xDF) + goto yy733; + goto yy734; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy736; + goto yy735; + } else { + if (yych <= 0xF0) + goto yy737; + if (yych <= 0xF3) + goto yy738; + if (yych <= 0xF4) + goto yy739; + goto yy730; + } + } + } +} + +// Match space characters, including newlines. +bufsize_t _scan_spacechars(const unsigned char *p) { + const unsigned char *start = p; + + { + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy747; + } + ++p; + { return 0; } + yy747: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy747; + } + { return (bufsize_t)(p - start); } + } +} + +// Match ATX heading start. +bufsize_t _scan_atx_heading_start(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych == '#') + goto yy754; + ++p; + yy753 : { return 0; } + yy754: + yych = *(marker = ++p); + if (yybm[0 + yych] & 128) { + goto yy755; + } + if (yych <= '\f') { + if (yych <= 0x08) + goto yy753; + if (yych <= '\n') + goto yy758; + goto yy753; + } else { + if (yych <= '\r') + goto yy758; + if (yych == '#') + goto yy759; + goto yy753; + } + yy755: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy755; + } + yy757 : { return (bufsize_t)(p - start); } + yy758: + yych = *++p; + goto yy757; + yy759: + yych = *++p; + if (yybm[0 + yych] & 128) { + goto yy755; + } + if (yych <= '\f') { + if (yych <= 0x08) + goto yy760; + if (yych <= '\n') + goto yy758; + } else { + if (yych <= '\r') + goto yy758; + if (yych == '#') + goto yy761; + } + yy760: + p = marker; + goto yy753; + yy761: + yych = *++p; + if (yybm[0 + yych] & 128) { + goto yy755; + } + if (yych <= '\f') { + if (yych <= 0x08) + goto yy760; + if (yych <= '\n') + goto yy758; + goto yy760; + } else { + if (yych <= '\r') + goto yy758; + if (yych != '#') + goto yy760; + } + yych = *++p; + if (yybm[0 + yych] & 128) { + goto yy755; + } + if (yych <= '\f') { + if (yych <= 0x08) + goto yy760; + if (yych <= '\n') + goto yy758; + goto yy760; + } else { + if (yych <= '\r') + goto yy758; + if (yych != '#') + goto yy760; + } + yych = *++p; + if (yybm[0 + yych] & 128) { + goto yy755; + } + if (yych <= '\f') { + if (yych <= 0x08) + goto yy760; + if (yych <= '\n') + goto yy758; + goto yy760; + } else { + if (yych <= '\r') + goto yy758; + if (yych != '#') + goto yy760; + } + ++p; + if (yybm[0 + (yych = *p)] & 128) { + goto yy755; + } + if (yych <= 0x08) + goto yy760; + if (yych <= '\n') + goto yy758; + if (yych == '\r') + goto yy758; + goto yy760; + } +} + +// Match setext heading line. Return 1 for level-1 heading, +// 2 for level-2, 0 for no match. +bufsize_t _scan_setext_heading_line(const unsigned char *p) { + const unsigned char *marker = NULL; + + { + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych == '-') + goto yy769; + if (yych == '=') + goto yy770; + ++p; + yy768 : { return 0; } + yy769: + yych = *(marker = ++p); + if (yybm[0 + yych] & 64) { + goto yy776; + } + if (yych <= '\f') { + if (yych <= 0x08) + goto yy768; + if (yych <= '\n') + goto yy772; + goto yy768; + } else { + if (yych <= '\r') + goto yy772; + if (yych == ' ') + goto yy772; + goto yy768; + } + yy770: + yych = *(marker = ++p); + if (yybm[0 + yych] & 128) { + goto yy782; + } + if (yych <= '\f') { + if (yych <= 0x08) + goto yy768; + if (yych <= '\n') + goto yy779; + goto yy768; + } else { + if (yych <= '\r') + goto yy779; + if (yych == ' ') + goto yy779; + goto yy768; + } + yy771: + ++p; + yych = *p; + yy772: + if (yybm[0 + yych] & 32) { + goto yy771; + } + if (yych <= 0x08) + goto yy773; + if (yych <= '\n') + goto yy774; + if (yych == '\r') + goto yy774; + yy773: + p = marker; + goto yy768; + yy774: + ++p; + { return 2; } + yy776: + ++p; + yych = *p; + if (yybm[0 + yych] & 32) { + goto yy771; + } + if (yych <= '\f') { + if (yych <= 0x08) + goto yy773; + if (yych <= '\n') + goto yy774; + goto yy773; + } else { + if (yych <= '\r') + goto yy774; + if (yych == '-') + goto yy776; + goto yy773; + } + yy778: + ++p; + yych = *p; + yy779: + if (yych <= '\f') { + if (yych <= 0x08) + goto yy773; + if (yych <= '\t') + goto yy778; + if (yych >= '\v') + goto yy773; + } else { + if (yych <= '\r') + goto yy780; + if (yych == ' ') + goto yy778; + goto yy773; + } + yy780: + ++p; + { return 1; } + yy782: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy782; + } + if (yych <= '\f') { + if (yych <= 0x08) + goto yy773; + if (yych <= '\t') + goto yy778; + if (yych <= '\n') + goto yy780; + goto yy773; + } else { + if (yych <= '\r') + goto yy780; + if (yych == ' ') + goto yy778; + goto yy773; + } + } +} + +// Scan an opening code fence. +bufsize_t _scan_open_code_fence(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + static const unsigned char yybm[] = { + 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 192, 192, 0, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 144, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, + 224, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }; + yych = *p; + if (yych == '`') + goto yy788; + if (yych == '~') + goto yy789; + ++p; + yy787 : { return 0; } + yy788: + yych = *(marker = ++p); + if (yych == '`') + goto yy790; + goto yy787; + yy789: + yych = *(marker = ++p); + if (yych == '~') + goto yy792; + goto yy787; + yy790: + yych = *++p; + if (yybm[0 + yych] & 16) { + goto yy793; + } + yy791: + p = marker; + goto yy787; + yy792: + yych = *++p; + if (yybm[0 + yych] & 32) { + goto yy795; + } + goto yy791; + yy793: + ++p; + yych = *p; + marker = p; + if (yybm[0 + yych] & 64) { + goto yy797; + } + if (yych <= 0xE0) { + if (yych <= '`') { + if (yych <= 0x00) + goto yy791; + if (yych <= '\r') + goto yy799; + goto yy793; + } else { + if (yych <= 0xC1) + goto yy791; + if (yych <= 0xDF) + goto yy801; + goto yy802; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) + goto yy804; + goto yy803; + } else { + if (yych <= 0xF0) + goto yy805; + if (yych <= 0xF3) + goto yy806; + if (yych <= 0xF4) + goto yy807; + goto yy791; + } + } + yy795: + ++p; + yych = *p; + marker = p; + if (yybm[0 + yych] & 32) { + goto yy795; + } + if (yych <= 0xDF) { + if (yych <= '\f') { + if (yych <= 0x00) + goto yy791; + if (yych == '\n') + goto yy810; + goto yy808; + } else { + if (yych <= '\r') + goto yy810; + if (yych <= 0x7F) + goto yy808; + if (yych <= 0xC1) + goto yy791; + goto yy812; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) + goto yy813; + if (yych == 0xED) + goto yy815; + goto yy814; + } else { + if (yych <= 0xF0) + goto yy816; + if (yych <= 0xF3) + goto yy817; + if (yych <= 0xF4) + goto yy818; + goto yy791; + } + } + yy797: + ++p; + yych = *p; + if (yybm[0 + yych] & 64) { + goto yy797; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy791; + if (yych >= 0x0E) + goto yy791; + } else { + if (yych <= 0xDF) + goto yy801; + if (yych <= 0xE0) + goto yy802; + goto yy803; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy804; + if (yych <= 0xEF) + goto yy803; + goto yy805; + } else { + if (yych <= 0xF3) + goto yy806; + if (yych <= 0xF4) + goto yy807; + goto yy791; + } + } + yy799: + ++p; + p = marker; + { return (bufsize_t)(p - start); } + yy801: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy791; + if (yych <= 0xBF) + goto yy797; + goto yy791; + yy802: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy791; + if (yych <= 0xBF) + goto yy801; + goto yy791; + yy803: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy791; + if (yych <= 0xBF) + goto yy801; + goto yy791; + yy804: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy791; + if (yych <= 0x9F) + goto yy801; + goto yy791; + yy805: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy791; + if (yych <= 0xBF) + goto yy803; + goto yy791; + yy806: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy791; + if (yych <= 0xBF) + goto yy803; + goto yy791; + yy807: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy791; + if (yych <= 0x8F) + goto yy803; + goto yy791; + yy808: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy808; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) + goto yy791; + if (yych >= 0x0E) + goto yy791; + } else { + if (yych <= 0xDF) + goto yy812; + if (yych <= 0xE0) + goto yy813; + goto yy814; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) + goto yy815; + if (yych <= 0xEF) + goto yy814; + goto yy816; + } else { + if (yych <= 0xF3) + goto yy817; + if (yych <= 0xF4) + goto yy818; + goto yy791; + } + } + yy810: + ++p; + p = marker; + { return (bufsize_t)(p - start); } + yy812: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy791; + if (yych <= 0xBF) + goto yy808; + goto yy791; + yy813: + ++p; + yych = *p; + if (yych <= 0x9F) + goto yy791; + if (yych <= 0xBF) + goto yy812; + goto yy791; + yy814: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy791; + if (yych <= 0xBF) + goto yy812; + goto yy791; + yy815: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy791; + if (yych <= 0x9F) + goto yy812; + goto yy791; + yy816: + ++p; + yych = *p; + if (yych <= 0x8F) + goto yy791; + if (yych <= 0xBF) + goto yy814; + goto yy791; + yy817: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy791; + if (yych <= 0xBF) + goto yy814; + goto yy791; + yy818: + ++p; + yych = *p; + if (yych <= 0x7F) + goto yy791; + if (yych <= 0x8F) + goto yy814; + goto yy791; + } +} + +// Scan a closing code fence with length at least len. +bufsize_t _scan_close_code_fence(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych == '`') + goto yy823; + if (yych == '~') + goto yy824; + ++p; + yy822 : { return 0; } + yy823: + yych = *(marker = ++p); + if (yych == '`') + goto yy825; + goto yy822; + yy824: + yych = *(marker = ++p); + if (yych == '~') + goto yy827; + goto yy822; + yy825: + yych = *++p; + if (yybm[0 + yych] & 32) { + goto yy828; + } + yy826: + p = marker; + goto yy822; + yy827: + yych = *++p; + if (yybm[0 + yych] & 64) { + goto yy830; + } + goto yy826; + yy828: + ++p; + yych = *p; + marker = p; + if (yybm[0 + yych] & 128) { + goto yy832; + } + if (yych <= '\f') { + if (yych <= 0x08) + goto yy826; + if (yych <= '\n') + goto yy834; + goto yy826; + } else { + if (yych <= '\r') + goto yy834; + if (yych == '`') + goto yy828; + goto yy826; + } + yy830: + ++p; + yych = *p; + marker = p; + if (yybm[0 + yych] & 64) { + goto yy830; + } + if (yych <= '\f') { + if (yych <= 0x08) + goto yy826; + if (yych <= '\t') + goto yy836; + if (yych <= '\n') + goto yy838; + goto yy826; + } else { + if (yych <= '\r') + goto yy838; + if (yych == ' ') + goto yy836; + goto yy826; + } + yy832: + ++p; + yych = *p; + if (yybm[0 + yych] & 128) { + goto yy832; + } + if (yych <= 0x08) + goto yy826; + if (yych <= '\n') + goto yy834; + if (yych != '\r') + goto yy826; + yy834: + ++p; + p = marker; + { return (bufsize_t)(p - start); } + yy836: + ++p; + yych = *p; + if (yych <= '\f') { + if (yych <= 0x08) + goto yy826; + if (yych <= '\t') + goto yy836; + if (yych >= '\v') + goto yy826; + } else { + if (yych <= '\r') + goto yy838; + if (yych == ' ') + goto yy836; + goto yy826; + } + yy838: + ++p; + p = marker; + { return (bufsize_t)(p - start); } + } +} + +// Scans an entity. +// Returns number of chars matched. +bufsize_t _scan_entity(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + yych = *p; + if (yych == '&') + goto yy844; + ++p; + yy843 : { return 0; } + yy844: + yych = *(marker = ++p); + if (yych <= '@') { + if (yych != '#') + goto yy843; + } else { + if (yych <= 'Z') + goto yy847; + if (yych <= '`') + goto yy843; + if (yych <= 'z') + goto yy847; + goto yy843; + } + yych = *++p; + if (yych <= 'W') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy848; + } else { + if (yych <= 'X') + goto yy849; + if (yych == 'x') + goto yy849; + } + yy846: + p = marker; + goto yy843; + yy847: + yych = *++p; + if (yych <= '@') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy850; + goto yy846; + } else { + if (yych <= 'Z') + goto yy850; + if (yych <= '`') + goto yy846; + if (yych <= 'z') + goto yy850; + goto yy846; + } + yy848: + yych = *++p; + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy851; + if (yych == ';') + goto yy852; + goto yy846; + yy849: + yych = *++p; + if (yych <= '@') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy854; + goto yy846; + } else { + if (yych <= 'F') + goto yy854; + if (yych <= '`') + goto yy846; + if (yych <= 'f') + goto yy854; + goto yy846; + } + yy850: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy855; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + goto yy855; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'z') + goto yy855; + goto yy846; + } + } + yy851: + yych = *++p; + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy856; + if (yych != ';') + goto yy846; + yy852: + ++p; + { return (bufsize_t)(p - start); } + yy854: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy857; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'F') { + if (yych <= '@') + goto yy846; + goto yy857; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'f') + goto yy857; + goto yy846; + } + } + yy855: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy858; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + goto yy858; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'z') + goto yy858; + goto yy846; + } + } + yy856: + yych = *++p; + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy859; + if (yych == ';') + goto yy852; + goto yy846; + yy857: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy860; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'F') { + if (yych <= '@') + goto yy846; + goto yy860; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'f') + goto yy860; + goto yy846; + } + } + yy858: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy861; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + goto yy861; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'z') + goto yy861; + goto yy846; + } + } + yy859: + yych = *++p; + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy862; + if (yych == ';') + goto yy852; + goto yy846; + yy860: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy863; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'F') { + if (yych <= '@') + goto yy846; + goto yy863; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'f') + goto yy863; + goto yy846; + } + } + yy861: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy864; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + goto yy864; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'z') + goto yy864; + goto yy846; + } + } + yy862: + yych = *++p; + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy865; + if (yych == ';') + goto yy852; + goto yy846; + yy863: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy866; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'F') { + if (yych <= '@') + goto yy846; + goto yy866; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'f') + goto yy866; + goto yy846; + } + } + yy864: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy867; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + goto yy867; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'z') + goto yy867; + goto yy846; + } + } + yy865: + yych = *++p; + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy868; + if (yych == ';') + goto yy852; + goto yy846; + yy866: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy868; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'F') { + if (yych <= '@') + goto yy846; + goto yy868; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'f') + goto yy868; + goto yy846; + } + } + yy867: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy869; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + goto yy869; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'z') + goto yy869; + goto yy846; + } + } + yy868: + yych = *++p; + if (yych == ';') + goto yy852; + goto yy846; + yy869: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy870; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy870: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy871; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy871: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy872; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy872: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy873; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy873: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy874; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy874: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy875; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy875: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy876; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy876: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy877; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy877: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy878; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy878: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy879; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy879: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy880; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy880: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy881; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy881: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy882; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy882: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy883; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy883: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy884; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy884: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy885; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy885: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy886; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy886: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy887; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy887: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy888; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy888: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy889; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy889: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy890; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy890: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy891; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy891: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy892; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + } else { + if (yych <= '`') + goto yy846; + if (yych >= '{') + goto yy846; + } + } + yy892: + ++p; + if ((yych = *p) <= ';') { + if (yych <= '/') + goto yy846; + if (yych <= '9') + goto yy868; + if (yych <= ':') + goto yy846; + goto yy852; + } else { + if (yych <= 'Z') { + if (yych <= '@') + goto yy846; + goto yy868; + } else { + if (yych <= '`') + goto yy846; + if (yych <= 'z') + goto yy868; + goto yy846; + } + } + } +} + +// Returns positive value if a URL begins in a way that is potentially +// dangerous, with javascript:, vbscript:, file:, or data:, otherwise 0. +bufsize_t _scan_dangerous_url(const unsigned char *p) { + const unsigned char *marker = NULL; + const unsigned char *start = p; + + { + unsigned char yych; + unsigned int yyaccept = 0; + yych = *p; + if (yych <= 'V') { + if (yych <= 'F') { + if (yych == 'D') + goto yy897; + if (yych >= 'F') + goto yy898; + } else { + if (yych == 'J') + goto yy899; + if (yych >= 'V') + goto yy900; + } + } else { + if (yych <= 'f') { + if (yych == 'd') + goto yy897; + if (yych >= 'f') + goto yy898; + } else { + if (yych <= 'j') { + if (yych >= 'j') + goto yy899; + } else { + if (yych == 'v') + goto yy900; + } + } + } + ++p; + yy896 : { return 0; } + yy897: + yyaccept = 0; + yych = *(marker = ++p); + if (yych == 'A') + goto yy901; + if (yych == 'a') + goto yy901; + goto yy896; + yy898: + yyaccept = 0; + yych = *(marker = ++p); + if (yych == 'I') + goto yy903; + if (yych == 'i') + goto yy903; + goto yy896; + yy899: + yyaccept = 0; + yych = *(marker = ++p); + if (yych == 'A') + goto yy904; + if (yych == 'a') + goto yy904; + goto yy896; + yy900: + yyaccept = 0; + yych = *(marker = ++p); + if (yych == 'B') + goto yy905; + if (yych == 'b') + goto yy905; + goto yy896; + yy901: + yych = *++p; + if (yych == 'T') + goto yy906; + if (yych == 't') + goto yy906; + yy902: + p = marker; + if (yyaccept == 0) { + goto yy896; + } else { + goto yy914; + } + yy903: + yych = *++p; + if (yych == 'L') + goto yy907; + if (yych == 'l') + goto yy907; + goto yy902; + yy904: + yych = *++p; + if (yych == 'V') + goto yy908; + if (yych == 'v') + goto yy908; + goto yy902; + yy905: + yych = *++p; + if (yych == 'S') + goto yy909; + if (yych == 's') + goto yy909; + goto yy902; + yy906: + yych = *++p; + if (yych == 'A') + goto yy910; + if (yych == 'a') + goto yy910; + goto yy902; + yy907: + yych = *++p; + if (yych == 'E') + goto yy911; + if (yych == 'e') + goto yy911; + goto yy902; + yy908: + yych = *++p; + if (yych == 'A') + goto yy905; + if (yych == 'a') + goto yy905; + goto yy902; + yy909: + yych = *++p; + if (yych == 'C') + goto yy912; + if (yych == 'c') + goto yy912; + goto yy902; + yy910: + yych = *++p; + if (yych == ':') + goto yy913; + goto yy902; + yy911: + yych = *++p; + if (yych == ':') + goto yy915; + goto yy902; + yy912: + yych = *++p; + if (yych == 'R') + goto yy916; + if (yych == 'r') + goto yy916; + goto yy902; + yy913: + yyaccept = 1; + yych = *(marker = ++p); + if (yych == 'I') + goto yy917; + if (yych == 'i') + goto yy917; + yy914 : { return (bufsize_t)(p - start); } + yy915: + yych = *++p; + goto yy914; + yy916: + yych = *++p; + if (yych == 'I') + goto yy918; + if (yych == 'i') + goto yy918; + goto yy902; + yy917: + yych = *++p; + if (yych == 'M') + goto yy919; + if (yych == 'm') + goto yy919; + goto yy902; + yy918: + yych = *++p; + if (yych == 'P') + goto yy920; + if (yych == 'p') + goto yy920; + goto yy902; + yy919: + yych = *++p; + if (yych == 'A') + goto yy921; + if (yych == 'a') + goto yy921; + goto yy902; + yy920: + yych = *++p; + if (yych == 'T') + goto yy911; + if (yych == 't') + goto yy911; + goto yy902; + yy921: + yych = *++p; + if (yych == 'G') + goto yy922; + if (yych != 'g') + goto yy902; + yy922: + yych = *++p; + if (yych == 'E') + goto yy923; + if (yych != 'e') + goto yy902; + yy923: + yych = *++p; + if (yych != '/') + goto yy902; + yych = *++p; + if (yych <= 'W') { + if (yych <= 'J') { + if (yych == 'G') + goto yy925; + if (yych <= 'I') + goto yy902; + goto yy926; + } else { + if (yych == 'P') + goto yy927; + if (yych <= 'V') + goto yy902; + goto yy928; + } + } else { + if (yych <= 'j') { + if (yych == 'g') + goto yy925; + if (yych <= 'i') + goto yy902; + goto yy926; + } else { + if (yych <= 'p') { + if (yych <= 'o') + goto yy902; + goto yy927; + } else { + if (yych == 'w') + goto yy928; + goto yy902; + } + } + } + yy925: + yych = *++p; + if (yych == 'I') + goto yy929; + if (yych == 'i') + goto yy929; + goto yy902; + yy926: + yych = *++p; + if (yych == 'P') + goto yy930; + if (yych == 'p') + goto yy930; + goto yy902; + yy927: + yych = *++p; + if (yych == 'N') + goto yy931; + if (yych == 'n') + goto yy931; + goto yy902; + yy928: + yych = *++p; + if (yych == 'E') + goto yy932; + if (yych == 'e') + goto yy932; + goto yy902; + yy929: + yych = *++p; + if (yych == 'F') + goto yy933; + if (yych == 'f') + goto yy933; + goto yy902; + yy930: + yych = *++p; + if (yych == 'E') + goto yy931; + if (yych != 'e') + goto yy902; + yy931: + yych = *++p; + if (yych == 'G') + goto yy933; + if (yych == 'g') + goto yy933; + goto yy902; + yy932: + yych = *++p; + if (yych == 'B') + goto yy935; + if (yych == 'b') + goto yy935; + goto yy902; + yy933: + ++p; + { return 0; } + yy935: + ++p; + if ((yych = *p) == 'P') + goto yy933; + if (yych == 'p') + goto yy933; + goto yy902; + } +} diff --git a/lib/cmark/src/scanners.h b/lib/cmark/src/scanners.h new file mode 100644 index 0000000..bcb5fe8 --- /dev/null +++ b/lib/cmark/src/scanners.h @@ -0,0 +1,53 @@ +#include "cmark.h" +#include "chunk.h" + +#ifdef __cplusplus +extern "C" { +#endif + +bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c, + bufsize_t offset); +bufsize_t _scan_scheme(const unsigned char *p); +bufsize_t _scan_autolink_uri(const unsigned char *p); +bufsize_t _scan_autolink_email(const unsigned char *p); +bufsize_t _scan_html_tag(const unsigned char *p); +bufsize_t _scan_html_block_start(const unsigned char *p); +bufsize_t _scan_html_block_start_7(const unsigned char *p); +bufsize_t _scan_html_block_end_1(const unsigned char *p); +bufsize_t _scan_html_block_end_2(const unsigned char *p); +bufsize_t _scan_html_block_end_3(const unsigned char *p); +bufsize_t _scan_html_block_end_4(const unsigned char *p); +bufsize_t _scan_html_block_end_5(const unsigned char *p); +bufsize_t _scan_link_title(const unsigned char *p); +bufsize_t _scan_spacechars(const unsigned char *p); +bufsize_t _scan_atx_heading_start(const unsigned char *p); +bufsize_t _scan_setext_heading_line(const unsigned char *p); +bufsize_t _scan_open_code_fence(const unsigned char *p); +bufsize_t _scan_close_code_fence(const unsigned char *p); +bufsize_t _scan_entity(const unsigned char *p); +bufsize_t _scan_dangerous_url(const unsigned char *p); + +#define scan_scheme(c, n) _scan_at(&_scan_scheme, c, n) +#define scan_autolink_uri(c, n) _scan_at(&_scan_autolink_uri, c, n) +#define scan_autolink_email(c, n) _scan_at(&_scan_autolink_email, c, n) +#define scan_html_tag(c, n) _scan_at(&_scan_html_tag, c, n) +#define scan_html_block_start(c, n) _scan_at(&_scan_html_block_start, c, n) +#define scan_html_block_start_7(c, n) _scan_at(&_scan_html_block_start_7, c, n) +#define scan_html_block_end_1(c, n) _scan_at(&_scan_html_block_end_1, c, n) +#define scan_html_block_end_2(c, n) _scan_at(&_scan_html_block_end_2, c, n) +#define scan_html_block_end_3(c, n) _scan_at(&_scan_html_block_end_3, c, n) +#define scan_html_block_end_4(c, n) _scan_at(&_scan_html_block_end_4, c, n) +#define scan_html_block_end_5(c, n) _scan_at(&_scan_html_block_end_5, c, n) +#define scan_link_title(c, n) _scan_at(&_scan_link_title, c, n) +#define scan_spacechars(c, n) _scan_at(&_scan_spacechars, c, n) +#define scan_atx_heading_start(c, n) _scan_at(&_scan_atx_heading_start, c, n) +#define scan_setext_heading_line(c, n) \ + _scan_at(&_scan_setext_heading_line, c, n) +#define scan_open_code_fence(c, n) _scan_at(&_scan_open_code_fence, c, n) +#define scan_close_code_fence(c, n) _scan_at(&_scan_close_code_fence, c, n) +#define scan_entity(c, n) _scan_at(&_scan_entity, c, n) +#define scan_dangerous_url(c, n) _scan_at(&_scan_dangerous_url, c, n) + +#ifdef __cplusplus +} +#endif diff --git a/lib/cmark/src/scanners.re b/lib/cmark/src/scanners.re new file mode 100644 index 0000000..447147b --- /dev/null +++ b/lib/cmark/src/scanners.re @@ -0,0 +1,305 @@ +#include <stdlib.h> +#include "chunk.h" +#include "scanners.h" + +bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c, bufsize_t offset) +{ + bufsize_t res; + unsigned char *ptr = (unsigned char *)c->data; + + if (ptr == NULL || offset > c->len) { + return 0; + } else { + unsigned char lim = ptr[c->len]; + + ptr[c->len] = '\0'; + res = scanner(ptr + offset); + ptr[c->len] = lim; + } + + return res; +} + +/*!re2c + re2c:define:YYCTYPE = "unsigned char"; + re2c:define:YYCURSOR = p; + re2c:define:YYMARKER = marker; + re2c:define:YYCTXMARKER = marker; + re2c:yyfill:enable = 0; + + wordchar = [^\x00-\x20]; + + spacechar = [ \t\v\f\r\n]; + + reg_char = [^\\()\x00-\x20]; + + escaped_char = [\\][!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~-]; + + tagname = [A-Za-z][A-Za-z0-9-]*; + + blocktagname = 'address'|'article'|'aside'|'base'|'basefont'|'blockquote'|'body'|'caption'|'center'|'col'|'colgroup'|'dd'|'details'|'dialog'|'dir'|'div'|'dl'|'dt'|'fieldset'|'figcaption'|'figure'|'footer'|'form'|'frame'|'frameset'|'h1'|'h2'|'h3'|'h4'|'h5'|'h6'|'head'|'header'|'hr'|'html'|'iframe'|'legend'|'li'|'link'|'main'|'menu'|'menuitem'|'nav'|'noframes'|'ol'|'optgroup'|'option'|'p'|'param'|'section'|'source'|'title'|'summary'|'table'|'tbody'|'td'|'tfoot'|'th'|'thead'|'title'|'tr'|'track'|'ul'; + + attributename = [a-zA-Z_:][a-zA-Z0-9:._-]*; + + unquotedvalue = [^ \t\r\n\v\f"'=<>`\x00]+; + singlequotedvalue = ['][^'\x00]*[']; + doublequotedvalue = ["][^"\x00]*["]; + + attributevalue = unquotedvalue | singlequotedvalue | doublequotedvalue; + + attributevaluespec = spacechar* [=] spacechar* attributevalue; + + attribute = spacechar+ attributename attributevaluespec?; + + opentag = tagname attribute* spacechar* [/]? [>]; + closetag = [/] tagname spacechar* [>]; + + htmlcomment = "!---->" | ("!--" ([-]? [^\x00>-]) ([-]? [^\x00-])* "-->"); + + processinginstruction = "?" ([^?>\x00]+ | [?][^>\x00] | [>])* "?>"; + + declaration = "!" [A-Z]+ spacechar+ [^>\x00]* ">"; + + cdata = "![CDATA[" ([^\]\x00]+ | "]" [^\]\x00] | "]]" [^>\x00])* "]]>"; + + htmltag = opentag | closetag | htmlcomment | processinginstruction | + declaration | cdata; + + in_parens_nosp = [(] (reg_char|escaped_char|[\\])* [)]; + + in_double_quotes = ["] (escaped_char|[^"\x00])* ["]; + in_single_quotes = ['] (escaped_char|[^'\x00])* [']; + in_parens = [(] (escaped_char|[^)\x00])* [)]; + + scheme = [A-Za-z][A-Za-z0-9.+-]{1,31}; +*/ + +// Try to match a scheme including colon. +bufsize_t _scan_scheme(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + scheme [:] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match URI autolink after first <, returning number of chars matched. +bufsize_t _scan_autolink_uri(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + scheme [:][^\x00-\x20<>]*[>] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match email autolink after first <, returning num of chars matched. +bufsize_t _scan_autolink_email(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+ + [@] + [a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])? + ([.][a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)* + [>] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match an HTML tag after first <, returning num of chars matched. +bufsize_t _scan_html_tag(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + htmltag { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match an HTML block tag start line, returning +// an integer code for the type of block (1-6, matching the spec). +// #7 is handled by a separate function, below. +bufsize_t _scan_html_block_start(const unsigned char *p) +{ + const unsigned char *marker = NULL; +/*!re2c + [<] ('script'|'pre'|'style') (spacechar | [>]) { return 1; } + '<!--' { return 2; } + '<?' { return 3; } + '<!' [A-Z] { return 4; } + '<![CDATA[' { return 5; } + [<] [/]? blocktagname (spacechar | [/]? [>]) { return 6; } + * { return 0; } +*/ +} + +// Try to match an HTML block tag start line of type 7, returning +// 7 if successful, 0 if not. +bufsize_t _scan_html_block_start_7(const unsigned char *p) +{ + const unsigned char *marker = NULL; +/*!re2c + [<] (opentag | closetag) [\t\n\f ]* [\r\n] { return 7; } + * { return 0; } +*/ +} + +// Try to match an HTML block end line of type 1 +bufsize_t _scan_html_block_end_1(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [^\n\x00]* [<] [/] ('script'|'pre'|'style') [>] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match an HTML block end line of type 2 +bufsize_t _scan_html_block_end_2(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [^\n\x00]* '-->' { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match an HTML block end line of type 3 +bufsize_t _scan_html_block_end_3(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [^\n\x00]* '?>' { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match an HTML block end line of type 4 +bufsize_t _scan_html_block_end_4(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [^\n\x00]* '>' { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match an HTML block end line of type 5 +bufsize_t _scan_html_block_end_5(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [^\n\x00]* ']]>' { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match a link title (in single quotes, in double quotes, or +// in parentheses), returning number of chars matched. Allow one +// level of internal nesting (quotes within quotes). +bufsize_t _scan_link_title(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + ["] (escaped_char|[^"\x00])* ["] { return (bufsize_t)(p - start); } + ['] (escaped_char|[^'\x00])* ['] { return (bufsize_t)(p - start); } + [(] (escaped_char|[^()\x00])* [)] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Match space characters, including newlines. +bufsize_t _scan_spacechars(const unsigned char *p) +{ + const unsigned char *start = p; \ +/*!re2c + [ \t\v\f\r\n]+ { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Match ATX heading start. +bufsize_t _scan_atx_heading_start(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [#]{1,6} ([ \t]+|[\r\n]) { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Match setext heading line. Return 1 for level-1 heading, +// 2 for level-2, 0 for no match. +bufsize_t _scan_setext_heading_line(const unsigned char *p) +{ + const unsigned char *marker = NULL; +/*!re2c + [=]+ [ \t]* [\r\n] { return 1; } + [-]+ [ \t]* [\r\n] { return 2; } + * { return 0; } +*/ +} + +// Scan an opening code fence. +bufsize_t _scan_open_code_fence(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [`]{3,} / [^`\r\n\x00]*[\r\n] { return (bufsize_t)(p - start); } + [~]{3,} / [^\r\n\x00]*[\r\n] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Scan a closing code fence with length at least len. +bufsize_t _scan_close_code_fence(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [`]{3,} / [ \t]*[\r\n] { return (bufsize_t)(p - start); } + [~]{3,} / [ \t]*[\r\n] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Scans an entity. +// Returns number of chars matched. +bufsize_t _scan_entity(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [&] ([#] ([Xx][A-Fa-f0-9]{1,6}|[0-9]{1,7}) |[A-Za-z][A-Za-z0-9]{1,31} ) [;] + { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Returns positive value if a URL begins in a way that is potentially +// dangerous, with javascript:, vbscript:, file:, or data:, otherwise 0. +bufsize_t _scan_dangerous_url(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + 'data:image/' ('png'|'gif'|'jpeg'|'webp') { return 0; } + 'javascript:' | 'vbscript:' | 'file:' | 'data:' { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + diff --git a/lib/cmark/src/utf8.c b/lib/cmark/src/utf8.c new file mode 100644 index 0000000..c29bbf7 --- /dev/null +++ b/lib/cmark/src/utf8.c @@ -0,0 +1,317 @@ +#include <stdlib.h> +#include <stdint.h> +#include <assert.h> + +#include "cmark_ctype.h" +#include "utf8.h" + +static const int8_t utf8proc_utf8class[256] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0}; + +static void encode_unknown(cmark_strbuf *buf) { + static const uint8_t repl[] = {239, 191, 189}; + cmark_strbuf_put(buf, repl, 3); +} + +static int utf8proc_charlen(const uint8_t *str, bufsize_t str_len) { + int length, i; + + if (!str_len) + return 0; + + length = utf8proc_utf8class[str[0]]; + + if (!length) + return -1; + + if (str_len >= 0 && (bufsize_t)length > str_len) + return -str_len; + + for (i = 1; i < length; i++) { + if ((str[i] & 0xC0) != 0x80) + return -i; + } + + return length; +} + +// Validate a single UTF-8 character according to RFC 3629. +static int utf8proc_valid(const uint8_t *str, bufsize_t str_len) { + int length = utf8proc_utf8class[str[0]]; + + if (!length) + return -1; + + if ((bufsize_t)length > str_len) + return -str_len; + + switch (length) { + case 2: + if ((str[1] & 0xC0) != 0x80) + return -1; + if (str[0] < 0xC2) { + // Overlong + return -length; + } + break; + + case 3: + if ((str[1] & 0xC0) != 0x80) + return -1; + if ((str[2] & 0xC0) != 0x80) + return -2; + if (str[0] == 0xE0) { + if (str[1] < 0xA0) { + // Overlong + return -length; + } + } else if (str[0] == 0xED) { + if (str[1] >= 0xA0) { + // Surrogate + return -length; + } + } + break; + + case 4: + if ((str[1] & 0xC0) != 0x80) + return -1; + if ((str[2] & 0xC0) != 0x80) + return -2; + if ((str[3] & 0xC0) != 0x80) + return -3; + if (str[0] == 0xF0) { + if (str[1] < 0x90) { + // Overlong + return -length; + } + } else if (str[0] >= 0xF4) { + if (str[0] > 0xF4 || str[1] >= 0x90) { + // Above 0x10FFFF + return -length; + } + } + break; + } + + return length; +} + +void cmark_utf8proc_check(cmark_strbuf *ob, const uint8_t *line, + bufsize_t size) { + bufsize_t i = 0; + + while (i < size) { + bufsize_t org = i; + int charlen = 0; + + while (i < size) { + if (line[i] < 0x80 && line[i] != 0) { + i++; + } else if (line[i] >= 0x80) { + charlen = utf8proc_valid(line + i, size - i); + if (charlen < 0) { + charlen = -charlen; + break; + } + i += charlen; + } else if (line[i] == 0) { + // ASCII NUL is technically valid but rejected + // for security reasons. + charlen = 1; + break; + } + } + + if (i > org) { + cmark_strbuf_put(ob, line + org, i - org); + } + + if (i >= size) { + break; + } else { + // Invalid UTF-8 + encode_unknown(ob); + i += charlen; + } + } +} + +int cmark_utf8proc_iterate(const uint8_t *str, bufsize_t str_len, + int32_t *dst) { + int length; + int32_t uc = -1; + + *dst = -1; + length = utf8proc_charlen(str, str_len); + if (length < 0) + return -1; + + switch (length) { + case 1: + uc = str[0]; + break; + case 2: + uc = ((str[0] & 0x1F) << 6) + (str[1] & 0x3F); + if (uc < 0x80) + uc = -1; + break; + case 3: + uc = ((str[0] & 0x0F) << 12) + ((str[1] & 0x3F) << 6) + (str[2] & 0x3F); + if (uc < 0x800 || (uc >= 0xD800 && uc < 0xE000)) + uc = -1; + break; + case 4: + uc = ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12) + + ((str[2] & 0x3F) << 6) + (str[3] & 0x3F); + if (uc < 0x10000 || uc >= 0x110000) + uc = -1; + break; + } + + if (uc < 0) + return -1; + + *dst = uc; + return length; +} + +void cmark_utf8proc_encode_char(int32_t uc, cmark_strbuf *buf) { + uint8_t dst[4]; + bufsize_t len = 0; + + assert(uc >= 0); + + if (uc < 0x80) { + dst[0] = (uint8_t)(uc); + len = 1; + } else if (uc < 0x800) { + dst[0] = (uint8_t)(0xC0 + (uc >> 6)); + dst[1] = 0x80 + (uc & 0x3F); + len = 2; + } else if (uc == 0xFFFF) { + dst[0] = 0xFF; + len = 1; + } else if (uc == 0xFFFE) { + dst[0] = 0xFE; + len = 1; + } else if (uc < 0x10000) { + dst[0] = (uint8_t)(0xE0 + (uc >> 12)); + dst[1] = 0x80 + ((uc >> 6) & 0x3F); + dst[2] = 0x80 + (uc & 0x3F); + len = 3; + } else if (uc < 0x110000) { + dst[0] = (uint8_t)(0xF0 + (uc >> 18)); + dst[1] = 0x80 + ((uc >> 12) & 0x3F); + dst[2] = 0x80 + ((uc >> 6) & 0x3F); + dst[3] = 0x80 + (uc & 0x3F); + len = 4; + } else { + encode_unknown(buf); + return; + } + + cmark_strbuf_put(buf, dst, len); +} + +void cmark_utf8proc_case_fold(cmark_strbuf *dest, const uint8_t *str, + bufsize_t len) { + int32_t c; + +#define bufpush(x) cmark_utf8proc_encode_char(x, dest) + + while (len > 0) { + bufsize_t char_len = cmark_utf8proc_iterate(str, len, &c); + + if (char_len >= 0) { +#include "case_fold_switch.inc" + } else { + encode_unknown(dest); + char_len = -char_len; + } + + str += char_len; + len -= char_len; + } +} + +// matches anything in the Zs class, plus LF, CR, TAB, FF. +int cmark_utf8proc_is_space(int32_t uc) { + return (uc == 9 || uc == 10 || uc == 12 || uc == 13 || uc == 32 || + uc == 160 || uc == 5760 || (uc >= 8192 && uc <= 8202) || uc == 8239 || + uc == 8287 || uc == 12288); +} + +// matches anything in the P[cdefios] classes. +int cmark_utf8proc_is_punctuation(int32_t uc) { + return ( + (uc < 128 && cmark_ispunct((char)uc)) || uc == 161 || uc == 167 || + uc == 171 || uc == 182 || uc == 183 || uc == 187 || uc == 191 || + uc == 894 || uc == 903 || (uc >= 1370 && uc <= 1375) || uc == 1417 || + uc == 1418 || uc == 1470 || uc == 1472 || uc == 1475 || uc == 1478 || + uc == 1523 || uc == 1524 || uc == 1545 || uc == 1546 || uc == 1548 || + uc == 1549 || uc == 1563 || uc == 1566 || uc == 1567 || + (uc >= 1642 && uc <= 1645) || uc == 1748 || (uc >= 1792 && uc <= 1805) || + (uc >= 2039 && uc <= 2041) || (uc >= 2096 && uc <= 2110) || uc == 2142 || + uc == 2404 || uc == 2405 || uc == 2416 || uc == 2800 || uc == 3572 || + uc == 3663 || uc == 3674 || uc == 3675 || (uc >= 3844 && uc <= 3858) || + uc == 3860 || (uc >= 3898 && uc <= 3901) || uc == 3973 || + (uc >= 4048 && uc <= 4052) || uc == 4057 || uc == 4058 || + (uc >= 4170 && uc <= 4175) || uc == 4347 || (uc >= 4960 && uc <= 4968) || + uc == 5120 || uc == 5741 || uc == 5742 || uc == 5787 || uc == 5788 || + (uc >= 5867 && uc <= 5869) || uc == 5941 || uc == 5942 || + (uc >= 6100 && uc <= 6102) || (uc >= 6104 && uc <= 6106) || + (uc >= 6144 && uc <= 6154) || uc == 6468 || uc == 6469 || uc == 6686 || + uc == 6687 || (uc >= 6816 && uc <= 6822) || (uc >= 6824 && uc <= 6829) || + (uc >= 7002 && uc <= 7008) || (uc >= 7164 && uc <= 7167) || + (uc >= 7227 && uc <= 7231) || uc == 7294 || uc == 7295 || + (uc >= 7360 && uc <= 7367) || uc == 7379 || (uc >= 8208 && uc <= 8231) || + (uc >= 8240 && uc <= 8259) || (uc >= 8261 && uc <= 8273) || + (uc >= 8275 && uc <= 8286) || uc == 8317 || uc == 8318 || uc == 8333 || + uc == 8334 || (uc >= 8968 && uc <= 8971) || uc == 9001 || uc == 9002 || + (uc >= 10088 && uc <= 10101) || uc == 10181 || uc == 10182 || + (uc >= 10214 && uc <= 10223) || (uc >= 10627 && uc <= 10648) || + (uc >= 10712 && uc <= 10715) || uc == 10748 || uc == 10749 || + (uc >= 11513 && uc <= 11516) || uc == 11518 || uc == 11519 || + uc == 11632 || (uc >= 11776 && uc <= 11822) || + (uc >= 11824 && uc <= 11842) || (uc >= 12289 && uc <= 12291) || + (uc >= 12296 && uc <= 12305) || (uc >= 12308 && uc <= 12319) || + uc == 12336 || uc == 12349 || uc == 12448 || uc == 12539 || uc == 42238 || + uc == 42239 || (uc >= 42509 && uc <= 42511) || uc == 42611 || + uc == 42622 || (uc >= 42738 && uc <= 42743) || + (uc >= 43124 && uc <= 43127) || uc == 43214 || uc == 43215 || + (uc >= 43256 && uc <= 43258) || uc == 43310 || uc == 43311 || + uc == 43359 || (uc >= 43457 && uc <= 43469) || uc == 43486 || + uc == 43487 || (uc >= 43612 && uc <= 43615) || uc == 43742 || + uc == 43743 || uc == 43760 || uc == 43761 || uc == 44011 || uc == 64830 || + uc == 64831 || (uc >= 65040 && uc <= 65049) || + (uc >= 65072 && uc <= 65106) || (uc >= 65108 && uc <= 65121) || + uc == 65123 || uc == 65128 || uc == 65130 || uc == 65131 || + (uc >= 65281 && uc <= 65283) || (uc >= 65285 && uc <= 65290) || + (uc >= 65292 && uc <= 65295) || uc == 65306 || uc == 65307 || + uc == 65311 || uc == 65312 || (uc >= 65339 && uc <= 65341) || + uc == 65343 || uc == 65371 || uc == 65373 || + (uc >= 65375 && uc <= 65381) || (uc >= 65792 && uc <= 65794) || + uc == 66463 || uc == 66512 || uc == 66927 || uc == 67671 || uc == 67871 || + uc == 67903 || (uc >= 68176 && uc <= 68184) || uc == 68223 || + (uc >= 68336 && uc <= 68342) || (uc >= 68409 && uc <= 68415) || + (uc >= 68505 && uc <= 68508) || (uc >= 69703 && uc <= 69709) || + uc == 69819 || uc == 69820 || (uc >= 69822 && uc <= 69825) || + (uc >= 69952 && uc <= 69955) || uc == 70004 || uc == 70005 || + (uc >= 70085 && uc <= 70088) || uc == 70093 || + (uc >= 70200 && uc <= 70205) || uc == 70854 || + (uc >= 71105 && uc <= 71113) || (uc >= 71233 && uc <= 71235) || + (uc >= 74864 && uc <= 74868) || uc == 92782 || uc == 92783 || + uc == 92917 || (uc >= 92983 && uc <= 92987) || uc == 92996 || + uc == 113823); +} diff --git a/lib/cmark/src/utf8.h b/lib/cmark/src/utf8.h new file mode 100644 index 0000000..8e45714 --- /dev/null +++ b/lib/cmark/src/utf8.h @@ -0,0 +1,24 @@ +#ifndef CMARK_UTF8_H +#define CMARK_UTF8_H + +#include <stdint.h> +#include "buffer.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void cmark_utf8proc_case_fold(cmark_strbuf *dest, const uint8_t *str, + bufsize_t len); +void cmark_utf8proc_encode_char(int32_t uc, cmark_strbuf *buf); +int cmark_utf8proc_iterate(const uint8_t *str, bufsize_t str_len, int32_t *dst); +void cmark_utf8proc_check(cmark_strbuf *dest, const uint8_t *line, + bufsize_t size); +int cmark_utf8proc_is_space(int32_t uc); +int cmark_utf8proc_is_punctuation(int32_t uc); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/cmark/src/xml.c b/lib/cmark/src/xml.c new file mode 100644 index 0000000..9306141 --- /dev/null +++ b/lib/cmark/src/xml.c @@ -0,0 +1,173 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <assert.h> + +#include "config.h" +#include "cmark.h" +#include "node.h" +#include "buffer.h" +#include "houdini.h" + +#define BUFFER_SIZE 100 + +// Functions to convert cmark_nodes to XML strings. + +static void escape_xml(cmark_strbuf *dest, const unsigned char *source, + bufsize_t length) { + houdini_escape_html0(dest, source, length, 0); +} + +struct render_state { + cmark_strbuf *xml; + int indent; +}; + +static CMARK_INLINE void indent(struct render_state *state) { + int i; + for (i = 0; i < state->indent; i++) { + cmark_strbuf_putc(state->xml, ' '); + } +} + +static int S_render_node(cmark_node *node, cmark_event_type ev_type, + struct render_state *state, int options) { + cmark_strbuf *xml = state->xml; + bool literal = false; + cmark_delim_type delim; + bool entering = (ev_type == CMARK_EVENT_ENTER); + char buffer[BUFFER_SIZE]; + + if (entering) { + indent(state); + cmark_strbuf_putc(xml, '<'); + cmark_strbuf_puts(xml, cmark_node_get_type_string(node)); + + if (options & CMARK_OPT_SOURCEPOS && node->start_line != 0) { + snprintf(buffer, BUFFER_SIZE, " sourcepos=\"%d:%d-%d:%d\"", + node->start_line, node->start_column, node->end_line, + node->end_column); + cmark_strbuf_puts(xml, buffer); + } + + literal = false; + + switch (node->type) { + case CMARK_NODE_DOCUMENT: + cmark_strbuf_puts(xml, " xmlns=\"http://commonmark.org/xml/1.0\""); + break; + case CMARK_NODE_TEXT: + case CMARK_NODE_CODE: + case CMARK_NODE_HTML_BLOCK: + case CMARK_NODE_HTML_INLINE: + cmark_strbuf_puts(xml, " xml:space=\"preserve\">"); + escape_xml(xml, node->data, node->len); + cmark_strbuf_puts(xml, "</"); + cmark_strbuf_puts(xml, cmark_node_get_type_string(node)); + literal = true; + break; + case CMARK_NODE_LIST: + switch (cmark_node_get_list_type(node)) { + case CMARK_ORDERED_LIST: + cmark_strbuf_puts(xml, " type=\"ordered\""); + snprintf(buffer, BUFFER_SIZE, " start=\"%d\"", + cmark_node_get_list_start(node)); + cmark_strbuf_puts(xml, buffer); + delim = cmark_node_get_list_delim(node); + if (delim == CMARK_PAREN_DELIM) { + cmark_strbuf_puts(xml, " delim=\"paren\""); + } else if (delim == CMARK_PERIOD_DELIM) { + cmark_strbuf_puts(xml, " delim=\"period\""); + } + break; + case CMARK_BULLET_LIST: + cmark_strbuf_puts(xml, " type=\"bullet\""); + break; + default: + break; + } + snprintf(buffer, BUFFER_SIZE, " tight=\"%s\"", + (cmark_node_get_list_tight(node) ? "true" : "false")); + cmark_strbuf_puts(xml, buffer); + break; + case CMARK_NODE_HEADING: + snprintf(buffer, BUFFER_SIZE, " level=\"%d\"", node->as.heading.level); + cmark_strbuf_puts(xml, buffer); + break; + case CMARK_NODE_CODE_BLOCK: + if (node->as.code.info) { + cmark_strbuf_puts(xml, " info=\""); + escape_xml(xml, node->as.code.info, strlen((char *)node->as.code.info)); + cmark_strbuf_putc(xml, '"'); + } + cmark_strbuf_puts(xml, " xml:space=\"preserve\">"); + escape_xml(xml, node->data, node->len); + cmark_strbuf_puts(xml, "</"); + cmark_strbuf_puts(xml, cmark_node_get_type_string(node)); + literal = true; + break; + case CMARK_NODE_CUSTOM_BLOCK: + case CMARK_NODE_CUSTOM_INLINE: + cmark_strbuf_puts(xml, " on_enter=\""); + escape_xml(xml, node->as.custom.on_enter, + strlen((char *)node->as.custom.on_enter)); + cmark_strbuf_putc(xml, '"'); + cmark_strbuf_puts(xml, " on_exit=\""); + escape_xml(xml, node->as.custom.on_exit, + strlen((char *)node->as.custom.on_exit)); + cmark_strbuf_putc(xml, '"'); + break; + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + cmark_strbuf_puts(xml, " destination=\""); + escape_xml(xml, node->as.link.url, strlen((char *)node->as.link.url)); + cmark_strbuf_putc(xml, '"'); + if (node->as.link.title) { + cmark_strbuf_puts(xml, " title=\""); + escape_xml(xml, node->as.link.title, + strlen((char *)node->as.link.title)); + cmark_strbuf_putc(xml, '"'); + } + break; + default: + break; + } + if (node->first_child) { + state->indent += 2; + } else if (!literal) { + cmark_strbuf_puts(xml, " /"); + } + cmark_strbuf_puts(xml, ">\n"); + + } else if (node->first_child) { + state->indent -= 2; + indent(state); + cmark_strbuf_puts(xml, "</"); + cmark_strbuf_puts(xml, cmark_node_get_type_string(node)); + cmark_strbuf_puts(xml, ">\n"); + } + + return 1; +} + +char *cmark_render_xml(cmark_node *root, int options) { + char *result; + cmark_strbuf xml = CMARK_BUF_INIT(root->mem); + cmark_event_type ev_type; + cmark_node *cur; + struct render_state state = {&xml, 0}; + + cmark_iter *iter = cmark_iter_new(root); + + cmark_strbuf_puts(state.xml, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + cmark_strbuf_puts(state.xml, + "<!DOCTYPE document SYSTEM \"CommonMark.dtd\">\n"); + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + S_render_node(cur, ev_type, &state, options); + } + result = (char *)cmark_strbuf_detach(&xml); + + cmark_iter_free(iter); + return result; +} |
