diff --git a/deps/cmark/.editorconfig b/deps/cmark/.editorconfig
new file mode 100644
index 0000000..12032e6
--- /dev/null
+++ b/deps/cmark/.editorconfig
@@ -0,0 +1,18 @@
+# editorconfig.org
+
+root = true
+
+[*]
+end_of_line = lf
+charset = utf-8
+insert_final_newline = true
+
+[*.{c,h}]
+trim_trailing_whitespace = true
+indent_style = space
+indent_size = 2
+
+[Makefile]
+trim_trailing_whitespace = true
+indent_style = tab
+indent_size = 8
diff --git a/deps/cmark/.gitattributes b/deps/cmark/.gitattributes
new file mode 100644
index 0000000..6313b56
--- /dev/null
+++ b/deps/cmark/.gitattributes
@@ -0,0 +1 @@
+* text=auto eol=lf
diff --git a/deps/cmark/.github/FUNDING.yml b/deps/cmark/.github/FUNDING.yml
new file mode 100644
index 0000000..726f8b0
--- /dev/null
+++ b/deps/cmark/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: [jgm]
diff --git a/deps/cmark/.github/workflows/ci.yml b/deps/cmark/.github/workflows/ci.yml
new file mode 100644
index 0000000..739d08d
--- /dev/null
+++ b/deps/cmark/.github/workflows/ci.yml
@@ -0,0 +1,102 @@
+name: CI tests
+
+on: [push, pull_request]
+
+jobs:
+
+ linter:
+
+ runs-on: ubuntu-latest
+
+ steps:
+
+ - uses: actions/checkout@v1
+ - name: Install clang-tidy
+ run: |
+ sudo apt-get install -y clang-tidy-11
+ sudo update-alternatives --install /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-11 100
+ - name: lint with clang-tidy
+ run: |
+ make lint
+ env:
+ CC: clang
+ CXX: clang++
+
+ linux:
+
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ cmake_opts:
+ - '-DCMARK_SHARED=ON'
+ - ''
+ compiler:
+ - c: 'clang'
+ cpp: 'clang++'
+ - c: 'gcc'
+ cpp: 'g++'
+ env:
+ CMAKE_OPTIONS: ${{ matrix.cmake_opts }}
+ CC: ${{ matrix.compiler.c }}
+ CXX: ${{ matrix.compiler.cpp }}
+
+ steps:
+ - uses: actions/checkout@v1
+ - name: Install valgrind
+ run: |
+ sudo apt install -y valgrind
+ - name: Build and test
+ run: |
+ make
+ make test
+ make leakcheck
+
+ macos:
+
+ runs-on: macOS-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ cmake_opts:
+ - '-DCMARK_SHARED=ON'
+ - ''
+ compiler:
+ - c: 'clang'
+ cpp: 'clang++'
+ - c: 'gcc'
+ cpp: 'g++'
+ env:
+ CMAKE_OPTIONS: ${{ matrix.cmake_opts }}
+ CC: ${{ matrix.compiler.c }}
+ CXX: ${{ matrix.compiler.cpp }}
+
+ steps:
+ - uses: actions/checkout@v1
+ - name: Build and test
+ env:
+ CMAKE_OPTIONS: -DCMARK_SHARED=OFF
+ run: |
+ make
+ make test
+
+ windows:
+
+ runs-on: windows-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ cmake_opts:
+ - '-DCMARK_SHARED=ON'
+ - ''
+ env:
+ CMAKE_OPTIONS: ${{ matrix.cmake_opts }}
+
+ steps:
+ - uses: actions/checkout@v1
+ - uses: ilammy/msvc-dev-cmd@v1
+ - name: Build and test
+ run: |
+ chcp 65001
+ nmake.exe /nologo /f Makefile.nmake test
+ shell: cmd
diff --git a/deps/cmark/.github/workflows/fuzz.yml b/deps/cmark/.github/workflows/fuzz.yml
new file mode 100644
index 0000000..aec48b6
--- /dev/null
+++ b/deps/cmark/.github/workflows/fuzz.yml
@@ -0,0 +1,23 @@
+name: CIFuzz
+on: [pull_request]
+jobs:
+ Fuzzing:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Build Fuzzers
+ uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
+ with:
+ oss-fuzz-project-name: 'cmark'
+ dry-run: false
+ - name: Run Fuzzers
+ uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
+ with:
+ oss-fuzz-project-name: 'cmark'
+ fuzz-seconds: 600
+ dry-run: false
+ - name: Upload Crash
+ uses: actions/upload-artifact@v1
+ if: failure()
+ with:
+ name: artifacts
+ path: ./out/artifacts
diff --git a/deps/cmark/.gitignore b/deps/cmark/.gitignore
new file mode 100644
index 0000000..f56da3c
--- /dev/null
+++ b/deps/cmark/.gitignore
@@ -0,0 +1,34 @@
+# Object files
+*.o
+*.ko
+*.obj
+*.elf
+
+# Libraries
+*.lib
+*.a
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+*.pyc
+
+*~
+*.bak
+*.diff
+*#
+*.zip
+bstrlib.txt
+build
+cmark.dSYM/*
+cmark
diff --git a/deps/cmark/.gitrepo b/deps/cmark/.gitrepo
new file mode 100644
index 0000000..8ff29cb
--- /dev/null
+++ b/deps/cmark/.gitrepo
@@ -0,0 +1,12 @@
+; DO NOT EDIT (unless you know what you are doing)
+;
+; This subdirectory is a git "subrepo", and this file is maintained by the
+; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme
+;
+[subrepo]
+ remote = https://github.com/commonmark/cmark.git
+ branch = 0.30.3
+ commit = 5ba25ff40eba44c811f79ab6a792baf945b8307c
+ parent = bb99771ac83ea85da0e1ab2c6c0c3475a7d21726
+ method = merge
+ cmdver = 0.4.6
diff --git a/deps/cmark/.travis.yml b/deps/cmark/.travis.yml
new file mode 100644
index 0000000..0dddedf
--- /dev/null
+++ b/deps/cmark/.travis.yml
@@ -0,0 +1,43 @@
+# Ensures that sudo is disabled, so that containerized builds are allowed
+arch:
+ - amd64
+ - ppc64le
+sudo: false
+
+os:
+ - linux
+ - osx
+language: c
+compiler:
+ - clang
+ - gcc
+matrix:
+ include:
+ - os: linux
+ compiler: gcc
+ env: CMAKE_OPTIONS="-DCMARK_SHARED=OFF"
+addons:
+ apt:
+ # we need a more recent cmake than travis/linux provides (at least 2.8.9):
+ sources:
+ - kubuntu-backports
+ - kalakris-cmake
+ packages:
+ - cmake
+ - python3
+ - valgrind
+before_install:
+ - |
+ if [ ${TRAVIS_OS_NAME:-'linux'} = 'osx' ]
+ then
+ echo "Building without python3, to make sure that works."
+ fi
+
+script:
+ - (mkdir -p build && cd build && cmake $CMAKE_OPTIONS ..)
+ - make test
+ - |
+ if [ ${TRAVIS_OS_NAME:-'linux'} = 'linux' ]
+ then
+ make leakcheck
+ fi
diff --git a/deps/cmark/CMakeLists.txt b/deps/cmark/CMakeLists.txt
new file mode 100644
index 0000000..0a4a4be
--- /dev/null
+++ b/deps/cmark/CMakeLists.txt
@@ -0,0 +1,79 @@
+cmake_minimum_required(VERSION 3.7)
+project(cmark VERSION 0.30.3)
+
+include("FindAsan.cmake")
+include(GNUInstallDirs)
+
+if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
+ message(FATAL_ERROR "Do not build in-source.\nPlease remove CMakeCache.txt and the CMakeFiles/ directory.\nThen: mkdir build ; cd build ; cmake .. ; make")
+endif()
+
+option(CMARK_TESTS "Build cmark tests and enable testing" ON)
+option(CMARK_STATIC "Build static libcmark library" ON)
+option(CMARK_SHARED "Build shared libcmark library" ON)
+option(CMARK_LIB_FUZZER "Build libFuzzer fuzzing harness" OFF)
+
+if(NOT MSVC)
+ set(CMAKE_C_STANDARD 99)
+ set(CMAKE_C_STANDARD_REQUIRED YES)
+ set(CMAKE_C_EXTENSIONS NO)
+endif()
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+# The Linux modules distributed with CMake add "-rdynamic" to the build flags
+# which is incompatible with static linking under certain configurations.
+# Unsetting CMAKE_SHARED_LIBRARY_LINK_C_FLAGS ensures this does not happen.
+if(CMARK_STATIC AND "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
+ SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)
+endif()
+
+# Check integrity of node structure when compiled as debug
+add_compile_options($<$ paragraph Item 1 Item 2 a c a c Hello, world! brzz!Header
\n"
+ "\n"
+ "
\n"
+ "\n"
+ "
\n"
+ "
\n"
+ "FENCED\n"
+ "
\n"
+ "CODE\n"
+ "
No newline
\n", + "document without trailing newline"); +} + +static void render_html(test_batch_runner *runner) { + char *html; + + static const char markdown[] = "foo *bar*\n" + "\n" + "paragraph 2\n"; + cmark_node *doc = + cmark_parse_document(markdown, sizeof(markdown) - 1, CMARK_OPT_DEFAULT); + + cmark_node *paragraph = cmark_node_first_child(doc); + html = cmark_render_html(paragraph, CMARK_OPT_DEFAULT); + STR_EQ(runner, html, "foo bar
\n", "render single paragraph"); + free(html); + + cmark_node *string = cmark_node_first_child(paragraph); + html = cmark_render_html(string, CMARK_OPT_DEFAULT); + STR_EQ(runner, html, "foo ", "render single inline"); + free(html); + + cmark_node *emph = cmark_node_next(string); + html = cmark_render_html(emph, CMARK_OPT_DEFAULT); + STR_EQ(runner, html, "bar", "render inline with children"); + free(html); + + cmark_node_free(doc); +} + +static void render_xml(test_batch_runner *runner) { + char *xml; + + static const char markdown[] = "foo *bar*\n" + "\n" + "control -\x0C-\n" + "fffe -\xEF\xBF\xBE-\n" + "ffff -\xEF\xBF\xBF-\n" + "escape <>&\"\n" + "\n" + "```\ncode\n```\n"; + cmark_node *doc = + cmark_parse_document(markdown, sizeof(markdown) - 1, CMARK_OPT_DEFAULT); + + xml = cmark_render_xml(doc, CMARK_OPT_DEFAULT); + STR_EQ(runner, xml, "\n" + "\n" + "((((" UTF8_REPL "))))
\n", "utf8 with U+0000"); + free(html); + + // Test NUL followed by newline + static const char string_with_nul_lf[] = "```\n\0\n```\n"; + html = cmark_markdown_to_html( + string_with_nul_lf, sizeof(string_with_nul_lf) - 1, CMARK_OPT_DEFAULT); + STR_EQ(runner, html, "\xef\xbf\xbd\n
\n",
+ "utf8 with \\0\\n");
+ free(html);
+}
+
+static void test_char(test_batch_runner *runner, int valid, const char *utf8,
+ const char *msg) {
+ char buf[20];
+ sprintf(buf, "((((%s))))", utf8);
+
+ if (valid) {
+ char expected[30];
+ sprintf(expected, "((((%s))))
\n", utf8); + test_md_to_html(runner, buf, expected, msg); + } else { + test_md_to_html(runner, buf, "((((" UTF8_REPL "))))
\n", msg); + } +} + +static void test_incomplete_char(test_batch_runner *runner, const char *utf8, + const char *msg) { + char buf[20]; + sprintf(buf, "----%s", utf8); + test_md_to_html(runner, buf, "----" UTF8_REPL "
\n", msg); +} + +static void test_continuation_byte(test_batch_runner *runner, + const char *utf8) { + size_t len = strlen(utf8); + + for (size_t pos = 1; pos < len; ++pos) { + char buf[20]; + sprintf(buf, "((((%s))))", utf8); + buf[4 + pos] = '\x20'; + + char expected[50]; + strcpy(expected, "((((" UTF8_REPL "\x20"); + for (size_t i = pos + 1; i < len; ++i) { + strcat(expected, UTF8_REPL); + } + strcat(expected, "))))
\n"); + + char *html = + cmark_markdown_to_html(buf, strlen(buf), CMARK_OPT_VALIDATE_UTF8); + STR_EQ(runner, html, expected, "invalid utf8 continuation byte %d/%d", pos, + len); + free(html); + } +} + +static void line_endings(test_batch_runner *runner) { + // Test list with different line endings + static const char list_with_endings[] = "- a\n- b\r\n- c\r- d"; + char *html = cmark_markdown_to_html( + list_with_endings, sizeof(list_with_endings) - 1, CMARK_OPT_DEFAULT); + STR_EQ(runner, html, + "line
\nline
line line
\n", + "crlf endings with CMARK_OPT_NOBREAKS"); + free(html); + + static const char no_line_ending[] = "```\nline\n```"; + html = cmark_markdown_to_html(no_line_ending, sizeof(no_line_ending) - 1, + CMARK_OPT_DEFAULT); + STR_EQ(runner, html, "line\n
\n",
+ "fenced code block with no final newline");
+ free(html);
+}
+
+static void numeric_entities(test_batch_runner *runner) {
+ test_md_to_html(runner, "", "" UTF8_REPL "
\n", + "Invalid numeric entity 0"); + test_md_to_html(runner, "", "\xED\x9F\xBF
\n", + "Valid numeric entity 0xD7FF"); + test_md_to_html(runner, "", "" UTF8_REPL "
\n", + "Invalid numeric entity 0xD800"); + test_md_to_html(runner, "", "" UTF8_REPL "
\n", + "Invalid numeric entity 0xDFFF"); + test_md_to_html(runner, "", "\xEE\x80\x80
\n", + "Valid numeric entity 0xE000"); + test_md_to_html(runner, "", "\xF4\x8F\xBF\xBF
\n", + "Valid numeric entity 0x10FFFF"); + test_md_to_html(runner, "", "" UTF8_REPL "
\n", + "Invalid numeric entity 0x110000"); + test_md_to_html(runner, "", "�
\n", + "Invalid numeric entity 0x80000000"); + test_md_to_html(runner, "", "�
\n", + "Invalid numeric entity 0xFFFFFFFF"); + test_md_to_html(runner, "", "�
\n", + "Invalid numeric entity 99999999"); + + test_md_to_html(runner, "", "&#;
\n", + "Min decimal entity length"); + test_md_to_html(runner, "", "&#x;
\n", + "Min hexadecimal entity length"); + test_md_to_html(runner, "", "�
\n", + "Max decimal entity length"); + test_md_to_html(runner, "A", "A
\n", + "Max hexadecimal entity length"); +} + +static void test_safe(test_batch_runner *runner) { + // Test safe mode + static const char raw_html[] = "hi\nlink\n
hi
\n"
+ " + **test** + | +
+ + test + + | + +
\n"); + } else { + cr(html); + cmark_strbuf_puts(html, "\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, "
");
+ } 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, "as.code.info, first_tag);
+ cmark_strbuf_puts(html, "\">");
+ }
+
+ escape_html(html, node->data, node->len);
+ cmark_strbuf_puts(html, "
\n");
+ break;
+
+ case CMARK_NODE_HTML_BLOCK:
+ cr(html);
+ if (!(options & CMARK_OPT_UNSAFE)) {
+ cmark_strbuf_puts(html, "");
+ } 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, "
\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, "');
+ } else {
+ cmark_strbuf_puts(html, "
\n");
+ }
+ }
+ break;
+
+ case CMARK_NODE_TEXT:
+ escape_html(html, node->data, node->len);
+ break;
+
+ case CMARK_NODE_LINEBREAK:
+ cmark_strbuf_puts(html, "
\n");
+ break;
+
+ case CMARK_NODE_SOFTBREAK:
+ if (options & CMARK_OPT_HARDBREAKS) {
+ cmark_strbuf_puts(html, "
\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, "");
+ escape_html(html, node->data, node->len);
+ cmark_strbuf_puts(html, "
");
+ break;
+
+ case CMARK_NODE_HTML_INLINE:
+ if (!(options & CMARK_OPT_UNSAFE)) {
+ cmark_strbuf_puts(html, "");
+ } 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, "");
+ } else {
+ cmark_strbuf_puts(html, "");
+ }
+ break;
+
+ case CMARK_NODE_EMPH:
+ if (entering) {
+ cmark_strbuf_puts(html, "");
+ } else {
+ cmark_strbuf_puts(html, "");
+ }
+ break;
+
+ case CMARK_NODE_LINK:
+ if (entering) {
+ cmark_strbuf_puts(html, "as.link.url && ((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, "");
+ }
+ break;
+
+ case CMARK_NODE_IMAGE:
+ if (entering) {
+ cmark_strbuf_puts(html, "
as.link.url && ((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/deps/cmark/src/inlines.c b/deps/cmark/src/inlines.c
new file mode 100644
index 0000000..96f4d45
--- /dev/null
+++ b/deps/cmark/src/inlines.c
@@ -0,0 +1,1483 @@
+#include
+#include
+#include
+
+#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 position;
+ bufsize_t length;
+ unsigned char delim_char;
+ bool can_open;
+ bool can_close;
+} delimiter;
+
+typedef struct bracket {
+ struct bracket *previous;
+ cmark_node *inl_text;
+ bufsize_t position;
+ bool image;
+ bool active;
+ bool bracket_after;
+} bracket;
+
+#define FLAG_SKIP_HTML_CDATA (1u << 0)
+#define FLAG_SKIP_HTML_DECLARATION (1u << 1)
+#define FLAG_SKIP_HTML_PI (1u << 2)
+#define FLAG_SKIP_HTML_COMMENT (1u << 3)
+
+typedef struct {
+ cmark_mem *mem;
+ cmark_chunk input;
+ unsigned flags;
+ 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;
+ bool no_link_openers;
+} 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);
+ }
+}
+
+// Like cmark_node_append_child but without costly sanity checks.
+// Assumes that child was newly created.
+static void append_child(cmark_node *node, cmark_node *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;
+ }
+}
+
+// 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;
+ 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->flags = 0;
+ 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;
+ e->no_link_openers = true;
+}
+
+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) {
+ bufsize_t initpos = subj->pos;
+ 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, initpos, initpos + openticks.len - 1, 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->position = subj->pos;
+ 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->position = subj->pos;
+ b->bracket_after = false;
+ subj->last_bracket = b;
+ if (!image) {
+ subj->no_link_openers = false;
+ }
+}
+
+// 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, bufsize_t stack_bottom) {
+ delimiter *candidate;
+ delimiter *closer = NULL;
+ delimiter *opener;
+ delimiter *old_closer;
+ bool opener_found;
+ int openers_bottom_index = 0;
+ bufsize_t openers_bottom[9] = {stack_bottom, stack_bottom, stack_bottom,
+ stack_bottom, stack_bottom, stack_bottom,
+ stack_bottom, stack_bottom, stack_bottom};
+
+ // move back to first relevant delim.
+ candidate = subj->last_delim;
+ while (candidate != NULL && candidate->position >= stack_bottom) {
+ closer = candidate;
+ candidate = candidate->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->can_open ? 3 : 0) + (closer->length % 3);
+ break;
+ default:
+ assert(false);
+ }
+
+ // Now look backwards for first matching opener:
+ opener = closer->previous;
+ opener_found = false;
+ while (opener != NULL &&
+ opener->position >= 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 == '\'' || closer->delim_char == '"') {
+ if (closer->delim_char == '\'') {
+ cmark_node_set_literal(closer->inl_text, RIGHTSINGLEQUOTE);
+ } else {
+ cmark_node_set_literal(closer->inl_text, RIGHTDOUBLEQUOTE);
+ }
+ closer = closer->next;
+ if (opener_found) {
+ if (old_closer->delim_char == '\'') {
+ cmark_node_set_literal(opener->inl_text, LEFTSINGLEQUOTE);
+ } else {
+ cmark_node_set_literal(opener->inl_text, LEFTDOUBLEQUOTE);
+ }
+ remove_delimiter(subj, opener);
+ remove_delimiter(subj, old_closer);
+ }
+ }
+ if (!opener_found) {
+ // set lower bound for future searches for openers
+ openers_bottom[openers_bottom_index] = old_closer->position;
+ 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->position >= 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_unlink(tmp);
+ 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
+ if (subj->pos + 2 <= subj->input.len) {
+ int c = subj->input.data[subj->pos];
+ if (c == '!' && (subj->flags & FLAG_SKIP_HTML_COMMENT) == 0) {
+ c = subj->input.data[subj->pos+1];
+ if (c == '-' && subj->input.data[subj->pos+2] == '-') {
+ if (subj->input.data[subj->pos+3] == '>') {
+ matchlen = 4;
+ } else if (subj->input.data[subj->pos+3] == '-' &&
+ subj->input.data[subj->pos+4] == '>') {
+ matchlen = 5;
+ } else {
+ matchlen = scan_html_comment(&subj->input, subj->pos + 1);
+ if (matchlen > 0) {
+ matchlen += 1; // prefix "<"
+ } else { // no match through end of input: set a flag so
+ // we don't reparse looking for -->:
+ subj->flags |= FLAG_SKIP_HTML_COMMENT;
+ }
+ }
+ } else if (c == '[') {
+ if ((subj->flags & FLAG_SKIP_HTML_CDATA) == 0) {
+ matchlen = scan_html_cdata(&subj->input, subj->pos + 2);
+ if (matchlen > 0) {
+ // The regex doesn't require the final "]]>". But if we're not at
+ // the end of input, it must come after the match. Otherwise,
+ // disable subsequent scans to avoid quadratic behavior.
+ matchlen += 5; // prefix "![", suffix "]]>"
+ if (subj->pos + matchlen > subj->input.len) {
+ subj->flags |= FLAG_SKIP_HTML_CDATA;
+ matchlen = 0;
+ }
+ }
+ }
+ } else if ((subj->flags & FLAG_SKIP_HTML_DECLARATION) == 0) {
+ matchlen = scan_html_declaration(&subj->input, subj->pos + 1);
+ if (matchlen > 0) {
+ matchlen += 2; // prefix "!", suffix ">"
+ if (subj->pos + matchlen > subj->input.len) {
+ subj->flags |= FLAG_SKIP_HTML_DECLARATION;
+ matchlen = 0;
+ }
+ }
+ }
+ } else if (c == '?') {
+ if ((subj->flags & FLAG_SKIP_HTML_PI) == 0) {
+ // Note that we allow an empty match.
+ matchlen = scan_html_pi(&subj->input, subj->pos + 1);
+ matchlen += 3; // prefix "?", suffix "?>"
+ if (subj->pos + matchlen > subj->input.len) {
+ subj->flags |= FLAG_SKIP_HTML_PI;
+ matchlen = 0;
+ }
+ }
+ } else {
+ 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 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;
+
+ if (!is_image && subj->no_link_openers) {
+ // take delimiter off stack
+ pop_bracket(subj);
+ return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("]"));
+ }
+
+ 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_unlink(tmp);
+ append_child(inl, tmp);
+ tmp = tmpnext;
+ }
+
+ // Free the bracket [:
+ cmark_node_free(opener->inl_text);
+
+ process_emphasis(subj, opener->position);
+ pop_bracket(subj);
+
+ // Now, if we have a link, we also want to deactivate links until
+ // we get a new opener. (This code can be removed if we decide to allow links
+ // inside links.)
+ if (!is_image) {
+ subj->no_link_openers = true;
+ }
+
+ 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\\`&_*[]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) {
+ 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) {
+ int internal_offset = parent->type == CMARK_NODE_HEADING ?
+ parent->as.heading.internal_offset : 0;
+ subject subj;
+ cmark_chunk content = {parent->data, parent->len};
+ subject_from_buf(mem, parent->start_line, parent->start_column - 1 + internal_offset, &subj, &content, refmap);
+ cmark_chunk_rtrim(&subj.input);
+
+ while (!is_eof(&subj) && parse_inline(&subj, parent, options))
+ ;
+
+ process_emphasis(&subj, 0);
+ // 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/deps/cmark/src/inlines.h b/deps/cmark/src/inlines.h
new file mode 100644
index 0000000..800ed0c
--- /dev/null
+++ b/deps/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/deps/cmark/src/iterator.c b/deps/cmark/src/iterator.c
new file mode 100644
index 0000000..63cbf9e
--- /dev/null
+++ b/deps/cmark/src/iterator.c
@@ -0,0 +1,122 @@
+#include
+#include
+
+#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/deps/cmark/src/iterator.h b/deps/cmark/src/iterator.h
new file mode 100644
index 0000000..30ce76f
--- /dev/null
+++ b/deps/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/deps/cmark/src/latex.c b/deps/cmark/src/latex.c
new file mode 100644
index 0000000..2051ed3
--- /dev/null
+++ b/deps/cmark/src/latex.c
@@ -0,0 +1,453 @@
+#include
+#include
+#include
+#include
+
+#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 - 1); // the next item will increment this
+ 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/deps/cmark/src/libcmark.pc.in b/deps/cmark/src/libcmark.pc.in
new file mode 100644
index 0000000..e259898
--- /dev/null
+++ b/deps/cmark/src/libcmark.pc.in
@@ -0,0 +1,10 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=@CMAKE_INSTALL_PREFIX@
+libdir=@CMAKE_INSTALL_FULL_LIBDIR@
+includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
+
+Name: libcmark
+Description: CommonMark parsing, rendering, and manipulation
+Version: @PROJECT_VERSION@
+Libs: -L${libdir} -lcmark
+Cflags: -I${includedir}
diff --git a/deps/cmark/src/main.c b/deps/cmark/src/main.c
new file mode 100644
index 0000000..e02a3c4
--- /dev/null
+++ b/deps/cmark/src/main.c
@@ -0,0 +1,213 @@
+#include
+#include
+#include
+#include
+#include "config.h"
+#include "cmark.h"
+#include "node.h"
+
+#if defined(__OpenBSD__)
+# include
+# if OpenBSD >= 201605
+# define USE_PLEDGE
+# include
+# endif
+#endif
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#include
+#include
+#endif
+
+typedef enum {
+ FORMAT_NONE,
+ FORMAT_HTML,
+ FORMAT_XML,
+ FORMAT_MAN,
+ FORMAT_COMMONMARK,
+ FORMAT_LATEX
+} writer_format;
+
+void print_usage(void) {
+ 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(" --safe Omit raw HTML and dangerous URLs\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], "--safe") == 0) {
+ options |= CMARK_OPT_SAFE;
+ } 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/deps/cmark/src/man.c b/deps/cmark/src/man.c
new file mode 100644
index 0000000..65e5c79
--- /dev/null
+++ b/deps/cmark/src/man.c
@@ -0,0 +1,281 @@
+#include
+#include
+#include
+#include
+
+#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);
+ struct block_number *new_block_number;
+ cmark_mem *allocator = cmark_get_default_mem_allocator();
+
+ // avoid unused parameter error:
+ (void)(options);
+
+ // indent inside nested lists
+ if (renderer->block_number_in_list_item &&
+ node->type < CMARK_NODE_FIRST_INLINE) {
+ if (entering) {
+ renderer->block_number_in_list_item->number += 1;
+ if (renderer->block_number_in_list_item->number == 2) {
+ CR();
+ LIT(".RS"); // indent
+ CR();
+ }
+ }
+ }
+
+ 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) {
+ new_block_number = allocator->calloc(1, sizeof(struct block_number));
+ new_block_number->number = 0;
+ new_block_number->parent = renderer->block_number_in_list_item;
+ renderer->block_number_in_list_item = new_block_number;
+ 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 {
+ if (renderer->block_number_in_list_item) {
+ if (renderer->block_number_in_list_item->number >= 2) {
+ CR();
+ LIT(".RE"); // de-indent
+ }
+ new_block_number = renderer->block_number_in_list_item;
+ renderer->block_number_in_list_item =
+ renderer->block_number_in_list_item->parent;
+ allocator->free(new_block_number);
+ }
+ 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/deps/cmark/src/node.c b/deps/cmark/src/node.c
new file mode 100644
index 0000000..3b0cf13
--- /dev/null
+++ b/deps/cmark/src/node.c
@@ -0,0 +1,872 @@
+#include
+#include
+
+#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) {
+ if (node == NULL || child == NULL || node == child) {
+ return false;
+ }
+
+ // Verify that child is not an ancestor of node.
+ if (child->first_child != NULL) {
+ cmark_node *cur = node->parent;
+
+ while (cur != NULL) {
+ if (cur == child) {
+ return false;
+ }
+ cur = cur->parent;
+ }
+ }
+
+ 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 "";
+}
+
+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/deps/cmark/src/node.h b/deps/cmark/src/node.h
new file mode 100644
index 0000000..1cae5d7
--- /dev/null
+++ b/deps/cmark/src/node.h
@@ -0,0 +1,92 @@
+#ifndef CMARK_NODE_H
+#define CMARK_NODE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include
+#include
+
+#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 internal_offset;
+ int8_t 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;
+ 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/deps/cmark/src/parser.h b/deps/cmark/src/parser.h
new file mode 100644
index 0000000..f546ace
--- /dev/null
+++ b/deps/cmark/src/parser.h
@@ -0,0 +1,42 @@
+#ifndef CMARK_AST_H
+#define CMARK_AST_H
+
+#include
+#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;
+ unsigned int total_size;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/deps/cmark/src/references.c b/deps/cmark/src/references.c
new file mode 100644
index 0000000..39b4f2b
--- /dev/null
+++ b/deps/cmark/src/references.c
@@ -0,0 +1,171 @@
+#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;
+
+ if (ref->url != NULL)
+ ref->size += strlen((char*)ref->url);
+ if (ref->title != NULL)
+ ref->size += strlen((char*)ref->title);
+
+ 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;
+ cmark_reference *r = 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);
+
+ if (ref != NULL) {
+ r = ref[0];
+ /* Check for expansion limit */
+ if (map->max_ref_size && r->size > map->max_ref_size - map->ref_size)
+ return NULL;
+ map->ref_size += r->size;
+ }
+
+ return r;
+}
+
+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/deps/cmark/src/references.h b/deps/cmark/src/references.h
new file mode 100644
index 0000000..b069d92
--- /dev/null
+++ b/deps/cmark/src/references.h
@@ -0,0 +1,43 @@
+#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;
+ unsigned int size;
+};
+
+typedef struct cmark_reference cmark_reference;
+
+struct cmark_reference_map {
+ cmark_mem *mem;
+ cmark_reference *refs;
+ cmark_reference **sorted;
+ unsigned int size;
+ unsigned int ref_size;
+ unsigned int max_ref_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/deps/cmark/src/render.c b/deps/cmark/src/render.c
new file mode 100644
index 0000000..f71b048
--- /dev/null
+++ b/deps/cmark/src/render.c
@@ -0,0 +1,193 @@
+#include
+#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, NULL,
+ 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/deps/cmark/src/render.h b/deps/cmark/src/render.h
new file mode 100644
index 0000000..db60a5d
--- /dev/null
+++ b/deps/cmark/src/render.h
@@ -0,0 +1,55 @@
+#ifndef CMARK_RENDER_H
+#define CMARK_RENDER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include
+#include "buffer.h"
+
+typedef enum { LITERAL, NORMAL, TITLE, URL } cmark_escaping;
+
+struct block_number {
+ int number;
+ struct block_number *parent;
+};
+
+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;
+ struct block_number *block_number_in_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/deps/cmark/src/scanners.c b/deps/cmark/src/scanners.c
new file mode 100644
index 0000000..5d8950f
--- /dev/null
+++ b/deps/cmark/src/scanners.c
@@ -0,0 +1,13634 @@
+/* Generated by re2c 3.0 */
+#include
+#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 yy1;
+ if (yych <= 'Z')
+ goto yy3;
+ if (yych <= '`')
+ goto yy1;
+ if (yych <= 'z')
+ goto yy3;
+ yy1:
+ ++p;
+ yy2 : { return 0; }
+ yy3:
+ yych = *(marker = ++p);
+ if (yych <= '/') {
+ if (yych <= '+') {
+ if (yych <= '*')
+ goto yy2;
+ } else {
+ if (yych <= ',')
+ goto yy2;
+ if (yych >= '/')
+ goto yy2;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '9')
+ goto yy4;
+ if (yych <= '@')
+ goto yy2;
+ } else {
+ if (yych <= '`')
+ goto yy2;
+ if (yych >= '{')
+ goto yy2;
+ }
+ }
+ yy4:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych == '+')
+ goto yy6;
+ } else {
+ if (yych != '/')
+ goto yy6;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych >= 'A')
+ goto yy6;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych <= 'z')
+ goto yy6;
+ }
+ }
+ yy5:
+ p = marker;
+ goto yy2;
+ yy6:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych == '+')
+ goto yy8;
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ goto yy8;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ goto yy8;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych <= 'z')
+ goto yy8;
+ goto yy5;
+ }
+ }
+ yy7:
+ ++p;
+ { return (bufsize_t)(p - start); }
+ yy8:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy5;
+ } else {
+ if (yych == '/')
+ goto yy5;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy7;
+ if (yych <= '@')
+ goto yy5;
+ } else {
+ if (yych <= '`')
+ goto yy5;
+ if (yych >= '{')
+ goto yy5;
+ }
+ }
+ yych = *++p;
+ if (yych == ':')
+ goto yy7;
+ goto yy5;
+ }
+}
+
+// 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 yy10;
+ if (yych <= 'Z')
+ goto yy12;
+ if (yych <= '`')
+ goto yy10;
+ if (yych <= 'z')
+ goto yy12;
+ yy10:
+ ++p;
+ yy11 : { return 0; }
+ yy12:
+ yych = *(marker = ++p);
+ if (yych <= '/') {
+ if (yych <= '+') {
+ if (yych <= '*')
+ goto yy11;
+ } else {
+ if (yych <= ',')
+ goto yy11;
+ if (yych >= '/')
+ goto yy11;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '9')
+ goto yy13;
+ if (yych <= '@')
+ goto yy11;
+ } else {
+ if (yych <= '`')
+ goto yy11;
+ if (yych >= '{')
+ goto yy11;
+ }
+ }
+ yy13:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych == '+')
+ goto yy15;
+ } else {
+ if (yych != '/')
+ goto yy15;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych >= 'A')
+ goto yy15;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych <= 'z')
+ goto yy15;
+ }
+ }
+ yy14:
+ p = marker;
+ goto yy11;
+ yy15:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych == '+')
+ goto yy17;
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ goto yy17;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ goto yy17;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych <= 'z')
+ goto yy17;
+ goto yy14;
+ }
+ }
+ yy16:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy16;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '<')
+ goto yy14;
+ if (yych <= '>')
+ goto yy18;
+ goto yy14;
+ } else {
+ if (yych <= 0xDF)
+ goto yy19;
+ if (yych <= 0xE0)
+ goto yy20;
+ goto yy21;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy22;
+ if (yych <= 0xEF)
+ goto yy21;
+ goto yy23;
+ } else {
+ if (yych <= 0xF3)
+ goto yy24;
+ if (yych <= 0xF4)
+ goto yy25;
+ goto yy14;
+ }
+ }
+ yy17:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych == '+')
+ goto yy26;
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ goto yy26;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ goto yy26;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych <= 'z')
+ goto yy26;
+ goto yy14;
+ }
+ }
+ yy18:
+ ++p;
+ { return (bufsize_t)(p - start); }
+ yy19:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy14;
+ if (yych <= 0xBF)
+ goto yy16;
+ goto yy14;
+ yy20:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy14;
+ if (yych <= 0xBF)
+ goto yy19;
+ goto yy14;
+ yy21:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy14;
+ if (yych <= 0xBF)
+ goto yy19;
+ goto yy14;
+ yy22:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy14;
+ if (yych <= 0x9F)
+ goto yy19;
+ goto yy14;
+ yy23:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy14;
+ if (yych <= 0xBF)
+ goto yy21;
+ goto yy14;
+ yy24:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy14;
+ if (yych <= 0xBF)
+ goto yy21;
+ goto yy14;
+ yy25:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy14;
+ if (yych <= 0x8F)
+ goto yy21;
+ goto yy14;
+ yy26:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych <= ',') {
+ if (yych != '+')
+ goto yy14;
+ } else {
+ if (yych == '/')
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= ':')
+ goto yy16;
+ if (yych <= '@')
+ goto yy14;
+ } else {
+ if (yych <= '`')
+ goto yy14;
+ if (yych >= '{')
+ goto yy14;
+ }
+ }
+ yych = *++p;
+ if (yych == ':')
+ goto yy16;
+ goto yy14;
+ }
+}
+
+// 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 yy30;
+ if (yych >= '#')
+ goto yy30;
+ } else {
+ if (yych <= ')')
+ goto yy28;
+ if (yych != ',')
+ goto yy30;
+ }
+ } else {
+ if (yych <= '?') {
+ if (yych == '=')
+ goto yy30;
+ if (yych >= '?')
+ goto yy30;
+ } else {
+ if (yych <= 'Z') {
+ if (yych >= 'A')
+ goto yy30;
+ } else {
+ if (yych <= ']')
+ goto yy28;
+ if (yych <= '~')
+ goto yy30;
+ }
+ }
+ }
+ yy28:
+ ++p;
+ yy29 : { return 0; }
+ yy30:
+ yych = *(marker = ++p);
+ if (yych <= ',') {
+ if (yych <= '"') {
+ if (yych == '!')
+ goto yy32;
+ goto yy29;
+ } else {
+ if (yych <= '\'')
+ goto yy32;
+ if (yych <= ')')
+ goto yy29;
+ if (yych <= '+')
+ goto yy32;
+ goto yy29;
+ }
+ } else {
+ if (yych <= '>') {
+ if (yych <= '9')
+ goto yy32;
+ if (yych == '=')
+ goto yy32;
+ goto yy29;
+ } else {
+ if (yych <= 'Z')
+ goto yy32;
+ if (yych <= ']')
+ goto yy29;
+ if (yych <= '~')
+ goto yy32;
+ goto yy29;
+ }
+ }
+ yy31:
+ yych = *++p;
+ yy32:
+ if (yybm[0 + yych] & 128) {
+ goto yy31;
+ }
+ if (yych <= '>')
+ goto yy33;
+ if (yych <= '@')
+ goto yy34;
+ yy33:
+ p = marker;
+ goto yy29;
+ yy34:
+ yych = *++p;
+ if (yych <= '@') {
+ if (yych <= '/')
+ goto yy33;
+ if (yych >= ':')
+ goto yy33;
+ } else {
+ if (yych <= 'Z')
+ goto yy35;
+ if (yych <= '`')
+ goto yy33;
+ if (yych >= '{')
+ goto yy33;
+ }
+ yy35:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy36;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy36;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy36;
+ goto yy33;
+ }
+ }
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy38;
+ if (yych <= '/')
+ goto yy33;
+ goto yy39;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy39;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy39;
+ goto yy33;
+ }
+ }
+ yy36:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych <= '-')
+ goto yy38;
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy39;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy39;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy39;
+ goto yy33;
+ }
+ }
+ yy37:
+ ++p;
+ { return (bufsize_t)(p - start); }
+ yy38:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy40;
+ if (yych <= '/')
+ goto yy33;
+ goto yy41;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy41;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy41;
+ goto yy33;
+ }
+ }
+ yy39:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy41;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy41;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy41;
+ goto yy33;
+ }
+ }
+ yy40:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy42;
+ if (yych <= '/')
+ goto yy33;
+ goto yy43;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy43;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy43;
+ goto yy33;
+ }
+ }
+ yy41:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy43;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy43;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy43;
+ goto yy33;
+ }
+ }
+ yy42:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy44;
+ if (yych <= '/')
+ goto yy33;
+ goto yy45;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy45;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy45;
+ goto yy33;
+ }
+ }
+ yy43:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy45;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy45;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy45;
+ goto yy33;
+ }
+ }
+ yy44:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy46;
+ if (yych <= '/')
+ goto yy33;
+ goto yy47;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy47;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy47;
+ goto yy33;
+ }
+ }
+ yy45:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy47;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy47;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy47;
+ goto yy33;
+ }
+ }
+ yy46:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy48;
+ if (yych <= '/')
+ goto yy33;
+ goto yy49;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy49;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy49;
+ goto yy33;
+ }
+ }
+ yy47:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy49;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy49;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy49;
+ goto yy33;
+ }
+ }
+ yy48:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy50;
+ if (yych <= '/')
+ goto yy33;
+ goto yy51;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy51;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy51;
+ goto yy33;
+ }
+ }
+ yy49:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy51;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy51;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy51;
+ goto yy33;
+ }
+ }
+ yy50:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy52;
+ if (yych <= '/')
+ goto yy33;
+ goto yy53;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy53;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy53;
+ goto yy33;
+ }
+ }
+ yy51:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy53;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy53;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy53;
+ goto yy33;
+ }
+ }
+ yy52:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy54;
+ if (yych <= '/')
+ goto yy33;
+ goto yy55;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy55;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy55;
+ goto yy33;
+ }
+ }
+ yy53:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy55;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy55;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy55;
+ goto yy33;
+ }
+ }
+ yy54:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy56;
+ if (yych <= '/')
+ goto yy33;
+ goto yy57;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy57;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy57;
+ goto yy33;
+ }
+ }
+ yy55:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy57;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy57;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy57;
+ goto yy33;
+ }
+ }
+ yy56:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy58;
+ if (yych <= '/')
+ goto yy33;
+ goto yy59;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy59;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy59;
+ goto yy33;
+ }
+ }
+ yy57:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy59;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy59;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy59;
+ goto yy33;
+ }
+ }
+ yy58:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy60;
+ if (yych <= '/')
+ goto yy33;
+ goto yy61;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy61;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy61;
+ goto yy33;
+ }
+ }
+ yy59:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy61;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy61;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy61;
+ goto yy33;
+ }
+ }
+ yy60:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy62;
+ if (yych <= '/')
+ goto yy33;
+ goto yy63;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy63;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy63;
+ goto yy33;
+ }
+ }
+ yy61:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy63;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy63;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy63;
+ goto yy33;
+ }
+ }
+ yy62:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy64;
+ if (yych <= '/')
+ goto yy33;
+ goto yy65;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy65;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy65;
+ goto yy33;
+ }
+ }
+ yy63:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy65;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy65;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy65;
+ goto yy33;
+ }
+ }
+ yy64:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy66;
+ if (yych <= '/')
+ goto yy33;
+ goto yy67;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy67;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy67;
+ goto yy33;
+ }
+ }
+ yy65:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy67;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy67;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy67;
+ goto yy33;
+ }
+ }
+ yy66:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy68;
+ if (yych <= '/')
+ goto yy33;
+ goto yy69;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy69;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy69;
+ goto yy33;
+ }
+ }
+ yy67:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy69;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy69;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy69;
+ goto yy33;
+ }
+ }
+ yy68:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy70;
+ if (yych <= '/')
+ goto yy33;
+ goto yy71;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy71;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy71;
+ goto yy33;
+ }
+ }
+ yy69:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy71;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy71;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy71;
+ goto yy33;
+ }
+ }
+ yy70:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy72;
+ if (yych <= '/')
+ goto yy33;
+ goto yy73;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy73;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy73;
+ goto yy33;
+ }
+ }
+ yy71:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy73;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy73;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy73;
+ goto yy33;
+ }
+ }
+ yy72:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy74;
+ if (yych <= '/')
+ goto yy33;
+ goto yy75;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy75;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy75;
+ goto yy33;
+ }
+ }
+ yy73:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy75;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy75;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy75;
+ goto yy33;
+ }
+ }
+ yy74:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy76;
+ if (yych <= '/')
+ goto yy33;
+ goto yy77;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy77;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy77;
+ goto yy33;
+ }
+ }
+ yy75:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy77;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy77;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy77;
+ goto yy33;
+ }
+ }
+ yy76:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy78;
+ if (yych <= '/')
+ goto yy33;
+ goto yy79;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy79;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy79;
+ goto yy33;
+ }
+ }
+ yy77:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy79;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy79;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy79;
+ goto yy33;
+ }
+ }
+ yy78:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy80;
+ if (yych <= '/')
+ goto yy33;
+ goto yy81;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy81;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy81;
+ goto yy33;
+ }
+ }
+ yy79:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy81;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy81;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy81;
+ goto yy33;
+ }
+ }
+ yy80:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy82;
+ if (yych <= '/')
+ goto yy33;
+ goto yy83;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy83;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy83;
+ goto yy33;
+ }
+ }
+ yy81:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy83;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy83;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy83;
+ goto yy33;
+ }
+ }
+ yy82:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy84;
+ if (yych <= '/')
+ goto yy33;
+ goto yy85;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy85;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy85;
+ goto yy33;
+ }
+ }
+ yy83:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy85;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy85;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy85;
+ goto yy33;
+ }
+ }
+ yy84:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy86;
+ if (yych <= '/')
+ goto yy33;
+ goto yy87;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy87;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy87;
+ goto yy33;
+ }
+ }
+ yy85:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy87;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy87;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy87;
+ goto yy33;
+ }
+ }
+ yy86:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy88;
+ if (yych <= '/')
+ goto yy33;
+ goto yy89;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy89;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy89;
+ goto yy33;
+ }
+ }
+ yy87:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy89;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy89;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy89;
+ goto yy33;
+ }
+ }
+ yy88:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy90;
+ if (yych <= '/')
+ goto yy33;
+ goto yy91;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy91;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy91;
+ goto yy33;
+ }
+ }
+ yy89:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy91;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy91;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy91;
+ goto yy33;
+ }
+ }
+ yy90:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy92;
+ if (yych <= '/')
+ goto yy33;
+ goto yy93;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy93;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy93;
+ goto yy33;
+ }
+ }
+ yy91:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy93;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy93;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy93;
+ goto yy33;
+ }
+ }
+ yy92:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy94;
+ if (yych <= '/')
+ goto yy33;
+ goto yy95;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy95;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy95;
+ goto yy33;
+ }
+ }
+ yy93:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy95;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy95;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy95;
+ goto yy33;
+ }
+ }
+ yy94:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy96;
+ if (yych <= '/')
+ goto yy33;
+ goto yy97;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy97;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy97;
+ goto yy33;
+ }
+ }
+ yy95:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy97;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy97;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy97;
+ goto yy33;
+ }
+ }
+ yy96:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy98;
+ if (yych <= '/')
+ goto yy33;
+ goto yy99;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy99;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy99;
+ goto yy33;
+ }
+ }
+ yy97:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy99;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy99;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy99;
+ goto yy33;
+ }
+ }
+ yy98:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy100;
+ if (yych <= '/')
+ goto yy33;
+ goto yy101;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy101;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy101;
+ goto yy33;
+ }
+ }
+ yy99:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy101;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy101;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy101;
+ goto yy33;
+ }
+ }
+ yy100:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy102;
+ if (yych <= '/')
+ goto yy33;
+ goto yy103;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy103;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy103;
+ goto yy33;
+ }
+ }
+ yy101:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy103;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy103;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy103;
+ goto yy33;
+ }
+ }
+ yy102:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy104;
+ if (yych <= '/')
+ goto yy33;
+ goto yy105;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy105;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy105;
+ goto yy33;
+ }
+ }
+ yy103:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy105;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy105;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy105;
+ goto yy33;
+ }
+ }
+ yy104:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy106;
+ if (yych <= '/')
+ goto yy33;
+ goto yy107;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy107;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy107;
+ goto yy33;
+ }
+ }
+ yy105:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy107;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy107;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy107;
+ goto yy33;
+ }
+ }
+ yy106:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy108;
+ if (yych <= '/')
+ goto yy33;
+ goto yy109;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy109;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy109;
+ goto yy33;
+ }
+ }
+ yy107:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy109;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy109;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy109;
+ goto yy33;
+ }
+ }
+ yy108:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy110;
+ if (yych <= '/')
+ goto yy33;
+ goto yy111;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy111;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy111;
+ goto yy33;
+ }
+ }
+ yy109:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy111;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy111;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy111;
+ goto yy33;
+ }
+ }
+ yy110:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy112;
+ if (yych <= '/')
+ goto yy33;
+ goto yy113;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy113;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy113;
+ goto yy33;
+ }
+ }
+ yy111:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy113;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy113;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy113;
+ goto yy33;
+ }
+ }
+ yy112:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy114;
+ if (yych <= '/')
+ goto yy33;
+ goto yy115;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy115;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy115;
+ goto yy33;
+ }
+ }
+ yy113:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy115;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy115;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy115;
+ goto yy33;
+ }
+ }
+ yy114:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy116;
+ if (yych <= '/')
+ goto yy33;
+ goto yy117;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy117;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy117;
+ goto yy33;
+ }
+ }
+ yy115:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy117;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy117;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy117;
+ goto yy33;
+ }
+ }
+ yy116:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy118;
+ if (yych <= '/')
+ goto yy33;
+ goto yy119;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy119;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy119;
+ goto yy33;
+ }
+ }
+ yy117:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy119;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy119;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy119;
+ goto yy33;
+ }
+ }
+ yy118:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy120;
+ if (yych <= '/')
+ goto yy33;
+ goto yy121;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy121;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy121;
+ goto yy33;
+ }
+ }
+ yy119:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy121;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy121;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy121;
+ goto yy33;
+ }
+ }
+ yy120:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy122;
+ if (yych <= '/')
+ goto yy33;
+ goto yy123;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy123;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy123;
+ goto yy33;
+ }
+ }
+ yy121:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy123;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy123;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy123;
+ goto yy33;
+ }
+ }
+ yy122:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy124;
+ if (yych <= '/')
+ goto yy33;
+ goto yy125;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy125;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy125;
+ goto yy33;
+ }
+ }
+ yy123:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy125;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy125;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy125;
+ goto yy33;
+ }
+ }
+ yy124:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy126;
+ if (yych <= '/')
+ goto yy33;
+ goto yy127;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy127;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy127;
+ goto yy33;
+ }
+ }
+ yy125:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy127;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy127;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy127;
+ goto yy33;
+ }
+ }
+ yy126:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy128;
+ if (yych <= '/')
+ goto yy33;
+ goto yy129;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy129;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy129;
+ goto yy33;
+ }
+ }
+ yy127:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy129;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy129;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy129;
+ goto yy33;
+ }
+ }
+ yy128:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy130;
+ if (yych <= '/')
+ goto yy33;
+ goto yy131;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy131;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy131;
+ goto yy33;
+ }
+ }
+ yy129:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy131;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy131;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy131;
+ goto yy33;
+ }
+ }
+ yy130:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy132;
+ if (yych <= '/')
+ goto yy33;
+ goto yy133;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy133;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy133;
+ goto yy33;
+ }
+ }
+ yy131:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy133;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy133;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy133;
+ goto yy33;
+ }
+ }
+ yy132:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy134;
+ if (yych <= '/')
+ goto yy33;
+ goto yy135;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy135;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy135;
+ goto yy33;
+ }
+ }
+ yy133:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy135;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy135;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy135;
+ goto yy33;
+ }
+ }
+ yy134:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy136;
+ if (yych <= '/')
+ goto yy33;
+ goto yy137;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy137;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy137;
+ goto yy33;
+ }
+ }
+ yy135:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy137;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy137;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy137;
+ goto yy33;
+ }
+ }
+ yy136:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy138;
+ if (yych <= '/')
+ goto yy33;
+ goto yy139;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy139;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy139;
+ goto yy33;
+ }
+ }
+ yy137:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy139;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy139;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy139;
+ goto yy33;
+ }
+ }
+ yy138:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy140;
+ if (yych <= '/')
+ goto yy33;
+ goto yy141;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy141;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy141;
+ goto yy33;
+ }
+ }
+ yy139:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy141;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy141;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy141;
+ goto yy33;
+ }
+ }
+ yy140:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy142;
+ if (yych <= '/')
+ goto yy33;
+ goto yy143;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy143;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy143;
+ goto yy33;
+ }
+ }
+ yy141:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy143;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy143;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy143;
+ goto yy33;
+ }
+ }
+ yy142:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy144;
+ if (yych <= '/')
+ goto yy33;
+ goto yy145;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy145;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy145;
+ goto yy33;
+ }
+ }
+ yy143:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy145;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy145;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy145;
+ goto yy33;
+ }
+ }
+ yy144:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy146;
+ if (yych <= '/')
+ goto yy33;
+ goto yy147;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy147;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy147;
+ goto yy33;
+ }
+ }
+ yy145:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy147;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy147;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy147;
+ goto yy33;
+ }
+ }
+ yy146:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy148;
+ if (yych <= '/')
+ goto yy33;
+ goto yy149;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy149;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy149;
+ goto yy33;
+ }
+ }
+ yy147:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy149;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy149;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy149;
+ goto yy33;
+ }
+ }
+ yy148:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy150;
+ if (yych <= '/')
+ goto yy33;
+ goto yy151;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy151;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy151;
+ goto yy33;
+ }
+ }
+ yy149:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy151;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy151;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy151;
+ goto yy33;
+ }
+ }
+ yy150:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy152;
+ if (yych <= '/')
+ goto yy33;
+ goto yy153;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy153;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy153;
+ goto yy33;
+ }
+ }
+ yy151:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy153;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy153;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy153;
+ goto yy33;
+ }
+ }
+ yy152:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy154;
+ if (yych <= '/')
+ goto yy33;
+ goto yy155;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy155;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy155;
+ goto yy33;
+ }
+ }
+ yy153:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy155;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy155;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy155;
+ goto yy33;
+ }
+ }
+ yy154:
+ yych = *++p;
+ if (yych <= '9') {
+ if (yych == '-')
+ goto yy156;
+ if (yych <= '/')
+ goto yy33;
+ goto yy157;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy33;
+ goto yy157;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy157;
+ goto yy33;
+ }
+ }
+ yy155:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= ',')
+ goto yy33;
+ if (yych >= '.')
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy157;
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ goto yy157;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy157;
+ goto yy33;
+ }
+ }
+ yy156:
+ yych = *++p;
+ if (yych <= '@') {
+ if (yych <= '/')
+ goto yy33;
+ if (yych <= '9')
+ goto yy158;
+ goto yy33;
+ } else {
+ if (yych <= 'Z')
+ goto yy158;
+ if (yych <= '`')
+ goto yy33;
+ if (yych <= 'z')
+ goto yy158;
+ goto yy33;
+ }
+ yy157:
+ yych = *++p;
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych <= '-')
+ goto yy33;
+ goto yy34;
+ } else {
+ if (yych <= '/')
+ goto yy33;
+ if (yych >= ':')
+ goto yy33;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy37;
+ if (yych <= '@')
+ goto yy33;
+ } else {
+ if (yych <= '`')
+ goto yy33;
+ if (yych >= '{')
+ goto yy33;
+ }
+ }
+ yy158:
+ yych = *++p;
+ if (yych == '.')
+ goto yy34;
+ if (yych == '>')
+ goto yy37;
+ goto yy33;
+ }
+}
+
+// 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[] = {
+ 0, 224, 224, 224, 224, 224, 224, 224, 224, 200, 200, 200, 200, 200,
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 200, 224, 128, 224, 224, 224, 224, 64, 224, 224,
+ 224, 224, 224, 244, 240, 224, 244, 244, 244, 244, 244, 244, 244, 244,
+ 244, 244, 240, 224, 192, 192, 192, 224, 224, 244, 244, 244, 244, 244,
+ 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+ 244, 244, 244, 244, 244, 244, 244, 224, 224, 224, 224, 240, 192, 244,
+ 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+ 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 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 <= '@') {
+ if (yych == '/')
+ goto yy162;
+ } else {
+ if (yych <= 'Z')
+ goto yy163;
+ if (yych <= '`')
+ goto yy160;
+ if (yych <= 'z')
+ goto yy163;
+ }
+ yy160:
+ ++p;
+ yy161 : { return 0; }
+ yy162:
+ yych = *(marker = ++p);
+ if (yych <= '@')
+ goto yy161;
+ if (yych <= 'Z')
+ goto yy164;
+ if (yych <= '`')
+ goto yy161;
+ if (yych <= 'z')
+ goto yy164;
+ goto yy161;
+ yy163:
+ yych = *(marker = ++p);
+ if (yych <= '.') {
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy161;
+ if (yych <= '\r')
+ goto yy168;
+ goto yy161;
+ } else {
+ if (yych <= ' ')
+ goto yy168;
+ if (yych == '-')
+ goto yy168;
+ goto yy161;
+ }
+ } else {
+ if (yych <= '@') {
+ if (yych <= '9')
+ goto yy168;
+ if (yych == '>')
+ goto yy168;
+ goto yy161;
+ } else {
+ if (yych <= 'Z')
+ goto yy168;
+ if (yych <= '`')
+ goto yy161;
+ if (yych <= 'z')
+ goto yy168;
+ goto yy161;
+ }
+ }
+ yy164:
+ yych = *++p;
+ if (yybm[0 + yych] & 4) {
+ goto yy164;
+ }
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy165;
+ if (yych <= '\r')
+ goto yy171;
+ } else {
+ if (yych <= ' ')
+ goto yy171;
+ if (yych == '>')
+ goto yy170;
+ }
+ yy165:
+ p = marker;
+ goto yy161;
+ yy166:
+ yych = *++p;
+ if (yybm[0 + yych] & 8) {
+ goto yy166;
+ }
+ if (yych <= '>') {
+ if (yych <= '9') {
+ if (yych == '/')
+ goto yy169;
+ goto yy165;
+ } else {
+ if (yych <= ':')
+ goto yy172;
+ if (yych <= '=')
+ goto yy165;
+ goto yy170;
+ }
+ } else {
+ if (yych <= '^') {
+ if (yych <= '@')
+ goto yy165;
+ if (yych <= 'Z')
+ goto yy172;
+ goto yy165;
+ } else {
+ if (yych == '`')
+ goto yy165;
+ if (yych <= 'z')
+ goto yy172;
+ goto yy165;
+ }
+ }
+ yy167:
+ yych = *++p;
+ yy168:
+ if (yybm[0 + yych] & 8) {
+ goto yy166;
+ }
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych == '-')
+ goto yy167;
+ goto yy165;
+ } else {
+ if (yych <= '/')
+ goto yy169;
+ if (yych <= '9')
+ goto yy167;
+ goto yy165;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy170;
+ if (yych <= '@')
+ goto yy165;
+ goto yy167;
+ } else {
+ if (yych <= '`')
+ goto yy165;
+ if (yych <= 'z')
+ goto yy167;
+ goto yy165;
+ }
+ }
+ yy169:
+ yych = *++p;
+ if (yych != '>')
+ goto yy165;
+ yy170:
+ ++p;
+ { return (bufsize_t)(p - start); }
+ yy171:
+ yych = *++p;
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy165;
+ if (yych <= '\r')
+ goto yy171;
+ goto yy165;
+ } else {
+ if (yych <= ' ')
+ goto yy171;
+ if (yych == '>')
+ goto yy170;
+ goto yy165;
+ }
+ yy172:
+ yych = *++p;
+ if (yybm[0 + yych] & 16) {
+ goto yy172;
+ }
+ if (yych <= ',') {
+ if (yych <= '\r') {
+ if (yych <= 0x08)
+ goto yy165;
+ } else {
+ if (yych != ' ')
+ goto yy165;
+ }
+ } else {
+ if (yych <= '<') {
+ if (yych <= '/')
+ goto yy169;
+ goto yy165;
+ } else {
+ if (yych <= '=')
+ goto yy174;
+ if (yych <= '>')
+ goto yy170;
+ goto yy165;
+ }
+ }
+ yy173:
+ yych = *++p;
+ if (yych <= '<') {
+ if (yych <= ' ') {
+ if (yych <= 0x08)
+ goto yy165;
+ if (yych <= '\r')
+ goto yy173;
+ if (yych <= 0x1F)
+ goto yy165;
+ goto yy173;
+ } else {
+ if (yych <= '/') {
+ if (yych <= '.')
+ goto yy165;
+ goto yy169;
+ } else {
+ if (yych == ':')
+ goto yy172;
+ goto yy165;
+ }
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '=')
+ goto yy174;
+ if (yych <= '>')
+ goto yy170;
+ if (yych <= '@')
+ goto yy165;
+ goto yy172;
+ } else {
+ if (yych <= '_') {
+ if (yych <= '^')
+ goto yy165;
+ goto yy172;
+ } else {
+ if (yych <= '`')
+ goto yy165;
+ if (yych <= 'z')
+ goto yy172;
+ goto yy165;
+ }
+ }
+ }
+ yy174:
+ yych = *++p;
+ if (yybm[0 + yych] & 32) {
+ goto yy175;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '"') {
+ if (yych <= 0x00)
+ goto yy165;
+ if (yych <= ' ')
+ goto yy174;
+ goto yy176;
+ } else {
+ if (yych <= '\'')
+ goto yy177;
+ if (yych <= 0xC1)
+ goto yy165;
+ if (yych <= 0xDF)
+ goto yy178;
+ goto yy179;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy181;
+ goto yy180;
+ } else {
+ if (yych <= 0xF0)
+ goto yy182;
+ if (yych <= 0xF3)
+ goto yy183;
+ if (yych <= 0xF4)
+ goto yy184;
+ goto yy165;
+ }
+ }
+ yy175:
+ yych = *++p;
+ if (yybm[0 + yych] & 32) {
+ goto yy175;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '=') {
+ if (yych <= 0x00)
+ goto yy165;
+ if (yych <= ' ')
+ goto yy166;
+ goto yy165;
+ } else {
+ if (yych <= '>')
+ goto yy170;
+ if (yych <= 0xC1)
+ goto yy165;
+ if (yych <= 0xDF)
+ goto yy178;
+ goto yy179;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy181;
+ goto yy180;
+ } else {
+ if (yych <= 0xF0)
+ goto yy182;
+ if (yych <= 0xF3)
+ goto yy183;
+ if (yych <= 0xF4)
+ goto yy184;
+ goto yy165;
+ }
+ }
+ yy176:
+ yych = *++p;
+ if (yybm[0 + yych] & 64) {
+ goto yy176;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy165;
+ if (yych <= '"')
+ goto yy185;
+ goto yy165;
+ } else {
+ if (yych <= 0xDF)
+ goto yy186;
+ if (yych <= 0xE0)
+ goto yy187;
+ goto yy188;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy189;
+ if (yych <= 0xEF)
+ goto yy188;
+ goto yy190;
+ } else {
+ if (yych <= 0xF3)
+ goto yy191;
+ if (yych <= 0xF4)
+ goto yy192;
+ goto yy165;
+ }
+ }
+ yy177:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy177;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy165;
+ if (yych <= '\'')
+ goto yy185;
+ goto yy165;
+ } else {
+ if (yych <= 0xDF)
+ goto yy193;
+ if (yych <= 0xE0)
+ goto yy194;
+ goto yy195;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy196;
+ if (yych <= 0xEF)
+ goto yy195;
+ goto yy197;
+ } else {
+ if (yych <= 0xF3)
+ goto yy198;
+ if (yych <= 0xF4)
+ goto yy199;
+ goto yy165;
+ }
+ }
+ yy178:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy175;
+ goto yy165;
+ yy179:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy178;
+ goto yy165;
+ yy180:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy178;
+ goto yy165;
+ yy181:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0x9F)
+ goto yy178;
+ goto yy165;
+ yy182:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy180;
+ goto yy165;
+ yy183:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy180;
+ goto yy165;
+ yy184:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0x8F)
+ goto yy180;
+ goto yy165;
+ yy185:
+ yych = *++p;
+ if (yybm[0 + yych] & 8) {
+ goto yy166;
+ }
+ if (yych == '/')
+ goto yy169;
+ if (yych == '>')
+ goto yy170;
+ goto yy165;
+ yy186:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy176;
+ goto yy165;
+ yy187:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy186;
+ goto yy165;
+ yy188:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy186;
+ goto yy165;
+ yy189:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0x9F)
+ goto yy186;
+ goto yy165;
+ yy190:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy188;
+ goto yy165;
+ yy191:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy188;
+ goto yy165;
+ yy192:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0x8F)
+ goto yy188;
+ goto yy165;
+ yy193:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy177;
+ goto yy165;
+ yy194:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy193;
+ goto yy165;
+ yy195:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy193;
+ goto yy165;
+ yy196:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0x9F)
+ goto yy193;
+ goto yy165;
+ yy197:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy195;
+ goto yy165;
+ yy198:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0xBF)
+ goto yy195;
+ goto yy165;
+ yy199:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy165;
+ if (yych <= 0x8F)
+ goto yy195;
+ goto yy165;
+ }
+}
+
+bufsize_t _scan_html_comment(const unsigned char *p) {
+ const unsigned char *marker = NULL;
+ const unsigned char *start = p;
+
+ {
+ unsigned char yych;
+ static const unsigned char yybm[] = {
+ 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, 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, 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 yy202;
+ ++p;
+ yy201 : { return 0; }
+ yy202:
+ yych = *(marker = ++p);
+ if (yych != '-')
+ goto yy201;
+ yy203:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy203;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy204;
+ if (yych <= '-')
+ goto yy205;
+ } else {
+ if (yych <= 0xDF)
+ goto yy206;
+ if (yych <= 0xE0)
+ goto yy207;
+ goto yy208;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy209;
+ if (yych <= 0xEF)
+ goto yy208;
+ goto yy210;
+ } else {
+ if (yych <= 0xF3)
+ goto yy211;
+ if (yych <= 0xF4)
+ goto yy212;
+ }
+ }
+ yy204:
+ p = marker;
+ goto yy201;
+ yy205:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy203;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy204;
+ if (yych <= '-')
+ goto yy213;
+ goto yy204;
+ } else {
+ if (yych <= 0xDF)
+ goto yy206;
+ if (yych <= 0xE0)
+ goto yy207;
+ goto yy208;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy209;
+ if (yych <= 0xEF)
+ goto yy208;
+ goto yy210;
+ } else {
+ if (yych <= 0xF3)
+ goto yy211;
+ if (yych <= 0xF4)
+ goto yy212;
+ goto yy204;
+ }
+ }
+ yy206:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy204;
+ if (yych <= 0xBF)
+ goto yy203;
+ goto yy204;
+ yy207:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy204;
+ if (yych <= 0xBF)
+ goto yy206;
+ goto yy204;
+ yy208:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy204;
+ if (yych <= 0xBF)
+ goto yy206;
+ goto yy204;
+ yy209:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy204;
+ if (yych <= 0x9F)
+ goto yy206;
+ goto yy204;
+ yy210:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy204;
+ if (yych <= 0xBF)
+ goto yy208;
+ goto yy204;
+ yy211:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy204;
+ if (yych <= 0xBF)
+ goto yy208;
+ goto yy204;
+ yy212:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy204;
+ if (yych <= 0x8F)
+ goto yy208;
+ goto yy204;
+ yy213:
+ yych = *++p;
+ if (yych <= 0xE0) {
+ if (yych <= '>') {
+ if (yych <= 0x00)
+ goto yy204;
+ if (yych <= '=')
+ goto yy203;
+ } else {
+ if (yych <= 0x7F)
+ goto yy203;
+ if (yych <= 0xC1)
+ goto yy204;
+ if (yych <= 0xDF)
+ goto yy206;
+ goto yy207;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy209;
+ goto yy208;
+ } else {
+ if (yych <= 0xF0)
+ goto yy210;
+ if (yych <= 0xF3)
+ goto yy211;
+ if (yych <= 0xF4)
+ goto yy212;
+ goto yy204;
+ }
+ }
+ ++p;
+ { return (bufsize_t)(p - start); }
+ }
+}
+
+bufsize_t _scan_html_pi(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, 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, 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] & 128) {
+ goto yy217;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy215;
+ if (yych <= '?')
+ goto yy220;
+ } else {
+ if (yych <= 0xDF)
+ goto yy221;
+ if (yych <= 0xE0)
+ goto yy222;
+ goto yy223;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy224;
+ if (yych <= 0xEF)
+ goto yy223;
+ goto yy225;
+ } else {
+ if (yych <= 0xF3)
+ goto yy226;
+ if (yych <= 0xF4)
+ goto yy227;
+ }
+ }
+ yy215:
+ ++p;
+ yy216 : { return 0; }
+ yy217:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ yy218:
+ if (yybm[0 + yych] & 128) {
+ goto yy217;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy219;
+ if (yych <= '?')
+ goto yy228;
+ } else {
+ if (yych <= 0xDF)
+ goto yy230;
+ if (yych <= 0xE0)
+ goto yy231;
+ goto yy232;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy233;
+ if (yych <= 0xEF)
+ goto yy232;
+ goto yy234;
+ } else {
+ if (yych <= 0xF3)
+ goto yy235;
+ if (yych <= 0xF4)
+ goto yy236;
+ }
+ }
+ yy219 : { return (bufsize_t)(p - start); }
+ yy220:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yych <= '?') {
+ if (yych <= 0x00)
+ goto yy216;
+ if (yych <= '=')
+ goto yy218;
+ if (yych <= '>')
+ goto yy216;
+ goto yy217;
+ } else {
+ if (yych <= 0x7F)
+ goto yy218;
+ if (yych <= 0xC1)
+ goto yy216;
+ if (yych <= 0xF4)
+ goto yy218;
+ goto yy216;
+ }
+ yy221:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy216;
+ if (yych <= 0xBF)
+ goto yy217;
+ goto yy216;
+ yy222:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yych <= 0x9F)
+ goto yy216;
+ if (yych <= 0xBF)
+ goto yy230;
+ goto yy216;
+ yy223:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy216;
+ if (yych <= 0xBF)
+ goto yy230;
+ goto yy216;
+ yy224:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy216;
+ if (yych <= 0x9F)
+ goto yy230;
+ goto yy216;
+ yy225:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yych <= 0x8F)
+ goto yy216;
+ if (yych <= 0xBF)
+ goto yy232;
+ goto yy216;
+ yy226:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy216;
+ if (yych <= 0xBF)
+ goto yy232;
+ goto yy216;
+ yy227:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy216;
+ if (yych <= 0x8F)
+ goto yy232;
+ goto yy216;
+ yy228:
+ yych = *++p;
+ if (yych <= 0xE0) {
+ if (yych <= '>') {
+ if (yych <= 0x00)
+ goto yy229;
+ if (yych <= '=')
+ goto yy217;
+ } else {
+ if (yych <= 0x7F)
+ goto yy217;
+ if (yych <= 0xC1)
+ goto yy229;
+ if (yych <= 0xDF)
+ goto yy230;
+ goto yy231;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy233;
+ goto yy232;
+ } else {
+ if (yych <= 0xF0)
+ goto yy234;
+ if (yych <= 0xF3)
+ goto yy235;
+ if (yych <= 0xF4)
+ goto yy236;
+ }
+ }
+ yy229:
+ p = marker;
+ if (yyaccept == 0) {
+ goto yy219;
+ } else {
+ goto yy216;
+ }
+ yy230:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy229;
+ if (yych <= 0xBF)
+ goto yy217;
+ goto yy229;
+ yy231:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy229;
+ if (yych <= 0xBF)
+ goto yy230;
+ goto yy229;
+ yy232:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy229;
+ if (yych <= 0xBF)
+ goto yy230;
+ goto yy229;
+ yy233:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy229;
+ if (yych <= 0x9F)
+ goto yy230;
+ goto yy229;
+ yy234:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy229;
+ if (yych <= 0xBF)
+ goto yy232;
+ goto yy229;
+ yy235:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy229;
+ if (yych <= 0xBF)
+ goto yy232;
+ goto yy229;
+ yy236:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy229;
+ if (yych <= 0x8F)
+ goto yy232;
+ goto yy229;
+ }
+}
+
+bufsize_t _scan_html_declaration(const unsigned char *p) {
+ const unsigned char *marker = NULL;
+ const unsigned char *start = p;
+
+ {
+ unsigned char yych;
+ static const unsigned char yybm[] = {
+ 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, 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 yy238;
+ if (yych <= 'Z')
+ goto yy239;
+ yy238:
+ ++p;
+ { return 0; }
+ yy239:
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 128) {
+ goto yy239;
+ }
+ if (yych <= 0xED) {
+ if (yych <= 0xDF) {
+ if (yych >= 0xC2)
+ goto yy241;
+ } else {
+ if (yych <= 0xE0)
+ goto yy243;
+ if (yych <= 0xEC)
+ goto yy244;
+ goto yy245;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy244;
+ goto yy246;
+ } else {
+ if (yych <= 0xF3)
+ goto yy247;
+ if (yych <= 0xF4)
+ goto yy248;
+ }
+ }
+ yy240 : { return (bufsize_t)(p - start); }
+ yy241:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy242;
+ if (yych <= 0xBF)
+ goto yy239;
+ yy242:
+ p = marker;
+ goto yy240;
+ yy243:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy242;
+ if (yych <= 0xBF)
+ goto yy241;
+ goto yy242;
+ yy244:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy242;
+ if (yych <= 0xBF)
+ goto yy241;
+ goto yy242;
+ yy245:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy242;
+ if (yych <= 0x9F)
+ goto yy241;
+ goto yy242;
+ yy246:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy242;
+ if (yych <= 0xBF)
+ goto yy244;
+ goto yy242;
+ yy247:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy242;
+ if (yych <= 0xBF)
+ goto yy244;
+ goto yy242;
+ yy248:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy242;
+ if (yych <= 0x8F)
+ goto yy244;
+ goto yy242;
+ }
+}
+
+bufsize_t _scan_html_cdata(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, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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 == 'C')
+ goto yy251;
+ if (yych == 'c')
+ goto yy251;
+ ++p;
+ yy250 : { return 0; }
+ yy251:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych == 'D')
+ goto yy252;
+ if (yych != 'd')
+ goto yy250;
+ yy252:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy254;
+ if (yych == 'a')
+ goto yy254;
+ yy253:
+ p = marker;
+ if (yyaccept == 0) {
+ goto yy250;
+ } else {
+ goto yy258;
+ }
+ yy254:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy255;
+ if (yych != 't')
+ goto yy253;
+ yy255:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy256;
+ if (yych != 'a')
+ goto yy253;
+ yy256:
+ yych = *++p;
+ if (yych != '[')
+ goto yy253;
+ yy257:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 128) {
+ goto yy257;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy258;
+ if (yych <= ']')
+ goto yy259;
+ } else {
+ if (yych <= 0xDF)
+ goto yy260;
+ if (yych <= 0xE0)
+ goto yy261;
+ goto yy262;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy263;
+ if (yych <= 0xEF)
+ goto yy262;
+ goto yy264;
+ } else {
+ if (yych <= 0xF3)
+ goto yy265;
+ if (yych <= 0xF4)
+ goto yy266;
+ }
+ }
+ yy258 : { return (bufsize_t)(p - start); }
+ yy259:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy257;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy253;
+ if (yych <= ']')
+ goto yy267;
+ goto yy253;
+ } else {
+ if (yych <= 0xDF)
+ goto yy260;
+ if (yych <= 0xE0)
+ goto yy261;
+ goto yy262;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy263;
+ if (yych <= 0xEF)
+ goto yy262;
+ goto yy264;
+ } else {
+ if (yych <= 0xF3)
+ goto yy265;
+ if (yych <= 0xF4)
+ goto yy266;
+ goto yy253;
+ }
+ }
+ yy260:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy253;
+ if (yych <= 0xBF)
+ goto yy257;
+ goto yy253;
+ yy261:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy253;
+ if (yych <= 0xBF)
+ goto yy260;
+ goto yy253;
+ yy262:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy253;
+ if (yych <= 0xBF)
+ goto yy260;
+ goto yy253;
+ yy263:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy253;
+ if (yych <= 0x9F)
+ goto yy260;
+ goto yy253;
+ yy264:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy253;
+ if (yych <= 0xBF)
+ goto yy262;
+ goto yy253;
+ yy265:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy253;
+ if (yych <= 0xBF)
+ goto yy262;
+ goto yy253;
+ yy266:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy253;
+ if (yych <= 0x8F)
+ goto yy262;
+ goto yy253;
+ yy267:
+ yych = *++p;
+ if (yych <= 0xE0) {
+ if (yych <= '>') {
+ if (yych <= 0x00)
+ goto yy253;
+ if (yych <= '=')
+ goto yy257;
+ goto yy253;
+ } else {
+ if (yych <= 0x7F)
+ goto yy257;
+ if (yych <= 0xC1)
+ goto yy253;
+ if (yych <= 0xDF)
+ goto yy260;
+ goto yy261;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy263;
+ goto yy262;
+ } else {
+ if (yych <= 0xF0)
+ goto yy264;
+ if (yych <= 0xF3)
+ goto yy265;
+ if (yych <= 0xF4)
+ goto yy266;
+ goto yy253;
+ }
+ }
+ }
+}
+
+// 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 yy270;
+ ++p;
+ yy269 : { return 0; }
+ yy270:
+ yych = *(marker = ++p);
+ switch (yych) {
+ case '!':
+ goto yy271;
+ case '/':
+ goto yy273;
+ case '?':
+ goto yy274;
+ case 'A':
+ case 'a':
+ goto yy275;
+ case 'B':
+ case 'b':
+ goto yy276;
+ case 'C':
+ case 'c':
+ goto yy277;
+ case 'D':
+ case 'd':
+ goto yy278;
+ case 'F':
+ case 'f':
+ goto yy279;
+ case 'H':
+ case 'h':
+ goto yy280;
+ case 'I':
+ case 'i':
+ goto yy281;
+ case 'L':
+ case 'l':
+ goto yy282;
+ case 'M':
+ case 'm':
+ goto yy283;
+ case 'N':
+ case 'n':
+ goto yy284;
+ case 'O':
+ case 'o':
+ goto yy285;
+ case 'P':
+ case 'p':
+ goto yy286;
+ case 'S':
+ case 's':
+ goto yy287;
+ case 'T':
+ case 't':
+ goto yy288;
+ case 'U':
+ case 'u':
+ goto yy289;
+ default:
+ goto yy269;
+ }
+ yy271:
+ yych = *++p;
+ if (yych <= 'Z') {
+ if (yych == '-')
+ goto yy290;
+ if (yych >= 'A')
+ goto yy291;
+ } else {
+ if (yych <= '[')
+ goto yy292;
+ if (yych <= '`')
+ goto yy272;
+ if (yych <= 'z')
+ goto yy291;
+ }
+ yy272:
+ p = marker;
+ goto yy269;
+ yy273:
+ yych = *++p;
+ switch (yych) {
+ case 'A':
+ case 'a':
+ goto yy275;
+ case 'B':
+ case 'b':
+ goto yy276;
+ case 'C':
+ case 'c':
+ goto yy277;
+ case 'D':
+ case 'd':
+ goto yy278;
+ case 'F':
+ case 'f':
+ goto yy279;
+ case 'H':
+ case 'h':
+ goto yy280;
+ case 'I':
+ case 'i':
+ goto yy281;
+ case 'L':
+ case 'l':
+ goto yy282;
+ case 'M':
+ case 'm':
+ goto yy283;
+ case 'N':
+ case 'n':
+ goto yy284;
+ case 'O':
+ case 'o':
+ goto yy285;
+ case 'P':
+ case 'p':
+ goto yy293;
+ case 'S':
+ case 's':
+ goto yy294;
+ case 'T':
+ case 't':
+ goto yy295;
+ case 'U':
+ case 'u':
+ goto yy289;
+ default:
+ goto yy272;
+ }
+ yy274:
+ ++p;
+ { return 3; }
+ yy275:
+ yych = *++p;
+ if (yych <= 'S') {
+ if (yych <= 'D') {
+ if (yych <= 'C')
+ goto yy272;
+ goto yy296;
+ } else {
+ if (yych <= 'Q')
+ goto yy272;
+ if (yych <= 'R')
+ goto yy297;
+ goto yy298;
+ }
+ } else {
+ if (yych <= 'q') {
+ if (yych == 'd')
+ goto yy296;
+ goto yy272;
+ } else {
+ if (yych <= 'r')
+ goto yy297;
+ if (yych <= 's')
+ goto yy298;
+ goto yy272;
+ }
+ }
+ yy276:
+ yych = *++p;
+ if (yych <= 'O') {
+ if (yych <= 'K') {
+ if (yych == 'A')
+ goto yy299;
+ goto yy272;
+ } else {
+ if (yych <= 'L')
+ goto yy300;
+ if (yych <= 'N')
+ goto yy272;
+ goto yy301;
+ }
+ } else {
+ if (yych <= 'k') {
+ if (yych == 'a')
+ goto yy299;
+ goto yy272;
+ } else {
+ if (yych <= 'l')
+ goto yy300;
+ if (yych == 'o')
+ goto yy301;
+ goto yy272;
+ }
+ }
+ yy277:
+ yych = *++p;
+ if (yych <= 'O') {
+ if (yych <= 'D') {
+ if (yych == 'A')
+ goto yy302;
+ goto yy272;
+ } else {
+ if (yych <= 'E')
+ goto yy303;
+ if (yych <= 'N')
+ goto yy272;
+ goto yy304;
+ }
+ } else {
+ if (yych <= 'd') {
+ if (yych == 'a')
+ goto yy302;
+ goto yy272;
+ } else {
+ if (yych <= 'e')
+ goto yy303;
+ if (yych == 'o')
+ goto yy304;
+ goto yy272;
+ }
+ }
+ yy278:
+ yych = *++p;
+ switch (yych) {
+ case 'D':
+ case 'L':
+ case 'T':
+ case 'd':
+ case 'l':
+ case 't':
+ goto yy305;
+ case 'E':
+ case 'e':
+ goto yy306;
+ case 'I':
+ case 'i':
+ goto yy307;
+ default:
+ goto yy272;
+ }
+ yy279:
+ yych = *++p;
+ if (yych <= 'R') {
+ if (yych <= 'N') {
+ if (yych == 'I')
+ goto yy308;
+ goto yy272;
+ } else {
+ if (yych <= 'O')
+ goto yy309;
+ if (yych <= 'Q')
+ goto yy272;
+ goto yy310;
+ }
+ } else {
+ if (yych <= 'n') {
+ if (yych == 'i')
+ goto yy308;
+ goto yy272;
+ } else {
+ if (yych <= 'o')
+ goto yy309;
+ if (yych == 'r')
+ goto yy310;
+ goto yy272;
+ }
+ }
+ yy280:
+ yych = *++p;
+ if (yych <= 'S') {
+ if (yych <= 'D') {
+ if (yych <= '0')
+ goto yy272;
+ if (yych <= '6')
+ goto yy305;
+ goto yy272;
+ } else {
+ if (yych <= 'E')
+ goto yy311;
+ if (yych == 'R')
+ goto yy305;
+ goto yy272;
+ }
+ } else {
+ if (yych <= 'q') {
+ if (yych <= 'T')
+ goto yy312;
+ if (yych == 'e')
+ goto yy311;
+ goto yy272;
+ } else {
+ if (yych <= 'r')
+ goto yy305;
+ if (yych == 't')
+ goto yy312;
+ goto yy272;
+ }
+ }
+ yy281:
+ yych = *++p;
+ if (yych == 'F')
+ goto yy313;
+ if (yych == 'f')
+ goto yy313;
+ goto yy272;
+ yy282:
+ yych = *++p;
+ if (yych <= 'I') {
+ if (yych == 'E')
+ goto yy314;
+ if (yych <= 'H')
+ goto yy272;
+ goto yy315;
+ } else {
+ if (yych <= 'e') {
+ if (yych <= 'd')
+ goto yy272;
+ goto yy314;
+ } else {
+ if (yych == 'i')
+ goto yy315;
+ goto yy272;
+ }
+ }
+ yy283:
+ yych = *++p;
+ if (yych <= 'E') {
+ if (yych == 'A')
+ goto yy316;
+ if (yych <= 'D')
+ goto yy272;
+ goto yy317;
+ } else {
+ if (yych <= 'a') {
+ if (yych <= '`')
+ goto yy272;
+ goto yy316;
+ } else {
+ if (yych == 'e')
+ goto yy317;
+ goto yy272;
+ }
+ }
+ yy284:
+ yych = *++p;
+ if (yych <= 'O') {
+ if (yych == 'A')
+ goto yy318;
+ if (yych <= 'N')
+ goto yy272;
+ goto yy319;
+ } else {
+ if (yych <= 'a') {
+ if (yych <= '`')
+ goto yy272;
+ goto yy318;
+ } else {
+ if (yych == 'o')
+ goto yy319;
+ goto yy272;
+ }
+ }
+ yy285:
+ yych = *++p;
+ if (yych <= 'P') {
+ if (yych == 'L')
+ goto yy305;
+ if (yych <= 'O')
+ goto yy272;
+ goto yy320;
+ } else {
+ if (yych <= 'l') {
+ if (yych <= 'k')
+ goto yy272;
+ goto yy305;
+ } else {
+ if (yych == 'p')
+ goto yy320;
+ goto yy272;
+ }
+ }
+ yy286:
+ yych = *++p;
+ if (yych <= '>') {
+ if (yych <= ' ') {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy321;
+ if (yych <= 0x1F)
+ goto yy272;
+ goto yy321;
+ } else {
+ if (yych == '/')
+ goto yy322;
+ if (yych <= '=')
+ goto yy272;
+ goto yy321;
+ }
+ } else {
+ if (yych <= 'R') {
+ if (yych == 'A')
+ goto yy323;
+ if (yych <= 'Q')
+ goto yy272;
+ goto yy324;
+ } else {
+ if (yych <= 'a') {
+ if (yych <= '`')
+ goto yy272;
+ goto yy323;
+ } else {
+ if (yych == 'r')
+ goto yy324;
+ goto yy272;
+ }
+ }
+ }
+ yy287:
+ yych = *++p;
+ switch (yych) {
+ case 'C':
+ case 'c':
+ goto yy325;
+ case 'E':
+ case 'e':
+ goto yy326;
+ case 'O':
+ case 'o':
+ goto yy327;
+ case 'T':
+ case 't':
+ goto yy328;
+ case 'U':
+ case 'u':
+ goto yy329;
+ default:
+ goto yy272;
+ }
+ yy288:
+ yych = *++p;
+ switch (yych) {
+ case 'A':
+ case 'a':
+ goto yy330;
+ case 'B':
+ case 'b':
+ goto yy331;
+ case 'D':
+ case 'd':
+ goto yy305;
+ case 'E':
+ case 'e':
+ goto yy332;
+ case 'F':
+ case 'f':
+ goto yy333;
+ case 'H':
+ case 'h':
+ goto yy334;
+ case 'I':
+ case 'i':
+ goto yy335;
+ case 'R':
+ case 'r':
+ goto yy336;
+ default:
+ goto yy272;
+ }
+ yy289:
+ yych = *++p;
+ if (yych == 'L')
+ goto yy305;
+ if (yych == 'l')
+ goto yy305;
+ goto yy272;
+ yy290:
+ yych = *++p;
+ if (yych == '-')
+ goto yy337;
+ goto yy272;
+ yy291:
+ ++p;
+ { return 4; }
+ yy292:
+ yych = *++p;
+ if (yych == 'C')
+ goto yy338;
+ if (yych == 'c')
+ goto yy338;
+ goto yy272;
+ yy293:
+ yych = *++p;
+ if (yych <= '/') {
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= ' ')
+ goto yy321;
+ if (yych <= '.')
+ goto yy272;
+ goto yy322;
+ }
+ } else {
+ if (yych <= '@') {
+ if (yych == '>')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= 'A')
+ goto yy323;
+ if (yych == 'a')
+ goto yy323;
+ goto yy272;
+ }
+ }
+ yy294:
+ yych = *++p;
+ if (yych <= 'U') {
+ if (yych <= 'N') {
+ if (yych == 'E')
+ goto yy326;
+ goto yy272;
+ } else {
+ if (yych <= 'O')
+ goto yy327;
+ if (yych <= 'T')
+ goto yy272;
+ goto yy329;
+ }
+ } else {
+ if (yych <= 'n') {
+ if (yych == 'e')
+ goto yy326;
+ goto yy272;
+ } else {
+ if (yych <= 'o')
+ goto yy327;
+ if (yych == 'u')
+ goto yy329;
+ goto yy272;
+ }
+ }
+ yy295:
+ yych = *++p;
+ switch (yych) {
+ case 'A':
+ case 'a':
+ goto yy330;
+ case 'B':
+ case 'b':
+ goto yy331;
+ case 'D':
+ case 'd':
+ goto yy305;
+ case 'F':
+ case 'f':
+ goto yy333;
+ case 'H':
+ case 'h':
+ goto yy334;
+ case 'I':
+ case 'i':
+ goto yy335;
+ case 'R':
+ case 'r':
+ goto yy336;
+ default:
+ goto yy272;
+ }
+ yy296:
+ yych = *++p;
+ if (yych == 'D')
+ goto yy339;
+ if (yych == 'd')
+ goto yy339;
+ goto yy272;
+ yy297:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy340;
+ if (yych == 't')
+ goto yy340;
+ goto yy272;
+ yy298:
+ yych = *++p;
+ if (yych == 'I')
+ goto yy341;
+ if (yych == 'i')
+ goto yy341;
+ goto yy272;
+ yy299:
+ yych = *++p;
+ if (yych == 'S')
+ goto yy342;
+ if (yych == 's')
+ goto yy342;
+ goto yy272;
+ yy300:
+ yych = *++p;
+ if (yych == 'O')
+ goto yy343;
+ if (yych == 'o')
+ goto yy343;
+ goto yy272;
+ yy301:
+ yych = *++p;
+ if (yych == 'D')
+ goto yy344;
+ if (yych == 'd')
+ goto yy344;
+ goto yy272;
+ yy302:
+ yych = *++p;
+ if (yych == 'P')
+ goto yy345;
+ if (yych == 'p')
+ goto yy345;
+ goto yy272;
+ yy303:
+ yych = *++p;
+ if (yych == 'N')
+ goto yy346;
+ if (yych == 'n')
+ goto yy346;
+ goto yy272;
+ yy304:
+ yych = *++p;
+ if (yych == 'L')
+ goto yy347;
+ if (yych == 'l')
+ goto yy347;
+ goto yy272;
+ yy305:
+ yych = *++p;
+ if (yych <= ' ') {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy321;
+ if (yych <= 0x1F)
+ goto yy272;
+ goto yy321;
+ } else {
+ if (yych <= '/') {
+ if (yych <= '.')
+ goto yy272;
+ goto yy322;
+ } else {
+ if (yych == '>')
+ goto yy321;
+ goto yy272;
+ }
+ }
+ yy306:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy348;
+ if (yych == 't')
+ goto yy348;
+ goto yy272;
+ yy307:
+ yych = *++p;
+ if (yych <= 'V') {
+ if (yych <= 'Q') {
+ if (yych == 'A')
+ goto yy349;
+ goto yy272;
+ } else {
+ if (yych <= 'R')
+ goto yy305;
+ if (yych <= 'U')
+ goto yy272;
+ goto yy305;
+ }
+ } else {
+ if (yych <= 'q') {
+ if (yych == 'a')
+ goto yy349;
+ goto yy272;
+ } else {
+ if (yych <= 'r')
+ goto yy305;
+ if (yych == 'v')
+ goto yy305;
+ goto yy272;
+ }
+ }
+ yy308:
+ yych = *++p;
+ if (yych <= 'G') {
+ if (yych == 'E')
+ goto yy350;
+ if (yych <= 'F')
+ goto yy272;
+ goto yy351;
+ } else {
+ if (yych <= 'e') {
+ if (yych <= 'd')
+ goto yy272;
+ goto yy350;
+ } else {
+ if (yych == 'g')
+ goto yy351;
+ goto yy272;
+ }
+ }
+ yy309:
+ yych = *++p;
+ if (yych <= 'R') {
+ if (yych == 'O')
+ goto yy346;
+ if (yych <= 'Q')
+ goto yy272;
+ goto yy352;
+ } else {
+ if (yych <= 'o') {
+ if (yych <= 'n')
+ goto yy272;
+ goto yy346;
+ } else {
+ if (yych == 'r')
+ goto yy352;
+ goto yy272;
+ }
+ }
+ yy310:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy353;
+ if (yych == 'a')
+ goto yy353;
+ goto yy272;
+ yy311:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy354;
+ if (yych == 'a')
+ goto yy354;
+ goto yy272;
+ yy312:
+ yych = *++p;
+ if (yych == 'M')
+ goto yy289;
+ if (yych == 'm')
+ goto yy289;
+ goto yy272;
+ yy313:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy355;
+ if (yych == 'r')
+ goto yy355;
+ goto yy272;
+ yy314:
+ yych = *++p;
+ if (yych == 'G')
+ goto yy356;
+ if (yych == 'g')
+ goto yy356;
+ goto yy272;
+ yy315:
+ yych = *++p;
+ if (yych <= '/') {
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= ' ')
+ goto yy321;
+ if (yych <= '.')
+ goto yy272;
+ goto yy322;
+ }
+ } else {
+ if (yych <= 'M') {
+ if (yych == '>')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= 'N')
+ goto yy357;
+ if (yych == 'n')
+ goto yy357;
+ goto yy272;
+ }
+ }
+ yy316:
+ yych = *++p;
+ if (yych == 'I')
+ goto yy358;
+ if (yych == 'i')
+ goto yy358;
+ goto yy272;
+ yy317:
+ yych = *++p;
+ if (yych == 'N')
+ goto yy359;
+ if (yych == 'n')
+ goto yy359;
+ goto yy272;
+ yy318:
+ yych = *++p;
+ if (yych == 'V')
+ goto yy305;
+ if (yych == 'v')
+ goto yy305;
+ goto yy272;
+ yy319:
+ yych = *++p;
+ if (yych == 'F')
+ goto yy360;
+ if (yych == 'f')
+ goto yy360;
+ goto yy272;
+ yy320:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy361;
+ if (yych == 't')
+ goto yy361;
+ goto yy272;
+ yy321:
+ ++p;
+ { return 6; }
+ yy322:
+ yych = *++p;
+ if (yych == '>')
+ goto yy321;
+ goto yy272;
+ yy323:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy362;
+ if (yych == 'r')
+ goto yy362;
+ goto yy272;
+ yy324:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy363;
+ if (yych == 'e')
+ goto yy363;
+ goto yy272;
+ yy325:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy364;
+ if (yych == 'r')
+ goto yy364;
+ goto yy272;
+ yy326:
+ yych = *++p;
+ if (yych == 'C')
+ goto yy345;
+ if (yych == 'c')
+ goto yy345;
+ goto yy272;
+ yy327:
+ yych = *++p;
+ if (yych == 'U')
+ goto yy365;
+ if (yych == 'u')
+ goto yy365;
+ goto yy272;
+ yy328:
+ yych = *++p;
+ if (yych == 'Y')
+ goto yy366;
+ if (yych == 'y')
+ goto yy366;
+ goto yy272;
+ yy329:
+ yych = *++p;
+ if (yych == 'M')
+ goto yy367;
+ if (yych == 'm')
+ goto yy367;
+ goto yy272;
+ yy330:
+ yych = *++p;
+ if (yych == 'B')
+ goto yy368;
+ if (yych == 'b')
+ goto yy368;
+ goto yy272;
+ yy331:
+ yych = *++p;
+ if (yych == 'O')
+ goto yy301;
+ if (yych == 'o')
+ goto yy301;
+ goto yy272;
+ yy332:
+ yych = *++p;
+ if (yych == 'X')
+ goto yy369;
+ if (yych == 'x')
+ goto yy369;
+ goto yy272;
+ yy333:
+ yych = *++p;
+ if (yych == 'O')
+ goto yy370;
+ if (yych == 'o')
+ goto yy370;
+ goto yy272;
+ yy334:
+ yych = *++p;
+ if (yych <= '/') {
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= ' ')
+ goto yy321;
+ if (yych <= '.')
+ goto yy272;
+ goto yy322;
+ }
+ } else {
+ if (yych <= 'D') {
+ if (yych == '>')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= 'E')
+ goto yy371;
+ if (yych == 'e')
+ goto yy371;
+ goto yy272;
+ }
+ }
+ yy335:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy368;
+ if (yych == 't')
+ goto yy368;
+ goto yy272;
+ yy336:
+ yych = *++p;
+ if (yych <= '/') {
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= ' ')
+ goto yy321;
+ if (yych <= '.')
+ goto yy272;
+ goto yy322;
+ }
+ } else {
+ if (yych <= '@') {
+ if (yych == '>')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= 'A')
+ goto yy372;
+ if (yych == 'a')
+ goto yy372;
+ goto yy272;
+ }
+ }
+ yy337:
+ ++p;
+ { return 2; }
+ yy338:
+ yych = *++p;
+ if (yych == 'D')
+ goto yy373;
+ if (yych == 'd')
+ goto yy373;
+ goto yy272;
+ yy339:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy374;
+ if (yych == 'r')
+ goto yy374;
+ goto yy272;
+ yy340:
+ yych = *++p;
+ if (yych == 'I')
+ goto yy375;
+ if (yych == 'i')
+ goto yy375;
+ goto yy272;
+ yy341:
+ yych = *++p;
+ if (yych == 'D')
+ goto yy376;
+ if (yych == 'd')
+ goto yy376;
+ goto yy272;
+ yy342:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy377;
+ if (yych == 'e')
+ goto yy377;
+ goto yy272;
+ yy343:
+ yych = *++p;
+ if (yych == 'C')
+ goto yy378;
+ if (yych == 'c')
+ goto yy378;
+ goto yy272;
+ yy344:
+ yych = *++p;
+ if (yych == 'Y')
+ goto yy305;
+ if (yych == 'y')
+ goto yy305;
+ goto yy272;
+ yy345:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy379;
+ if (yych == 't')
+ goto yy379;
+ goto yy272;
+ yy346:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy380;
+ if (yych == 't')
+ goto yy380;
+ goto yy272;
+ yy347:
+ yych = *++p;
+ if (yych <= '/') {
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= ' ')
+ goto yy321;
+ if (yych <= '.')
+ goto yy272;
+ goto yy322;
+ }
+ } else {
+ if (yych <= 'F') {
+ if (yych == '>')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= 'G')
+ goto yy381;
+ if (yych == 'g')
+ goto yy381;
+ goto yy272;
+ }
+ }
+ yy348:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy382;
+ if (yych == 'a')
+ goto yy382;
+ goto yy272;
+ yy349:
+ yych = *++p;
+ if (yych == 'L')
+ goto yy383;
+ if (yych == 'l')
+ goto yy383;
+ goto yy272;
+ yy350:
+ yych = *++p;
+ if (yych == 'L')
+ goto yy384;
+ if (yych == 'l')
+ goto yy384;
+ goto yy272;
+ yy351:
+ yych = *++p;
+ if (yych <= 'U') {
+ if (yych == 'C')
+ goto yy385;
+ if (yych <= 'T')
+ goto yy272;
+ goto yy386;
+ } else {
+ if (yych <= 'c') {
+ if (yych <= 'b')
+ goto yy272;
+ goto yy385;
+ } else {
+ if (yych == 'u')
+ goto yy386;
+ goto yy272;
+ }
+ }
+ yy352:
+ yych = *++p;
+ if (yych == 'M')
+ goto yy305;
+ if (yych == 'm')
+ goto yy305;
+ goto yy272;
+ yy353:
+ yych = *++p;
+ if (yych == 'M')
+ goto yy387;
+ if (yych == 'm')
+ goto yy387;
+ goto yy272;
+ yy354:
+ yych = *++p;
+ if (yych == 'D')
+ goto yy388;
+ if (yych == 'd')
+ goto yy388;
+ goto yy272;
+ yy355:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy389;
+ if (yych == 'a')
+ goto yy389;
+ goto yy272;
+ yy356:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy390;
+ if (yych == 'e')
+ goto yy390;
+ goto yy272;
+ yy357:
+ yych = *++p;
+ if (yych == 'K')
+ goto yy305;
+ if (yych == 'k')
+ goto yy305;
+ goto yy272;
+ yy358:
+ yych = *++p;
+ if (yych == 'N')
+ goto yy305;
+ if (yych == 'n')
+ goto yy305;
+ goto yy272;
+ yy359:
+ yych = *++p;
+ if (yych == 'U')
+ goto yy391;
+ if (yych == 'u')
+ goto yy391;
+ goto yy272;
+ yy360:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy392;
+ if (yych == 'r')
+ goto yy392;
+ goto yy272;
+ yy361:
+ yych = *++p;
+ if (yych <= 'I') {
+ if (yych == 'G')
+ goto yy381;
+ if (yych <= 'H')
+ goto yy272;
+ goto yy393;
+ } else {
+ if (yych <= 'g') {
+ if (yych <= 'f')
+ goto yy272;
+ goto yy381;
+ } else {
+ if (yych == 'i')
+ goto yy393;
+ goto yy272;
+ }
+ }
+ yy362:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy352;
+ if (yych == 'a')
+ goto yy352;
+ goto yy272;
+ yy363:
+ yych = *++p;
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy394;
+ goto yy272;
+ } else {
+ if (yych <= ' ')
+ goto yy394;
+ if (yych == '>')
+ goto yy394;
+ goto yy272;
+ }
+ yy364:
+ yych = *++p;
+ if (yych == 'I')
+ goto yy395;
+ if (yych == 'i')
+ goto yy395;
+ goto yy272;
+ yy365:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy396;
+ if (yych == 'r')
+ goto yy396;
+ goto yy272;
+ yy366:
+ yych = *++p;
+ if (yych == 'L')
+ goto yy324;
+ if (yych == 'l')
+ goto yy324;
+ goto yy272;
+ yy367:
+ yych = *++p;
+ if (yych == 'M')
+ goto yy397;
+ if (yych == 'm')
+ goto yy397;
+ goto yy272;
+ yy368:
+ yych = *++p;
+ if (yych == 'L')
+ goto yy376;
+ if (yych == 'l')
+ goto yy376;
+ goto yy272;
+ yy369:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy398;
+ if (yych == 't')
+ goto yy398;
+ goto yy272;
+ yy370:
+ yych = *++p;
+ if (yych == 'O')
+ goto yy399;
+ if (yych == 'o')
+ goto yy399;
+ goto yy272;
+ yy371:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy400;
+ if (yych == 'a')
+ goto yy400;
+ goto yy272;
+ yy372:
+ yych = *++p;
+ if (yych == 'C')
+ goto yy357;
+ if (yych == 'c')
+ goto yy357;
+ goto yy272;
+ yy373:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy401;
+ if (yych == 'a')
+ goto yy401;
+ goto yy272;
+ yy374:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy402;
+ if (yych == 'e')
+ goto yy402;
+ goto yy272;
+ yy375:
+ yych = *++p;
+ if (yych == 'C')
+ goto yy368;
+ if (yych == 'c')
+ goto yy368;
+ goto yy272;
+ yy376:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy305;
+ if (yych == 'e')
+ goto yy305;
+ goto yy272;
+ yy377:
+ yych = *++p;
+ if (yych <= '/') {
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= ' ')
+ goto yy321;
+ if (yych <= '.')
+ goto yy272;
+ goto yy322;
+ }
+ } else {
+ if (yych <= 'E') {
+ if (yych == '>')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= 'F')
+ goto yy403;
+ if (yych == 'f')
+ goto yy403;
+ goto yy272;
+ }
+ }
+ yy378:
+ yych = *++p;
+ if (yych == 'K')
+ goto yy404;
+ if (yych == 'k')
+ goto yy404;
+ goto yy272;
+ yy379:
+ yych = *++p;
+ if (yych == 'I')
+ goto yy393;
+ if (yych == 'i')
+ goto yy393;
+ goto yy272;
+ yy380:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy405;
+ if (yych == 'e')
+ goto yy405;
+ goto yy272;
+ yy381:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy406;
+ if (yych == 'r')
+ goto yy406;
+ goto yy272;
+ yy382:
+ yych = *++p;
+ if (yych == 'I')
+ goto yy407;
+ if (yych == 'i')
+ goto yy407;
+ goto yy272;
+ yy383:
+ yych = *++p;
+ if (yych == 'O')
+ goto yy408;
+ if (yych == 'o')
+ goto yy408;
+ goto yy272;
+ yy384:
+ yych = *++p;
+ if (yych == 'D')
+ goto yy409;
+ if (yych == 'd')
+ goto yy409;
+ goto yy272;
+ yy385:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy302;
+ if (yych == 'a')
+ goto yy302;
+ goto yy272;
+ yy386:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy376;
+ if (yych == 'r')
+ goto yy376;
+ goto yy272;
+ yy387:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy410;
+ if (yych == 'e')
+ goto yy410;
+ goto yy272;
+ yy388:
+ yych = *++p;
+ if (yych <= '/') {
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= ' ')
+ goto yy321;
+ if (yych <= '.')
+ goto yy272;
+ goto yy322;
+ }
+ } else {
+ if (yych <= 'D') {
+ if (yych == '>')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= 'E')
+ goto yy405;
+ if (yych == 'e')
+ goto yy405;
+ goto yy272;
+ }
+ }
+ yy389:
+ yych = *++p;
+ if (yych == 'M')
+ goto yy376;
+ if (yych == 'm')
+ goto yy376;
+ goto yy272;
+ yy390:
+ yych = *++p;
+ if (yych == 'N')
+ goto yy400;
+ if (yych == 'n')
+ goto yy400;
+ goto yy272;
+ yy391:
+ yych = *++p;
+ if (yych <= '/') {
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= ' ')
+ goto yy321;
+ if (yych <= '.')
+ goto yy272;
+ goto yy322;
+ }
+ } else {
+ if (yych <= 'H') {
+ if (yych == '>')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= 'I')
+ goto yy411;
+ if (yych == 'i')
+ goto yy411;
+ goto yy272;
+ }
+ }
+ yy392:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy412;
+ if (yych == 'a')
+ goto yy412;
+ goto yy272;
+ yy393:
+ yych = *++p;
+ if (yych == 'O')
+ goto yy358;
+ if (yych == 'o')
+ goto yy358;
+ goto yy272;
+ yy394:
+ ++p;
+ { return 1; }
+ yy395:
+ yych = *++p;
+ if (yych == 'P')
+ goto yy413;
+ if (yych == 'p')
+ goto yy413;
+ goto yy272;
+ yy396:
+ yych = *++p;
+ if (yych == 'C')
+ goto yy376;
+ if (yych == 'c')
+ goto yy376;
+ goto yy272;
+ yy397:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy414;
+ if (yych == 'a')
+ goto yy414;
+ goto yy272;
+ yy398:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy415;
+ if (yych == 'a')
+ goto yy415;
+ goto yy272;
+ yy399:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy305;
+ if (yych == 't')
+ goto yy305;
+ goto yy272;
+ yy400:
+ yych = *++p;
+ if (yych == 'D')
+ goto yy305;
+ if (yych == 'd')
+ goto yy305;
+ goto yy272;
+ yy401:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy416;
+ if (yych == 't')
+ goto yy416;
+ goto yy272;
+ yy402:
+ yych = *++p;
+ if (yych == 'S')
+ goto yy417;
+ if (yych == 's')
+ goto yy417;
+ goto yy272;
+ yy403:
+ yych = *++p;
+ if (yych == 'O')
+ goto yy418;
+ if (yych == 'o')
+ goto yy418;
+ goto yy272;
+ yy404:
+ yych = *++p;
+ if (yych == 'Q')
+ goto yy419;
+ if (yych == 'q')
+ goto yy419;
+ goto yy272;
+ yy405:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy305;
+ if (yych == 'r')
+ goto yy305;
+ goto yy272;
+ yy406:
+ yych = *++p;
+ if (yych == 'O')
+ goto yy420;
+ if (yych == 'o')
+ goto yy420;
+ goto yy272;
+ yy407:
+ yych = *++p;
+ if (yych == 'L')
+ goto yy417;
+ if (yych == 'l')
+ goto yy417;
+ goto yy272;
+ yy408:
+ yych = *++p;
+ if (yych == 'G')
+ goto yy305;
+ if (yych == 'g')
+ goto yy305;
+ goto yy272;
+ yy409:
+ yych = *++p;
+ if (yych == 'S')
+ goto yy421;
+ if (yych == 's')
+ goto yy421;
+ goto yy272;
+ yy410:
+ yych = *++p;
+ if (yych <= '/') {
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy272;
+ if (yych <= '\r')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= ' ')
+ goto yy321;
+ if (yych <= '.')
+ goto yy272;
+ goto yy322;
+ }
+ } else {
+ if (yych <= 'R') {
+ if (yych == '>')
+ goto yy321;
+ goto yy272;
+ } else {
+ if (yych <= 'S')
+ goto yy421;
+ if (yych == 's')
+ goto yy421;
+ goto yy272;
+ }
+ }
+ yy411:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy422;
+ if (yych == 't')
+ goto yy422;
+ goto yy272;
+ yy412:
+ yych = *++p;
+ if (yych == 'M')
+ goto yy423;
+ if (yych == 'm')
+ goto yy423;
+ goto yy272;
+ yy413:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy363;
+ if (yych == 't')
+ goto yy363;
+ goto yy272;
+ yy414:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy344;
+ if (yych == 'r')
+ goto yy344;
+ goto yy272;
+ yy415:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy424;
+ if (yych == 'r')
+ goto yy424;
+ goto yy272;
+ yy416:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy425;
+ if (yych == 'a')
+ goto yy425;
+ goto yy272;
+ yy417:
+ yych = *++p;
+ if (yych == 'S')
+ goto yy305;
+ if (yych == 's')
+ goto yy305;
+ goto yy272;
+ yy418:
+ yych = *++p;
+ if (yych == 'N')
+ goto yy399;
+ if (yych == 'n')
+ goto yy399;
+ goto yy272;
+ yy419:
+ yych = *++p;
+ if (yych == 'U')
+ goto yy426;
+ if (yych == 'u')
+ goto yy426;
+ goto yy272;
+ yy420:
+ yych = *++p;
+ if (yych == 'U')
+ goto yy427;
+ if (yych == 'u')
+ goto yy427;
+ goto yy272;
+ yy421:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy399;
+ if (yych == 'e')
+ goto yy399;
+ goto yy272;
+ yy422:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy352;
+ if (yych == 'e')
+ goto yy352;
+ goto yy272;
+ yy423:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy417;
+ if (yych == 'e')
+ goto yy417;
+ goto yy272;
+ yy424:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy428;
+ if (yych == 'e')
+ goto yy428;
+ goto yy272;
+ yy425:
+ yych = *++p;
+ if (yych == '[')
+ goto yy429;
+ goto yy272;
+ yy426:
+ yych = *++p;
+ if (yych == 'O')
+ goto yy430;
+ if (yych == 'o')
+ goto yy430;
+ goto yy272;
+ yy427:
+ yych = *++p;
+ if (yych == 'P')
+ goto yy305;
+ if (yych == 'p')
+ goto yy305;
+ goto yy272;
+ yy428:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy363;
+ if (yych == 'a')
+ goto yy363;
+ goto yy272;
+ yy429:
+ ++p;
+ { return 5; }
+ yy430:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy376;
+ if (yych == 't')
+ goto yy376;
+ goto yy272;
+ }
+}
+
+// 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 yy433;
+ ++p;
+ yy432 : { return 0; }
+ yy433:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= '@') {
+ if (yych != '/')
+ goto yy432;
+ } else {
+ if (yych <= 'Z')
+ goto yy435;
+ if (yych <= '`')
+ goto yy432;
+ if (yych <= 'z')
+ goto yy435;
+ goto yy432;
+ }
+ yych = *++p;
+ if (yych <= '@')
+ goto yy434;
+ if (yych <= 'Z')
+ goto yy436;
+ if (yych <= '`')
+ goto yy434;
+ if (yych <= 'z')
+ goto yy436;
+ yy434:
+ p = marker;
+ if (yyaccept == 0) {
+ goto yy432;
+ } else {
+ goto yy443;
+ }
+ yy435:
+ yych = *++p;
+ if (yybm[0 + yych] & 2) {
+ goto yy437;
+ }
+ if (yych <= '=') {
+ if (yych <= '.') {
+ if (yych == '-')
+ goto yy435;
+ goto yy434;
+ } else {
+ if (yych <= '/')
+ goto yy438;
+ if (yych <= '9')
+ goto yy435;
+ goto yy434;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '>')
+ goto yy439;
+ if (yych <= '@')
+ goto yy434;
+ goto yy435;
+ } else {
+ if (yych <= '`')
+ goto yy434;
+ if (yych <= 'z')
+ goto yy435;
+ goto yy434;
+ }
+ }
+ yy436:
+ yych = *++p;
+ if (yych <= '/') {
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy434;
+ if (yych <= '\r')
+ goto yy440;
+ goto yy434;
+ } else {
+ if (yych <= ' ')
+ goto yy440;
+ if (yych == '-')
+ goto yy436;
+ goto yy434;
+ }
+ } else {
+ if (yych <= '@') {
+ if (yych <= '9')
+ goto yy436;
+ if (yych == '>')
+ goto yy439;
+ goto yy434;
+ } else {
+ if (yych <= 'Z')
+ goto yy436;
+ if (yych <= '`')
+ goto yy434;
+ if (yych <= 'z')
+ goto yy436;
+ goto yy434;
+ }
+ }
+ yy437:
+ yych = *++p;
+ if (yybm[0 + yych] & 2) {
+ goto yy437;
+ }
+ if (yych <= '>') {
+ if (yych <= '9') {
+ if (yych != '/')
+ goto yy434;
+ } else {
+ if (yych <= ':')
+ goto yy441;
+ if (yych <= '=')
+ goto yy434;
+ goto yy439;
+ }
+ } else {
+ if (yych <= '^') {
+ if (yych <= '@')
+ goto yy434;
+ if (yych <= 'Z')
+ goto yy441;
+ goto yy434;
+ } else {
+ if (yych == '`')
+ goto yy434;
+ if (yych <= 'z')
+ goto yy441;
+ goto yy434;
+ }
+ }
+ yy438:
+ yych = *++p;
+ if (yych != '>')
+ goto yy434;
+ yy439:
+ yych = *++p;
+ if (yybm[0 + yych] & 4) {
+ goto yy439;
+ }
+ if (yych <= 0x08)
+ goto yy434;
+ if (yych <= '\n')
+ goto yy442;
+ if (yych <= '\v')
+ goto yy434;
+ if (yych <= '\r')
+ goto yy444;
+ goto yy434;
+ yy440:
+ yych = *++p;
+ if (yych <= 0x1F) {
+ if (yych <= 0x08)
+ goto yy434;
+ if (yych <= '\r')
+ goto yy440;
+ goto yy434;
+ } else {
+ if (yych <= ' ')
+ goto yy440;
+ if (yych == '>')
+ goto yy439;
+ goto yy434;
+ }
+ yy441:
+ yych = *++p;
+ if (yybm[0 + yych] & 8) {
+ goto yy441;
+ }
+ if (yych <= ',') {
+ if (yych <= '\r') {
+ if (yych <= 0x08)
+ goto yy434;
+ goto yy445;
+ } else {
+ if (yych == ' ')
+ goto yy445;
+ goto yy434;
+ }
+ } else {
+ if (yych <= '<') {
+ if (yych <= '/')
+ goto yy438;
+ goto yy434;
+ } else {
+ if (yych <= '=')
+ goto yy446;
+ if (yych <= '>')
+ goto yy439;
+ goto yy434;
+ }
+ }
+ yy442:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 4) {
+ goto yy439;
+ }
+ if (yych <= 0x08)
+ goto yy443;
+ if (yych <= '\n')
+ goto yy442;
+ if (yych <= '\v')
+ goto yy443;
+ if (yych <= '\r')
+ goto yy444;
+ yy443 : { return 7; }
+ yy444:
+ ++p;
+ goto yy443;
+ yy445:
+ yych = *++p;
+ if (yych <= '<') {
+ if (yych <= ' ') {
+ if (yych <= 0x08)
+ goto yy434;
+ if (yych <= '\r')
+ goto yy445;
+ if (yych <= 0x1F)
+ goto yy434;
+ goto yy445;
+ } else {
+ if (yych <= '/') {
+ if (yych <= '.')
+ goto yy434;
+ goto yy438;
+ } else {
+ if (yych == ':')
+ goto yy441;
+ goto yy434;
+ }
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '=')
+ goto yy446;
+ if (yych <= '>')
+ goto yy439;
+ if (yych <= '@')
+ goto yy434;
+ goto yy441;
+ } else {
+ if (yych <= '_') {
+ if (yych <= '^')
+ goto yy434;
+ goto yy441;
+ } else {
+ if (yych <= '`')
+ goto yy434;
+ if (yych <= 'z')
+ goto yy441;
+ goto yy434;
+ }
+ }
+ }
+ yy446:
+ yych = *++p;
+ if (yybm[0 + yych] & 32) {
+ goto yy447;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '"') {
+ if (yych <= 0x00)
+ goto yy434;
+ if (yych <= ' ')
+ goto yy446;
+ goto yy448;
+ } else {
+ if (yych <= '\'')
+ goto yy449;
+ if (yych <= 0xC1)
+ goto yy434;
+ if (yych <= 0xDF)
+ goto yy450;
+ goto yy451;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy453;
+ goto yy452;
+ } else {
+ if (yych <= 0xF0)
+ goto yy454;
+ if (yych <= 0xF3)
+ goto yy455;
+ if (yych <= 0xF4)
+ goto yy456;
+ goto yy434;
+ }
+ }
+ yy447:
+ yych = *++p;
+ if (yybm[0 + yych] & 32) {
+ goto yy447;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '=') {
+ if (yych <= 0x00)
+ goto yy434;
+ if (yych <= ' ')
+ goto yy437;
+ goto yy434;
+ } else {
+ if (yych <= '>')
+ goto yy439;
+ if (yych <= 0xC1)
+ goto yy434;
+ if (yych <= 0xDF)
+ goto yy450;
+ goto yy451;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy453;
+ goto yy452;
+ } else {
+ if (yych <= 0xF0)
+ goto yy454;
+ if (yych <= 0xF3)
+ goto yy455;
+ if (yych <= 0xF4)
+ goto yy456;
+ goto yy434;
+ }
+ }
+ yy448:
+ yych = *++p;
+ if (yybm[0 + yych] & 64) {
+ goto yy448;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy434;
+ if (yych <= '"')
+ goto yy457;
+ goto yy434;
+ } else {
+ if (yych <= 0xDF)
+ goto yy458;
+ if (yych <= 0xE0)
+ goto yy459;
+ goto yy460;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy461;
+ if (yych <= 0xEF)
+ goto yy460;
+ goto yy462;
+ } else {
+ if (yych <= 0xF3)
+ goto yy463;
+ if (yych <= 0xF4)
+ goto yy464;
+ goto yy434;
+ }
+ }
+ yy449:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy449;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy434;
+ if (yych <= '\'')
+ goto yy457;
+ goto yy434;
+ } else {
+ if (yych <= 0xDF)
+ goto yy465;
+ if (yych <= 0xE0)
+ goto yy466;
+ goto yy467;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy468;
+ if (yych <= 0xEF)
+ goto yy467;
+ goto yy469;
+ } else {
+ if (yych <= 0xF3)
+ goto yy470;
+ if (yych <= 0xF4)
+ goto yy471;
+ goto yy434;
+ }
+ }
+ yy450:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy447;
+ goto yy434;
+ yy451:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy450;
+ goto yy434;
+ yy452:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy450;
+ goto yy434;
+ yy453:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0x9F)
+ goto yy450;
+ goto yy434;
+ yy454:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy452;
+ goto yy434;
+ yy455:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy452;
+ goto yy434;
+ yy456:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0x8F)
+ goto yy452;
+ goto yy434;
+ yy457:
+ yych = *++p;
+ if (yybm[0 + yych] & 2) {
+ goto yy437;
+ }
+ if (yych == '/')
+ goto yy438;
+ if (yych == '>')
+ goto yy439;
+ goto yy434;
+ yy458:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy448;
+ goto yy434;
+ yy459:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy458;
+ goto yy434;
+ yy460:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy458;
+ goto yy434;
+ yy461:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0x9F)
+ goto yy458;
+ goto yy434;
+ yy462:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy460;
+ goto yy434;
+ yy463:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy460;
+ goto yy434;
+ yy464:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0x8F)
+ goto yy460;
+ goto yy434;
+ yy465:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy449;
+ goto yy434;
+ yy466:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy465;
+ goto yy434;
+ yy467:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy465;
+ goto yy434;
+ yy468:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0x9F)
+ goto yy465;
+ goto yy434;
+ yy469:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy467;
+ goto yy434;
+ yy470:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0xBF)
+ goto yy467;
+ goto yy434;
+ yy471:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy434;
+ if (yych <= 0x8F)
+ goto yy467;
+ goto yy434;
+ }
+}
+
+// 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 yy473;
+ if (yych != '\n')
+ goto yy475;
+ } else {
+ if (yych <= '<')
+ goto yy476;
+ if (yych <= 0x7F)
+ goto yy475;
+ if (yych >= 0xC2)
+ goto yy477;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0)
+ goto yy478;
+ if (yych == 0xED)
+ goto yy480;
+ goto yy479;
+ } else {
+ if (yych <= 0xF0)
+ goto yy481;
+ if (yych <= 0xF3)
+ goto yy482;
+ if (yych <= 0xF4)
+ goto yy483;
+ }
+ }
+ yy473:
+ ++p;
+ yy474 : { return 0; }
+ yy475:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= '\n') {
+ if (yych <= 0x00)
+ goto yy474;
+ if (yych <= '\t')
+ goto yy485;
+ goto yy474;
+ } else {
+ if (yych <= 0x7F)
+ goto yy485;
+ if (yych <= 0xC1)
+ goto yy474;
+ if (yych <= 0xF4)
+ goto yy485;
+ goto yy474;
+ }
+ yy476:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= '.') {
+ if (yych <= 0x00)
+ goto yy474;
+ if (yych == '\n')
+ goto yy474;
+ goto yy485;
+ } else {
+ if (yych <= 0x7F) {
+ if (yych <= '/')
+ goto yy495;
+ goto yy485;
+ } else {
+ if (yych <= 0xC1)
+ goto yy474;
+ if (yych <= 0xF4)
+ goto yy485;
+ goto yy474;
+ }
+ }
+ yy477:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy474;
+ if (yych <= 0xBF)
+ goto yy484;
+ goto yy474;
+ yy478:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x9F)
+ goto yy474;
+ if (yych <= 0xBF)
+ goto yy488;
+ goto yy474;
+ yy479:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy474;
+ if (yych <= 0xBF)
+ goto yy488;
+ goto yy474;
+ yy480:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy474;
+ if (yych <= 0x9F)
+ goto yy488;
+ goto yy474;
+ yy481:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x8F)
+ goto yy474;
+ if (yych <= 0xBF)
+ goto yy490;
+ goto yy474;
+ yy482:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy474;
+ if (yych <= 0xBF)
+ goto yy490;
+ goto yy474;
+ yy483:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy474;
+ if (yych <= 0x8F)
+ goto yy490;
+ goto yy474;
+ yy484:
+ yych = *++p;
+ yy485:
+ if (yybm[0 + yych] & 64) {
+ goto yy484;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy486;
+ if (yych <= '<')
+ goto yy487;
+ } else {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ goto yy490;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy491;
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ }
+ }
+ yy486:
+ p = marker;
+ if (yyaccept == 0) {
+ goto yy474;
+ } else {
+ goto yy508;
+ }
+ yy487:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xDF) {
+ if (yych <= '.') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= '/')
+ goto yy495;
+ if (yych <= 0x7F)
+ goto yy484;
+ if (yych <= 0xC1)
+ goto yy486;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych == 0xED)
+ goto yy491;
+ goto yy490;
+ } else {
+ if (yych <= 0xF0)
+ goto yy492;
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ yy488:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy486;
+ if (yych <= 0xBF)
+ goto yy484;
+ goto yy486;
+ yy489:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy486;
+ if (yych <= 0xBF)
+ goto yy488;
+ goto yy486;
+ yy490:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy486;
+ if (yych <= 0xBF)
+ goto yy488;
+ goto yy486;
+ yy491:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy486;
+ if (yych <= 0x9F)
+ goto yy488;
+ goto yy486;
+ yy492:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy486;
+ if (yych <= 0xBF)
+ goto yy490;
+ goto yy486;
+ yy493:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy486;
+ if (yych <= 0xBF)
+ goto yy490;
+ goto yy486;
+ yy494:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy486;
+ if (yych <= 0x8F)
+ goto yy490;
+ goto yy486;
+ yy495:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 's') {
+ if (yych <= 'R') {
+ if (yych <= '\n') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych <= '\t')
+ goto yy484;
+ goto yy486;
+ } else {
+ if (yych != 'P')
+ goto yy484;
+ }
+ } else {
+ if (yych <= 'o') {
+ if (yych <= 'S')
+ goto yy497;
+ if (yych <= 'T')
+ goto yy498;
+ goto yy484;
+ } else {
+ if (yych <= 'p')
+ goto yy496;
+ if (yych <= 'r')
+ goto yy484;
+ goto yy497;
+ }
+ }
+ } else {
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 't')
+ goto yy498;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ } else {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ goto yy490;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy491;
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy496:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'Q') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 'q') {
+ if (yych <= 'R')
+ goto yy499;
+ goto yy484;
+ } else {
+ if (yych <= 'r')
+ goto yy499;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy497:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 't') {
+ if (yych <= 'C') {
+ if (yych <= '\t') {
+ if (yych <= 0x00)
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= '\n')
+ goto yy486;
+ if (yych <= 'B')
+ goto yy484;
+ goto yy500;
+ }
+ } else {
+ if (yych <= 'b') {
+ if (yych == 'T')
+ goto yy501;
+ goto yy484;
+ } else {
+ if (yych <= 'c')
+ goto yy500;
+ if (yych <= 's')
+ goto yy484;
+ goto yy501;
+ }
+ }
+ } else {
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ } else {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ goto yy490;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy491;
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy498:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'D') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 'd') {
+ if (yych <= 'E')
+ goto yy502;
+ goto yy484;
+ } else {
+ if (yych <= 'e')
+ goto yy502;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy499:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'D') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 'd') {
+ if (yych <= 'E')
+ goto yy503;
+ goto yy484;
+ } else {
+ if (yych <= 'e')
+ goto yy503;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy500:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'Q') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 'q') {
+ if (yych <= 'R')
+ goto yy504;
+ goto yy484;
+ } else {
+ if (yych <= 'r')
+ goto yy504;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy501:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'X') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 'x') {
+ if (yych <= 'Y')
+ goto yy505;
+ goto yy484;
+ } else {
+ if (yych <= 'y')
+ goto yy505;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy502:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'W') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 'w') {
+ if (yych <= 'X')
+ goto yy506;
+ goto yy484;
+ } else {
+ if (yych <= 'x')
+ goto yy506;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy503:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xDF) {
+ if (yych <= '=') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= '>')
+ goto yy507;
+ if (yych <= 0x7F)
+ goto yy484;
+ if (yych <= 0xC1)
+ goto yy486;
+ goto yy488;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych == 0xED)
+ goto yy491;
+ goto yy490;
+ } else {
+ if (yych <= 0xF0)
+ goto yy492;
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ yy504:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'H') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 'h') {
+ if (yych <= 'I')
+ goto yy509;
+ goto yy484;
+ } else {
+ if (yych <= 'i')
+ goto yy509;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy505:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'K') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 'k') {
+ if (yych <= 'L')
+ goto yy499;
+ goto yy484;
+ } else {
+ if (yych <= 'l')
+ goto yy499;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy506:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'S') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 's') {
+ if (yych <= 'T')
+ goto yy510;
+ goto yy484;
+ } else {
+ if (yych <= 't')
+ goto yy510;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy507:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 64) {
+ goto yy484;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy508;
+ if (yych <= '<')
+ goto yy487;
+ } else {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ goto yy490;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy491;
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ }
+ }
+ yy508 : { return (bufsize_t)(p - start); }
+ yy509:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'O') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 'o') {
+ if (yych <= 'P')
+ goto yy511;
+ goto yy484;
+ } else {
+ if (yych <= 'p')
+ goto yy511;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy510:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= '@') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= '`') {
+ if (yych <= 'A')
+ goto yy512;
+ goto yy484;
+ } else {
+ if (yych <= 'a')
+ goto yy512;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy511:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'S') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 's') {
+ if (yych <= 'T')
+ goto yy503;
+ goto yy484;
+ } else {
+ if (yych <= 't')
+ goto yy503;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy512:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'Q') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 'q') {
+ if (yych >= 'S')
+ goto yy484;
+ } else {
+ if (yych <= 'r')
+ goto yy513;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy513:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= 'D') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= 'd') {
+ if (yych >= 'F')
+ goto yy484;
+ } else {
+ if (yych <= 'e')
+ goto yy514;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ yy514:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy487;
+ }
+ if (yych <= 0xC1) {
+ if (yych <= '@') {
+ if (yych <= 0x00)
+ goto yy486;
+ if (yych == '\n')
+ goto yy486;
+ goto yy484;
+ } else {
+ if (yych <= '`') {
+ if (yych <= 'A')
+ goto yy503;
+ goto yy484;
+ } else {
+ if (yych <= 'a')
+ goto yy503;
+ if (yych <= 0x7F)
+ goto yy484;
+ goto yy486;
+ }
+ }
+ } else {
+ if (yych <= 0xED) {
+ if (yych <= 0xDF)
+ goto yy488;
+ if (yych <= 0xE0)
+ goto yy489;
+ if (yych <= 0xEC)
+ goto yy490;
+ goto yy491;
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xEF)
+ goto yy490;
+ goto yy492;
+ } else {
+ if (yych <= 0xF3)
+ goto yy493;
+ if (yych <= 0xF4)
+ goto yy494;
+ goto yy486;
+ }
+ }
+ }
+ }
+}
+
+// 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 yy516;
+ if (yych != '\n')
+ goto yy518;
+ } else {
+ if (yych <= '-')
+ goto yy519;
+ if (yych <= 0x7F)
+ goto yy518;
+ if (yych >= 0xC2)
+ goto yy520;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0)
+ goto yy521;
+ if (yych == 0xED)
+ goto yy523;
+ goto yy522;
+ } else {
+ if (yych <= 0xF0)
+ goto yy524;
+ if (yych <= 0xF3)
+ goto yy525;
+ if (yych <= 0xF4)
+ goto yy526;
+ }
+ }
+ yy516:
+ ++p;
+ yy517 : { return 0; }
+ yy518:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= '\n') {
+ if (yych <= 0x00)
+ goto yy517;
+ if (yych <= '\t')
+ goto yy528;
+ goto yy517;
+ } else {
+ if (yych <= 0x7F)
+ goto yy528;
+ if (yych <= 0xC1)
+ goto yy517;
+ if (yych <= 0xF4)
+ goto yy528;
+ goto yy517;
+ }
+ yy519:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 128) {
+ goto yy538;
+ }
+ if (yych <= '\n') {
+ if (yych <= 0x00)
+ goto yy517;
+ if (yych <= '\t')
+ goto yy528;
+ goto yy517;
+ } else {
+ if (yych <= 0x7F)
+ goto yy528;
+ if (yych <= 0xC1)
+ goto yy517;
+ if (yych <= 0xF4)
+ goto yy528;
+ goto yy517;
+ }
+ yy520:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy517;
+ if (yych <= 0xBF)
+ goto yy527;
+ goto yy517;
+ yy521:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x9F)
+ goto yy517;
+ if (yych <= 0xBF)
+ goto yy531;
+ goto yy517;
+ yy522:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy517;
+ if (yych <= 0xBF)
+ goto yy531;
+ goto yy517;
+ yy523:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy517;
+ if (yych <= 0x9F)
+ goto yy531;
+ goto yy517;
+ yy524:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x8F)
+ goto yy517;
+ if (yych <= 0xBF)
+ goto yy533;
+ goto yy517;
+ yy525:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy517;
+ if (yych <= 0xBF)
+ goto yy533;
+ goto yy517;
+ yy526:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy517;
+ if (yych <= 0x8F)
+ goto yy533;
+ goto yy517;
+ yy527:
+ yych = *++p;
+ yy528:
+ if (yybm[0 + yych] & 64) {
+ goto yy527;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy529;
+ if (yych <= '-')
+ goto yy530;
+ } else {
+ if (yych <= 0xDF)
+ goto yy531;
+ if (yych <= 0xE0)
+ goto yy532;
+ goto yy533;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy534;
+ if (yych <= 0xEF)
+ goto yy533;
+ goto yy535;
+ } else {
+ if (yych <= 0xF3)
+ goto yy536;
+ if (yych <= 0xF4)
+ goto yy537;
+ }
+ }
+ yy529:
+ p = marker;
+ if (yyaccept == 0) {
+ goto yy517;
+ } else {
+ goto yy540;
+ }
+ yy530:
+ yych = *++p;
+ if (yybm[0 + yych] & 64) {
+ goto yy527;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy529;
+ if (yych <= '-')
+ goto yy538;
+ goto yy529;
+ } else {
+ if (yych <= 0xDF)
+ goto yy531;
+ if (yych <= 0xE0)
+ goto yy532;
+ goto yy533;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy534;
+ if (yych <= 0xEF)
+ goto yy533;
+ goto yy535;
+ } else {
+ if (yych <= 0xF3)
+ goto yy536;
+ if (yych <= 0xF4)
+ goto yy537;
+ goto yy529;
+ }
+ }
+ yy531:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy529;
+ if (yych <= 0xBF)
+ goto yy527;
+ goto yy529;
+ yy532:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy529;
+ if (yych <= 0xBF)
+ goto yy531;
+ goto yy529;
+ yy533:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy529;
+ if (yych <= 0xBF)
+ goto yy531;
+ goto yy529;
+ yy534:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy529;
+ if (yych <= 0x9F)
+ goto yy531;
+ goto yy529;
+ yy535:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy529;
+ if (yych <= 0xBF)
+ goto yy533;
+ goto yy529;
+ yy536:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy529;
+ if (yych <= 0xBF)
+ goto yy533;
+ goto yy529;
+ yy537:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy529;
+ if (yych <= 0x8F)
+ goto yy533;
+ goto yy529;
+ yy538:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy538;
+ }
+ if (yych <= 0xDF) {
+ if (yych <= '=') {
+ if (yych <= 0x00)
+ goto yy529;
+ if (yych == '\n')
+ goto yy529;
+ goto yy527;
+ } else {
+ if (yych <= '>')
+ goto yy539;
+ if (yych <= 0x7F)
+ goto yy527;
+ if (yych <= 0xC1)
+ goto yy529;
+ goto yy531;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0)
+ goto yy532;
+ if (yych == 0xED)
+ goto yy534;
+ goto yy533;
+ } else {
+ if (yych <= 0xF0)
+ goto yy535;
+ if (yych <= 0xF3)
+ goto yy536;
+ if (yych <= 0xF4)
+ goto yy537;
+ goto yy529;
+ }
+ }
+ yy539:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 64) {
+ goto yy527;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy540;
+ if (yych <= '-')
+ goto yy530;
+ } else {
+ if (yych <= 0xDF)
+ goto yy531;
+ if (yych <= 0xE0)
+ goto yy532;
+ goto yy533;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy534;
+ if (yych <= 0xEF)
+ goto yy533;
+ goto yy535;
+ } else {
+ if (yych <= 0xF3)
+ goto yy536;
+ if (yych <= 0xF4)
+ goto yy537;
+ }
+ }
+ yy540 : { 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 yy542;
+ if (yych != '\n')
+ goto yy544;
+ } else {
+ if (yych <= '?')
+ goto yy545;
+ if (yych <= 0x7F)
+ goto yy544;
+ if (yych >= 0xC2)
+ goto yy546;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0)
+ goto yy547;
+ if (yych == 0xED)
+ goto yy549;
+ goto yy548;
+ } else {
+ if (yych <= 0xF0)
+ goto yy550;
+ if (yych <= 0xF3)
+ goto yy551;
+ if (yych <= 0xF4)
+ goto yy552;
+ }
+ }
+ yy542:
+ ++p;
+ yy543 : { return 0; }
+ yy544:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= '\n') {
+ if (yych <= 0x00)
+ goto yy543;
+ if (yych <= '\t')
+ goto yy554;
+ goto yy543;
+ } else {
+ if (yych <= 0x7F)
+ goto yy554;
+ if (yych <= 0xC1)
+ goto yy543;
+ if (yych <= 0xF4)
+ goto yy554;
+ goto yy543;
+ }
+ yy545:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= '=') {
+ if (yych <= 0x00)
+ goto yy543;
+ if (yych == '\n')
+ goto yy543;
+ goto yy554;
+ } else {
+ if (yych <= 0x7F) {
+ if (yych <= '>')
+ goto yy564;
+ goto yy554;
+ } else {
+ if (yych <= 0xC1)
+ goto yy543;
+ if (yych <= 0xF4)
+ goto yy554;
+ goto yy543;
+ }
+ }
+ yy546:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy543;
+ if (yych <= 0xBF)
+ goto yy553;
+ goto yy543;
+ yy547:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x9F)
+ goto yy543;
+ if (yych <= 0xBF)
+ goto yy557;
+ goto yy543;
+ yy548:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy543;
+ if (yych <= 0xBF)
+ goto yy557;
+ goto yy543;
+ yy549:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy543;
+ if (yych <= 0x9F)
+ goto yy557;
+ goto yy543;
+ yy550:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x8F)
+ goto yy543;
+ if (yych <= 0xBF)
+ goto yy559;
+ goto yy543;
+ yy551:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy543;
+ if (yych <= 0xBF)
+ goto yy559;
+ goto yy543;
+ yy552:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy543;
+ if (yych <= 0x8F)
+ goto yy559;
+ goto yy543;
+ yy553:
+ yych = *++p;
+ yy554:
+ if (yybm[0 + yych] & 64) {
+ goto yy553;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy555;
+ if (yych <= '?')
+ goto yy556;
+ } else {
+ if (yych <= 0xDF)
+ goto yy557;
+ if (yych <= 0xE0)
+ goto yy558;
+ goto yy559;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy560;
+ if (yych <= 0xEF)
+ goto yy559;
+ goto yy561;
+ } else {
+ if (yych <= 0xF3)
+ goto yy562;
+ if (yych <= 0xF4)
+ goto yy563;
+ }
+ }
+ yy555:
+ p = marker;
+ if (yyaccept == 0) {
+ goto yy543;
+ } else {
+ goto yy565;
+ }
+ yy556:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy556;
+ }
+ if (yych <= 0xDF) {
+ if (yych <= '=') {
+ if (yych <= 0x00)
+ goto yy555;
+ if (yych == '\n')
+ goto yy555;
+ goto yy553;
+ } else {
+ if (yych <= '>')
+ goto yy564;
+ if (yych <= 0x7F)
+ goto yy553;
+ if (yych <= 0xC1)
+ goto yy555;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0)
+ goto yy558;
+ if (yych == 0xED)
+ goto yy560;
+ goto yy559;
+ } else {
+ if (yych <= 0xF0)
+ goto yy561;
+ if (yych <= 0xF3)
+ goto yy562;
+ if (yych <= 0xF4)
+ goto yy563;
+ goto yy555;
+ }
+ }
+ yy557:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy555;
+ if (yych <= 0xBF)
+ goto yy553;
+ goto yy555;
+ yy558:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy555;
+ if (yych <= 0xBF)
+ goto yy557;
+ goto yy555;
+ yy559:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy555;
+ if (yych <= 0xBF)
+ goto yy557;
+ goto yy555;
+ yy560:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy555;
+ if (yych <= 0x9F)
+ goto yy557;
+ goto yy555;
+ yy561:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy555;
+ if (yych <= 0xBF)
+ goto yy559;
+ goto yy555;
+ yy562:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy555;
+ if (yych <= 0xBF)
+ goto yy559;
+ goto yy555;
+ yy563:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy555;
+ if (yych <= 0x8F)
+ goto yy559;
+ goto yy555;
+ yy564:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 64) {
+ goto yy553;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy565;
+ if (yych <= '?')
+ goto yy556;
+ } else {
+ if (yych <= 0xDF)
+ goto yy557;
+ if (yych <= 0xE0)
+ goto yy558;
+ goto yy559;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy560;
+ if (yych <= 0xEF)
+ goto yy559;
+ goto yy561;
+ } else {
+ if (yych <= 0xF3)
+ goto yy562;
+ if (yych <= 0xF4)
+ goto yy563;
+ }
+ }
+ yy565 : { 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 yy570;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '\n') {
+ if (yych <= 0x00)
+ goto yy567;
+ if (yych <= '\t')
+ goto yy569;
+ } else {
+ if (yych <= 0x7F)
+ goto yy569;
+ if (yych <= 0xC1)
+ goto yy567;
+ if (yych <= 0xDF)
+ goto yy572;
+ goto yy573;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy575;
+ goto yy574;
+ } else {
+ if (yych <= 0xF0)
+ goto yy576;
+ if (yych <= 0xF3)
+ goto yy577;
+ if (yych <= 0xF4)
+ goto yy578;
+ }
+ }
+ yy567:
+ ++p;
+ yy568 : { return 0; }
+ yy569:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= '\n') {
+ if (yych <= 0x00)
+ goto yy568;
+ if (yych <= '\t')
+ goto yy580;
+ goto yy568;
+ } else {
+ if (yych <= 0x7F)
+ goto yy580;
+ if (yych <= 0xC1)
+ goto yy568;
+ if (yych <= 0xF4)
+ goto yy580;
+ goto yy568;
+ }
+ yy570:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 128) {
+ goto yy579;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy571;
+ if (yych <= '>')
+ goto yy570;
+ } else {
+ if (yych <= 0xDF)
+ goto yy582;
+ if (yych <= 0xE0)
+ goto yy583;
+ goto yy584;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy585;
+ if (yych <= 0xEF)
+ goto yy584;
+ goto yy586;
+ } else {
+ if (yych <= 0xF3)
+ goto yy587;
+ if (yych <= 0xF4)
+ goto yy588;
+ }
+ }
+ yy571 : { return (bufsize_t)(p - start); }
+ yy572:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy568;
+ if (yych <= 0xBF)
+ goto yy579;
+ goto yy568;
+ yy573:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x9F)
+ goto yy568;
+ if (yych <= 0xBF)
+ goto yy582;
+ goto yy568;
+ yy574:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy568;
+ if (yych <= 0xBF)
+ goto yy582;
+ goto yy568;
+ yy575:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy568;
+ if (yych <= 0x9F)
+ goto yy582;
+ goto yy568;
+ yy576:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x8F)
+ goto yy568;
+ if (yych <= 0xBF)
+ goto yy584;
+ goto yy568;
+ yy577:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy568;
+ if (yych <= 0xBF)
+ goto yy584;
+ goto yy568;
+ yy578:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy568;
+ if (yych <= 0x8F)
+ goto yy584;
+ goto yy568;
+ yy579:
+ yych = *++p;
+ yy580:
+ if (yybm[0 + yych] & 128) {
+ goto yy579;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy581;
+ if (yych <= '>')
+ goto yy570;
+ } else {
+ if (yych <= 0xDF)
+ goto yy582;
+ if (yych <= 0xE0)
+ goto yy583;
+ goto yy584;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy585;
+ if (yych <= 0xEF)
+ goto yy584;
+ goto yy586;
+ } else {
+ if (yych <= 0xF3)
+ goto yy587;
+ if (yych <= 0xF4)
+ goto yy588;
+ }
+ }
+ yy581:
+ p = marker;
+ if (yyaccept == 0) {
+ goto yy568;
+ } else {
+ goto yy571;
+ }
+ yy582:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy581;
+ if (yych <= 0xBF)
+ goto yy579;
+ goto yy581;
+ yy583:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy581;
+ if (yych <= 0xBF)
+ goto yy582;
+ goto yy581;
+ yy584:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy581;
+ if (yych <= 0xBF)
+ goto yy582;
+ goto yy581;
+ yy585:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy581;
+ if (yych <= 0x9F)
+ goto yy582;
+ goto yy581;
+ yy586:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy581;
+ if (yych <= 0xBF)
+ goto yy584;
+ goto yy581;
+ yy587:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy581;
+ if (yych <= 0xBF)
+ goto yy584;
+ goto yy581;
+ yy588:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy581;
+ if (yych <= 0x8F)
+ goto yy584;
+ goto yy581;
+ }
+}
+
+// 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 yy590;
+ if (yych != '\n')
+ goto yy592;
+ } else {
+ if (yych <= ']')
+ goto yy593;
+ if (yych <= 0x7F)
+ goto yy592;
+ if (yych >= 0xC2)
+ goto yy594;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0)
+ goto yy595;
+ if (yych == 0xED)
+ goto yy597;
+ goto yy596;
+ } else {
+ if (yych <= 0xF0)
+ goto yy598;
+ if (yych <= 0xF3)
+ goto yy599;
+ if (yych <= 0xF4)
+ goto yy600;
+ }
+ }
+ yy590:
+ ++p;
+ yy591 : { return 0; }
+ yy592:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= '\n') {
+ if (yych <= 0x00)
+ goto yy591;
+ if (yych <= '\t')
+ goto yy602;
+ goto yy591;
+ } else {
+ if (yych <= 0x7F)
+ goto yy602;
+ if (yych <= 0xC1)
+ goto yy591;
+ if (yych <= 0xF4)
+ goto yy602;
+ goto yy591;
+ }
+ yy593:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 128) {
+ goto yy612;
+ }
+ if (yych <= '\n') {
+ if (yych <= 0x00)
+ goto yy591;
+ if (yych <= '\t')
+ goto yy602;
+ goto yy591;
+ } else {
+ if (yych <= 0x7F)
+ goto yy602;
+ if (yych <= 0xC1)
+ goto yy591;
+ if (yych <= 0xF4)
+ goto yy602;
+ goto yy591;
+ }
+ yy594:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy591;
+ if (yych <= 0xBF)
+ goto yy601;
+ goto yy591;
+ yy595:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x9F)
+ goto yy591;
+ if (yych <= 0xBF)
+ goto yy605;
+ goto yy591;
+ yy596:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy591;
+ if (yych <= 0xBF)
+ goto yy605;
+ goto yy591;
+ yy597:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy591;
+ if (yych <= 0x9F)
+ goto yy605;
+ goto yy591;
+ yy598:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x8F)
+ goto yy591;
+ if (yych <= 0xBF)
+ goto yy607;
+ goto yy591;
+ yy599:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy591;
+ if (yych <= 0xBF)
+ goto yy607;
+ goto yy591;
+ yy600:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x7F)
+ goto yy591;
+ if (yych <= 0x8F)
+ goto yy607;
+ goto yy591;
+ yy601:
+ yych = *++p;
+ yy602:
+ if (yybm[0 + yych] & 64) {
+ goto yy601;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy603;
+ if (yych <= ']')
+ goto yy604;
+ } else {
+ if (yych <= 0xDF)
+ goto yy605;
+ if (yych <= 0xE0)
+ goto yy606;
+ goto yy607;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy608;
+ if (yych <= 0xEF)
+ goto yy607;
+ goto yy609;
+ } else {
+ if (yych <= 0xF3)
+ goto yy610;
+ if (yych <= 0xF4)
+ goto yy611;
+ }
+ }
+ yy603:
+ p = marker;
+ if (yyaccept == 0) {
+ goto yy591;
+ } else {
+ goto yy614;
+ }
+ yy604:
+ yych = *++p;
+ if (yybm[0 + yych] & 64) {
+ goto yy601;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy603;
+ if (yych <= ']')
+ goto yy612;
+ goto yy603;
+ } else {
+ if (yych <= 0xDF)
+ goto yy605;
+ if (yych <= 0xE0)
+ goto yy606;
+ goto yy607;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy608;
+ if (yych <= 0xEF)
+ goto yy607;
+ goto yy609;
+ } else {
+ if (yych <= 0xF3)
+ goto yy610;
+ if (yych <= 0xF4)
+ goto yy611;
+ goto yy603;
+ }
+ }
+ yy605:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy603;
+ if (yych <= 0xBF)
+ goto yy601;
+ goto yy603;
+ yy606:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy603;
+ if (yych <= 0xBF)
+ goto yy605;
+ goto yy603;
+ yy607:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy603;
+ if (yych <= 0xBF)
+ goto yy605;
+ goto yy603;
+ yy608:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy603;
+ if (yych <= 0x9F)
+ goto yy605;
+ goto yy603;
+ yy609:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy603;
+ if (yych <= 0xBF)
+ goto yy607;
+ goto yy603;
+ yy610:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy603;
+ if (yych <= 0xBF)
+ goto yy607;
+ goto yy603;
+ yy611:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy603;
+ if (yych <= 0x8F)
+ goto yy607;
+ goto yy603;
+ yy612:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy612;
+ }
+ if (yych <= 0xDF) {
+ if (yych <= '=') {
+ if (yych <= 0x00)
+ goto yy603;
+ if (yych == '\n')
+ goto yy603;
+ goto yy601;
+ } else {
+ if (yych <= '>')
+ goto yy613;
+ if (yych <= 0x7F)
+ goto yy601;
+ if (yych <= 0xC1)
+ goto yy603;
+ goto yy605;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0)
+ goto yy606;
+ if (yych == 0xED)
+ goto yy608;
+ goto yy607;
+ } else {
+ if (yych <= 0xF0)
+ goto yy609;
+ if (yych <= 0xF3)
+ goto yy610;
+ if (yych <= 0xF4)
+ goto yy611;
+ goto yy603;
+ }
+ }
+ yy613:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 64) {
+ goto yy601;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= '\n')
+ goto yy614;
+ if (yych <= ']')
+ goto yy604;
+ } else {
+ if (yych <= 0xDF)
+ goto yy605;
+ if (yych <= 0xE0)
+ goto yy606;
+ goto yy607;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy608;
+ if (yych <= 0xEF)
+ goto yy607;
+ goto yy609;
+ } else {
+ if (yych <= 0xF3)
+ goto yy610;
+ if (yych <= 0xF4)
+ goto yy611;
+ }
+ }
+ yy614 : { 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 yy617;
+ } else {
+ if (yych <= '\'')
+ goto yy618;
+ if (yych <= '(')
+ goto yy619;
+ }
+ ++p;
+ yy616 : { return 0; }
+ yy617:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x00)
+ goto yy616;
+ if (yych <= 0x7F)
+ goto yy621;
+ if (yych <= 0xC1)
+ goto yy616;
+ if (yych <= 0xF4)
+ goto yy621;
+ goto yy616;
+ yy618:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= 0x00)
+ goto yy616;
+ if (yych <= 0x7F)
+ goto yy634;
+ if (yych <= 0xC1)
+ goto yy616;
+ if (yych <= 0xF4)
+ goto yy634;
+ goto yy616;
+ yy619:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych <= '(') {
+ if (yych <= 0x00)
+ goto yy616;
+ if (yych <= '\'')
+ goto yy646;
+ goto yy616;
+ } else {
+ if (yych <= 0x7F)
+ goto yy646;
+ if (yych <= 0xC1)
+ goto yy616;
+ if (yych <= 0xF4)
+ goto yy646;
+ goto yy616;
+ }
+ yy620:
+ yych = *++p;
+ yy621:
+ if (yybm[0 + yych] & 16) {
+ goto yy620;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '\\') {
+ if (yych <= 0x00)
+ goto yy622;
+ if (yych <= '"')
+ goto yy623;
+ goto yy625;
+ } else {
+ if (yych <= 0xC1)
+ goto yy622;
+ if (yych <= 0xDF)
+ goto yy626;
+ goto yy627;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy629;
+ goto yy628;
+ } else {
+ if (yych <= 0xF0)
+ goto yy630;
+ if (yych <= 0xF3)
+ goto yy631;
+ if (yych <= 0xF4)
+ goto yy632;
+ }
+ }
+ yy622:
+ p = marker;
+ if (yyaccept <= 1) {
+ if (yyaccept == 0) {
+ goto yy616;
+ } else {
+ goto yy624;
+ }
+ } else {
+ if (yyaccept == 2) {
+ goto yy636;
+ } else {
+ goto yy648;
+ }
+ }
+ yy623:
+ ++p;
+ yy624 : { return (bufsize_t)(p - start); }
+ yy625:
+ yych = *++p;
+ if (yybm[0 + yych] & 16) {
+ goto yy620;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '\\') {
+ if (yych <= 0x00)
+ goto yy622;
+ if (yych <= '"')
+ goto yy657;
+ goto yy625;
+ } else {
+ if (yych <= 0xC1)
+ goto yy622;
+ if (yych >= 0xE0)
+ goto yy627;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy629;
+ goto yy628;
+ } else {
+ if (yych <= 0xF0)
+ goto yy630;
+ if (yych <= 0xF3)
+ goto yy631;
+ if (yych <= 0xF4)
+ goto yy632;
+ goto yy622;
+ }
+ }
+ yy626:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy620;
+ goto yy622;
+ yy627:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy626;
+ goto yy622;
+ yy628:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy626;
+ goto yy622;
+ yy629:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0x9F)
+ goto yy626;
+ goto yy622;
+ yy630:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy628;
+ goto yy622;
+ yy631:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy628;
+ goto yy622;
+ yy632:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0x8F)
+ goto yy628;
+ goto yy622;
+ yy633:
+ yych = *++p;
+ yy634:
+ if (yybm[0 + yych] & 64) {
+ goto yy633;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '\\') {
+ if (yych <= 0x00)
+ goto yy622;
+ if (yych >= '(')
+ goto yy637;
+ } else {
+ if (yych <= 0xC1)
+ goto yy622;
+ if (yych <= 0xDF)
+ goto yy638;
+ goto yy639;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy641;
+ goto yy640;
+ } else {
+ if (yych <= 0xF0)
+ goto yy642;
+ if (yych <= 0xF3)
+ goto yy643;
+ if (yych <= 0xF4)
+ goto yy644;
+ goto yy622;
+ }
+ }
+ yy635:
+ ++p;
+ yy636 : { return (bufsize_t)(p - start); }
+ yy637:
+ yych = *++p;
+ if (yybm[0 + yych] & 64) {
+ goto yy633;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '\\') {
+ if (yych <= 0x00)
+ goto yy622;
+ if (yych <= '\'')
+ goto yy658;
+ goto yy637;
+ } else {
+ if (yych <= 0xC1)
+ goto yy622;
+ if (yych >= 0xE0)
+ goto yy639;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy641;
+ goto yy640;
+ } else {
+ if (yych <= 0xF0)
+ goto yy642;
+ if (yych <= 0xF3)
+ goto yy643;
+ if (yych <= 0xF4)
+ goto yy644;
+ goto yy622;
+ }
+ }
+ yy638:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy633;
+ goto yy622;
+ yy639:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy638;
+ goto yy622;
+ yy640:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy638;
+ goto yy622;
+ yy641:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0x9F)
+ goto yy638;
+ goto yy622;
+ yy642:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy640;
+ goto yy622;
+ yy643:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy640;
+ goto yy622;
+ yy644:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0x8F)
+ goto yy640;
+ goto yy622;
+ yy645:
+ yych = *++p;
+ yy646:
+ if (yybm[0 + yych] & 128) {
+ goto yy645;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '\\') {
+ if (yych <= '(')
+ goto yy622;
+ if (yych >= '*')
+ goto yy649;
+ } else {
+ if (yych <= 0xC1)
+ goto yy622;
+ if (yych <= 0xDF)
+ goto yy650;
+ goto yy651;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy653;
+ goto yy652;
+ } else {
+ if (yych <= 0xF0)
+ goto yy654;
+ if (yych <= 0xF3)
+ goto yy655;
+ if (yych <= 0xF4)
+ goto yy656;
+ goto yy622;
+ }
+ }
+ yy647:
+ ++p;
+ yy648 : { return (bufsize_t)(p - start); }
+ yy649:
+ yych = *++p;
+ if (yych <= 0xDF) {
+ if (yych <= '[') {
+ if (yych <= 0x00)
+ goto yy622;
+ if (yych == ')')
+ goto yy659;
+ goto yy645;
+ } else {
+ if (yych <= '\\')
+ goto yy649;
+ if (yych <= 0x7F)
+ goto yy645;
+ if (yych <= 0xC1)
+ goto yy622;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0)
+ goto yy651;
+ if (yych == 0xED)
+ goto yy653;
+ goto yy652;
+ } else {
+ if (yych <= 0xF0)
+ goto yy654;
+ if (yych <= 0xF3)
+ goto yy655;
+ if (yych <= 0xF4)
+ goto yy656;
+ goto yy622;
+ }
+ }
+ yy650:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy645;
+ goto yy622;
+ yy651:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy650;
+ goto yy622;
+ yy652:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy650;
+ goto yy622;
+ yy653:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0x9F)
+ goto yy650;
+ goto yy622;
+ yy654:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy652;
+ goto yy622;
+ yy655:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0xBF)
+ goto yy652;
+ goto yy622;
+ yy656:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy622;
+ if (yych <= 0x8F)
+ goto yy652;
+ goto yy622;
+ yy657:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 16) {
+ goto yy620;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '\\') {
+ if (yych <= 0x00)
+ goto yy624;
+ if (yych <= '"')
+ goto yy623;
+ goto yy625;
+ } else {
+ if (yych <= 0xC1)
+ goto yy624;
+ if (yych <= 0xDF)
+ goto yy626;
+ goto yy627;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy629;
+ goto yy628;
+ } else {
+ if (yych <= 0xF0)
+ goto yy630;
+ if (yych <= 0xF3)
+ goto yy631;
+ if (yych <= 0xF4)
+ goto yy632;
+ goto yy624;
+ }
+ }
+ yy658:
+ yyaccept = 2;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 64) {
+ goto yy633;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '\\') {
+ if (yych <= 0x00)
+ goto yy636;
+ if (yych <= '\'')
+ goto yy635;
+ goto yy637;
+ } else {
+ if (yych <= 0xC1)
+ goto yy636;
+ if (yych <= 0xDF)
+ goto yy638;
+ goto yy639;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy641;
+ goto yy640;
+ } else {
+ if (yych <= 0xF0)
+ goto yy642;
+ if (yych <= 0xF3)
+ goto yy643;
+ if (yych <= 0xF4)
+ goto yy644;
+ goto yy636;
+ }
+ }
+ yy659:
+ yyaccept = 3;
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 128) {
+ goto yy645;
+ }
+ if (yych <= 0xE0) {
+ if (yych <= '\\') {
+ if (yych <= '(')
+ goto yy648;
+ if (yych <= ')')
+ goto yy647;
+ goto yy649;
+ } else {
+ if (yych <= 0xC1)
+ goto yy648;
+ if (yych <= 0xDF)
+ goto yy650;
+ goto yy651;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych == 0xED)
+ goto yy653;
+ goto yy652;
+ } else {
+ if (yych <= 0xF0)
+ goto yy654;
+ if (yych <= 0xF3)
+ goto yy655;
+ if (yych <= 0xF4)
+ goto yy656;
+ goto yy648;
+ }
+ }
+ }
+}
+
+// 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 yy661;
+ }
+ ++p;
+ { return 0; }
+ yy661:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy661;
+ }
+ { 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 yy664;
+ ++p;
+ yy663 : { return 0; }
+ yy664:
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 128) {
+ goto yy665;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy663;
+ if (yych <= '\n')
+ goto yy667;
+ goto yy663;
+ } else {
+ if (yych <= '\r')
+ goto yy667;
+ if (yych == '#')
+ goto yy668;
+ goto yy663;
+ }
+ yy665:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy665;
+ }
+ yy666 : { return (bufsize_t)(p - start); }
+ yy667:
+ ++p;
+ goto yy666;
+ yy668:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy665;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy669;
+ if (yych <= '\n')
+ goto yy667;
+ } else {
+ if (yych <= '\r')
+ goto yy667;
+ if (yych == '#')
+ goto yy670;
+ }
+ yy669:
+ p = marker;
+ goto yy663;
+ yy670:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy665;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy669;
+ if (yych <= '\n')
+ goto yy667;
+ goto yy669;
+ } else {
+ if (yych <= '\r')
+ goto yy667;
+ if (yych != '#')
+ goto yy669;
+ }
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy665;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy669;
+ if (yych <= '\n')
+ goto yy667;
+ goto yy669;
+ } else {
+ if (yych <= '\r')
+ goto yy667;
+ if (yych != '#')
+ goto yy669;
+ }
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy665;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy669;
+ if (yych <= '\n')
+ goto yy667;
+ goto yy669;
+ } else {
+ if (yych <= '\r')
+ goto yy667;
+ if (yych != '#')
+ goto yy669;
+ }
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy665;
+ }
+ if (yych <= 0x08)
+ goto yy669;
+ if (yych <= '\n')
+ goto yy667;
+ if (yych == '\r')
+ goto yy667;
+ goto yy669;
+ }
+}
+
+// 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 yy673;
+ if (yych == '=')
+ goto yy674;
+ ++p;
+ yy672 : { return 0; }
+ yy673:
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 64) {
+ goto yy679;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy672;
+ if (yych <= '\n')
+ goto yy676;
+ goto yy672;
+ } else {
+ if (yych <= '\r')
+ goto yy676;
+ if (yych == ' ')
+ goto yy676;
+ goto yy672;
+ }
+ yy674:
+ yych = *(marker = ++p);
+ if (yybm[0 + yych] & 128) {
+ goto yy683;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy672;
+ if (yych <= '\n')
+ goto yy681;
+ goto yy672;
+ } else {
+ if (yych <= '\r')
+ goto yy681;
+ if (yych == ' ')
+ goto yy681;
+ goto yy672;
+ }
+ yy675:
+ yych = *++p;
+ yy676:
+ if (yybm[0 + yych] & 32) {
+ goto yy675;
+ }
+ if (yych <= 0x08)
+ goto yy677;
+ if (yych <= '\n')
+ goto yy678;
+ if (yych == '\r')
+ goto yy678;
+ yy677:
+ p = marker;
+ goto yy672;
+ yy678:
+ ++p;
+ { return 2; }
+ yy679:
+ yych = *++p;
+ if (yybm[0 + yych] & 32) {
+ goto yy675;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy677;
+ if (yych <= '\n')
+ goto yy678;
+ goto yy677;
+ } else {
+ if (yych <= '\r')
+ goto yy678;
+ if (yych == '-')
+ goto yy679;
+ goto yy677;
+ }
+ yy680:
+ yych = *++p;
+ yy681:
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy677;
+ if (yych <= '\t')
+ goto yy680;
+ if (yych >= '\v')
+ goto yy677;
+ } else {
+ if (yych <= '\r')
+ goto yy682;
+ if (yych == ' ')
+ goto yy680;
+ goto yy677;
+ }
+ yy682:
+ ++p;
+ { return 1; }
+ yy683:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy683;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy677;
+ if (yych <= '\t')
+ goto yy680;
+ if (yych <= '\n')
+ goto yy682;
+ goto yy677;
+ } else {
+ if (yych <= '\r')
+ goto yy682;
+ if (yych == ' ')
+ goto yy680;
+ goto yy677;
+ }
+ }
+}
+
+// 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 yy686;
+ if (yych == '~')
+ goto yy687;
+ ++p;
+ yy685 : { return 0; }
+ yy686:
+ yych = *(marker = ++p);
+ if (yych == '`')
+ goto yy688;
+ goto yy685;
+ yy687:
+ yych = *(marker = ++p);
+ if (yych == '~')
+ goto yy690;
+ goto yy685;
+ yy688:
+ yych = *++p;
+ if (yybm[0 + yych] & 16) {
+ goto yy691;
+ }
+ yy689:
+ p = marker;
+ goto yy685;
+ yy690:
+ yych = *++p;
+ if (yybm[0 + yych] & 32) {
+ goto yy692;
+ }
+ goto yy689;
+ yy691:
+ yych = *++p;
+ if (yybm[0 + yych] & 16) {
+ goto yy691;
+ }
+ if (yych <= 0xDF) {
+ if (yych <= '\f') {
+ if (yych <= 0x00)
+ goto yy689;
+ if (yych == '\n') {
+ marker = p;
+ goto yy694;
+ }
+ marker = p;
+ goto yy693;
+ } else {
+ if (yych <= '\r') {
+ marker = p;
+ goto yy694;
+ }
+ if (yych <= 0x7F) {
+ marker = p;
+ goto yy693;
+ }
+ if (yych <= 0xC1)
+ goto yy689;
+ marker = p;
+ goto yy695;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0) {
+ marker = p;
+ goto yy696;
+ }
+ if (yych == 0xED) {
+ marker = p;
+ goto yy698;
+ }
+ marker = p;
+ goto yy697;
+ } else {
+ if (yych <= 0xF0) {
+ marker = p;
+ goto yy699;
+ }
+ if (yych <= 0xF3) {
+ marker = p;
+ goto yy700;
+ }
+ if (yych <= 0xF4) {
+ marker = p;
+ goto yy701;
+ }
+ goto yy689;
+ }
+ }
+ yy692:
+ yych = *++p;
+ if (yybm[0 + yych] & 32) {
+ goto yy692;
+ }
+ if (yych <= 0xDF) {
+ if (yych <= '\f') {
+ if (yych <= 0x00)
+ goto yy689;
+ if (yych == '\n') {
+ marker = p;
+ goto yy703;
+ }
+ marker = p;
+ goto yy702;
+ } else {
+ if (yych <= '\r') {
+ marker = p;
+ goto yy703;
+ }
+ if (yych <= 0x7F) {
+ marker = p;
+ goto yy702;
+ }
+ if (yych <= 0xC1)
+ goto yy689;
+ marker = p;
+ goto yy704;
+ }
+ } else {
+ if (yych <= 0xEF) {
+ if (yych <= 0xE0) {
+ marker = p;
+ goto yy705;
+ }
+ if (yych == 0xED) {
+ marker = p;
+ goto yy707;
+ }
+ marker = p;
+ goto yy706;
+ } else {
+ if (yych <= 0xF0) {
+ marker = p;
+ goto yy708;
+ }
+ if (yych <= 0xF3) {
+ marker = p;
+ goto yy709;
+ }
+ if (yych <= 0xF4) {
+ marker = p;
+ goto yy710;
+ }
+ goto yy689;
+ }
+ }
+ yy693:
+ yych = *++p;
+ if (yybm[0 + yych] & 64) {
+ goto yy693;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy689;
+ if (yych >= 0x0E)
+ goto yy689;
+ } else {
+ if (yych <= 0xDF)
+ goto yy695;
+ if (yych <= 0xE0)
+ goto yy696;
+ goto yy697;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy698;
+ if (yych <= 0xEF)
+ goto yy697;
+ goto yy699;
+ } else {
+ if (yych <= 0xF3)
+ goto yy700;
+ if (yych <= 0xF4)
+ goto yy701;
+ goto yy689;
+ }
+ }
+ yy694:
+ ++p;
+ p = marker;
+ { return (bufsize_t)(p - start); }
+ yy695:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy689;
+ if (yych <= 0xBF)
+ goto yy693;
+ goto yy689;
+ yy696:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy689;
+ if (yych <= 0xBF)
+ goto yy695;
+ goto yy689;
+ yy697:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy689;
+ if (yych <= 0xBF)
+ goto yy695;
+ goto yy689;
+ yy698:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy689;
+ if (yych <= 0x9F)
+ goto yy695;
+ goto yy689;
+ yy699:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy689;
+ if (yych <= 0xBF)
+ goto yy697;
+ goto yy689;
+ yy700:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy689;
+ if (yych <= 0xBF)
+ goto yy697;
+ goto yy689;
+ yy701:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy689;
+ if (yych <= 0x8F)
+ goto yy697;
+ goto yy689;
+ yy702:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy702;
+ }
+ if (yych <= 0xEC) {
+ if (yych <= 0xC1) {
+ if (yych <= 0x00)
+ goto yy689;
+ if (yych >= 0x0E)
+ goto yy689;
+ } else {
+ if (yych <= 0xDF)
+ goto yy704;
+ if (yych <= 0xE0)
+ goto yy705;
+ goto yy706;
+ }
+ } else {
+ if (yych <= 0xF0) {
+ if (yych <= 0xED)
+ goto yy707;
+ if (yych <= 0xEF)
+ goto yy706;
+ goto yy708;
+ } else {
+ if (yych <= 0xF3)
+ goto yy709;
+ if (yych <= 0xF4)
+ goto yy710;
+ goto yy689;
+ }
+ }
+ yy703:
+ ++p;
+ p = marker;
+ { return (bufsize_t)(p - start); }
+ yy704:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy689;
+ if (yych <= 0xBF)
+ goto yy702;
+ goto yy689;
+ yy705:
+ yych = *++p;
+ if (yych <= 0x9F)
+ goto yy689;
+ if (yych <= 0xBF)
+ goto yy704;
+ goto yy689;
+ yy706:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy689;
+ if (yych <= 0xBF)
+ goto yy704;
+ goto yy689;
+ yy707:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy689;
+ if (yych <= 0x9F)
+ goto yy704;
+ goto yy689;
+ yy708:
+ yych = *++p;
+ if (yych <= 0x8F)
+ goto yy689;
+ if (yych <= 0xBF)
+ goto yy706;
+ goto yy689;
+ yy709:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy689;
+ if (yych <= 0xBF)
+ goto yy706;
+ goto yy689;
+ yy710:
+ yych = *++p;
+ if (yych <= 0x7F)
+ goto yy689;
+ if (yych <= 0x8F)
+ goto yy706;
+ goto yy689;
+ }
+}
+
+// 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 yy713;
+ if (yych == '~')
+ goto yy714;
+ ++p;
+ yy712 : { return 0; }
+ yy713:
+ yych = *(marker = ++p);
+ if (yych == '`')
+ goto yy715;
+ goto yy712;
+ yy714:
+ yych = *(marker = ++p);
+ if (yych == '~')
+ goto yy717;
+ goto yy712;
+ yy715:
+ yych = *++p;
+ if (yybm[0 + yych] & 32) {
+ goto yy718;
+ }
+ yy716:
+ p = marker;
+ goto yy712;
+ yy717:
+ yych = *++p;
+ if (yybm[0 + yych] & 64) {
+ goto yy719;
+ }
+ goto yy716;
+ yy718:
+ yych = *++p;
+ if (yybm[0 + yych] & 32) {
+ goto yy718;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy716;
+ if (yych <= '\t') {
+ marker = p;
+ goto yy720;
+ }
+ if (yych <= '\n') {
+ marker = p;
+ goto yy721;
+ }
+ goto yy716;
+ } else {
+ if (yych <= '\r') {
+ marker = p;
+ goto yy721;
+ }
+ if (yych == ' ') {
+ marker = p;
+ goto yy720;
+ }
+ goto yy716;
+ }
+ yy719:
+ yych = *++p;
+ if (yybm[0 + yych] & 64) {
+ goto yy719;
+ }
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy716;
+ if (yych <= '\t') {
+ marker = p;
+ goto yy722;
+ }
+ if (yych <= '\n') {
+ marker = p;
+ goto yy723;
+ }
+ goto yy716;
+ } else {
+ if (yych <= '\r') {
+ marker = p;
+ goto yy723;
+ }
+ if (yych == ' ') {
+ marker = p;
+ goto yy722;
+ }
+ goto yy716;
+ }
+ yy720:
+ yych = *++p;
+ if (yybm[0 + yych] & 128) {
+ goto yy720;
+ }
+ if (yych <= 0x08)
+ goto yy716;
+ if (yych <= '\n')
+ goto yy721;
+ if (yych != '\r')
+ goto yy716;
+ yy721:
+ ++p;
+ p = marker;
+ { return (bufsize_t)(p - start); }
+ yy722:
+ yych = *++p;
+ if (yych <= '\f') {
+ if (yych <= 0x08)
+ goto yy716;
+ if (yych <= '\t')
+ goto yy722;
+ if (yych >= '\v')
+ goto yy716;
+ } else {
+ if (yych <= '\r')
+ goto yy723;
+ if (yych == ' ')
+ goto yy722;
+ goto yy716;
+ }
+ yy723:
+ ++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 yy726;
+ ++p;
+ yy725 : { return 0; }
+ yy726:
+ yych = *(marker = ++p);
+ if (yych <= '@') {
+ if (yych != '#')
+ goto yy725;
+ } else {
+ if (yych <= 'Z')
+ goto yy728;
+ if (yych <= '`')
+ goto yy725;
+ if (yych <= 'z')
+ goto yy728;
+ goto yy725;
+ }
+ yych = *++p;
+ if (yych <= 'W') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy729;
+ } else {
+ if (yych <= 'X')
+ goto yy730;
+ if (yych == 'x')
+ goto yy730;
+ }
+ yy727:
+ p = marker;
+ goto yy725;
+ yy728:
+ yych = *++p;
+ if (yych <= '@') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy731;
+ goto yy727;
+ } else {
+ if (yych <= 'Z')
+ goto yy731;
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'z')
+ goto yy731;
+ goto yy727;
+ }
+ yy729:
+ yych = *++p;
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy732;
+ if (yych == ';')
+ goto yy733;
+ goto yy727;
+ yy730:
+ yych = *++p;
+ if (yych <= '@') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy734;
+ goto yy727;
+ } else {
+ if (yych <= 'F')
+ goto yy734;
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'f')
+ goto yy734;
+ goto yy727;
+ }
+ yy731:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy735;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy735;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'z')
+ goto yy735;
+ goto yy727;
+ }
+ }
+ yy732:
+ yych = *++p;
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy736;
+ if (yych != ';')
+ goto yy727;
+ yy733:
+ ++p;
+ { return (bufsize_t)(p - start); }
+ yy734:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy737;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'F') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy737;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'f')
+ goto yy737;
+ goto yy727;
+ }
+ }
+ yy735:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy738;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy738;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'z')
+ goto yy738;
+ goto yy727;
+ }
+ }
+ yy736:
+ yych = *++p;
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy739;
+ if (yych == ';')
+ goto yy733;
+ goto yy727;
+ yy737:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy740;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'F') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy740;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'f')
+ goto yy740;
+ goto yy727;
+ }
+ }
+ yy738:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy741;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy741;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'z')
+ goto yy741;
+ goto yy727;
+ }
+ }
+ yy739:
+ yych = *++p;
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy742;
+ if (yych == ';')
+ goto yy733;
+ goto yy727;
+ yy740:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy743;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'F') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy743;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'f')
+ goto yy743;
+ goto yy727;
+ }
+ }
+ yy741:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy744;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy744;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'z')
+ goto yy744;
+ goto yy727;
+ }
+ }
+ yy742:
+ yych = *++p;
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy745;
+ if (yych == ';')
+ goto yy733;
+ goto yy727;
+ yy743:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy746;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'F') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy746;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'f')
+ goto yy746;
+ goto yy727;
+ }
+ }
+ yy744:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy747;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy747;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'z')
+ goto yy747;
+ goto yy727;
+ }
+ }
+ yy745:
+ yych = *++p;
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy748;
+ if (yych == ';')
+ goto yy733;
+ goto yy727;
+ yy746:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy748;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'F') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy748;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'f')
+ goto yy748;
+ goto yy727;
+ }
+ }
+ yy747:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy749;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy749;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'z')
+ goto yy749;
+ goto yy727;
+ }
+ }
+ yy748:
+ yych = *++p;
+ if (yych == ';')
+ goto yy733;
+ goto yy727;
+ yy749:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy750;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy750:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy751;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy751:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy752;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy752:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy753;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy753:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy754;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy754:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy755;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy755:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy756;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy756:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy757;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy757:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy758;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy758:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy759;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy759:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy760;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy760:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy761;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy761:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy762;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy762:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy763;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy763:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy764;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy764:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy765;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy765:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy766;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy766:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy767;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy767:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy768;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy768:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy769;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy769:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy770;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy770:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy771;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy771:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy772;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych >= '{')
+ goto yy727;
+ }
+ }
+ yy772:
+ yych = *++p;
+ if (yych <= ';') {
+ if (yych <= '/')
+ goto yy727;
+ if (yych <= '9')
+ goto yy748;
+ if (yych <= ':')
+ goto yy727;
+ goto yy733;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@')
+ goto yy727;
+ goto yy748;
+ } else {
+ if (yych <= '`')
+ goto yy727;
+ if (yych <= 'z')
+ goto yy748;
+ goto yy727;
+ }
+ }
+ }
+}
+
+// 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 yy775;
+ if (yych >= 'F')
+ goto yy776;
+ } else {
+ if (yych == 'J')
+ goto yy777;
+ if (yych >= 'V')
+ goto yy778;
+ }
+ } else {
+ if (yych <= 'f') {
+ if (yych == 'd')
+ goto yy775;
+ if (yych >= 'f')
+ goto yy776;
+ } else {
+ if (yych <= 'j') {
+ if (yych >= 'j')
+ goto yy777;
+ } else {
+ if (yych == 'v')
+ goto yy778;
+ }
+ }
+ }
+ ++p;
+ yy774 : { return 0; }
+ yy775:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych == 'A')
+ goto yy779;
+ if (yych == 'a')
+ goto yy779;
+ goto yy774;
+ yy776:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych == 'I')
+ goto yy781;
+ if (yych == 'i')
+ goto yy781;
+ goto yy774;
+ yy777:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych == 'A')
+ goto yy782;
+ if (yych == 'a')
+ goto yy782;
+ goto yy774;
+ yy778:
+ yyaccept = 0;
+ yych = *(marker = ++p);
+ if (yych == 'B')
+ goto yy783;
+ if (yych == 'b')
+ goto yy783;
+ goto yy774;
+ yy779:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy784;
+ if (yych == 't')
+ goto yy784;
+ yy780:
+ p = marker;
+ if (yyaccept == 0) {
+ goto yy774;
+ } else {
+ goto yy792;
+ }
+ yy781:
+ yych = *++p;
+ if (yych == 'L')
+ goto yy785;
+ if (yych == 'l')
+ goto yy785;
+ goto yy780;
+ yy782:
+ yych = *++p;
+ if (yych == 'V')
+ goto yy786;
+ if (yych == 'v')
+ goto yy786;
+ goto yy780;
+ yy783:
+ yych = *++p;
+ if (yych == 'S')
+ goto yy787;
+ if (yych == 's')
+ goto yy787;
+ goto yy780;
+ yy784:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy788;
+ if (yych == 'a')
+ goto yy788;
+ goto yy780;
+ yy785:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy789;
+ if (yych == 'e')
+ goto yy789;
+ goto yy780;
+ yy786:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy783;
+ if (yych == 'a')
+ goto yy783;
+ goto yy780;
+ yy787:
+ yych = *++p;
+ if (yych == 'C')
+ goto yy790;
+ if (yych == 'c')
+ goto yy790;
+ goto yy780;
+ yy788:
+ yych = *++p;
+ if (yych == ':')
+ goto yy791;
+ goto yy780;
+ yy789:
+ yych = *++p;
+ if (yych == ':')
+ goto yy793;
+ goto yy780;
+ yy790:
+ yych = *++p;
+ if (yych == 'R')
+ goto yy794;
+ if (yych == 'r')
+ goto yy794;
+ goto yy780;
+ yy791:
+ yyaccept = 1;
+ yych = *(marker = ++p);
+ if (yych == 'I')
+ goto yy795;
+ if (yych == 'i')
+ goto yy795;
+ yy792 : { return (bufsize_t)(p - start); }
+ yy793:
+ ++p;
+ goto yy792;
+ yy794:
+ yych = *++p;
+ if (yych == 'I')
+ goto yy796;
+ if (yych == 'i')
+ goto yy796;
+ goto yy780;
+ yy795:
+ yych = *++p;
+ if (yych == 'M')
+ goto yy797;
+ if (yych == 'm')
+ goto yy797;
+ goto yy780;
+ yy796:
+ yych = *++p;
+ if (yych == 'P')
+ goto yy798;
+ if (yych == 'p')
+ goto yy798;
+ goto yy780;
+ yy797:
+ yych = *++p;
+ if (yych == 'A')
+ goto yy799;
+ if (yych == 'a')
+ goto yy799;
+ goto yy780;
+ yy798:
+ yych = *++p;
+ if (yych == 'T')
+ goto yy789;
+ if (yych == 't')
+ goto yy789;
+ goto yy780;
+ yy799:
+ yych = *++p;
+ if (yych == 'G')
+ goto yy800;
+ if (yych != 'g')
+ goto yy780;
+ yy800:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy801;
+ if (yych != 'e')
+ goto yy780;
+ yy801:
+ yych = *++p;
+ if (yych != '/')
+ goto yy780;
+ yych = *++p;
+ if (yych <= 'W') {
+ if (yych <= 'J') {
+ if (yych == 'G')
+ goto yy802;
+ if (yych <= 'I')
+ goto yy780;
+ goto yy803;
+ } else {
+ if (yych == 'P')
+ goto yy804;
+ if (yych <= 'V')
+ goto yy780;
+ goto yy805;
+ }
+ } else {
+ if (yych <= 'j') {
+ if (yych == 'g')
+ goto yy802;
+ if (yych <= 'i')
+ goto yy780;
+ goto yy803;
+ } else {
+ if (yych <= 'p') {
+ if (yych <= 'o')
+ goto yy780;
+ goto yy804;
+ } else {
+ if (yych == 'w')
+ goto yy805;
+ goto yy780;
+ }
+ }
+ }
+ yy802:
+ yych = *++p;
+ if (yych == 'I')
+ goto yy806;
+ if (yych == 'i')
+ goto yy806;
+ goto yy780;
+ yy803:
+ yych = *++p;
+ if (yych == 'P')
+ goto yy807;
+ if (yych == 'p')
+ goto yy807;
+ goto yy780;
+ yy804:
+ yych = *++p;
+ if (yych == 'N')
+ goto yy808;
+ if (yych == 'n')
+ goto yy808;
+ goto yy780;
+ yy805:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy809;
+ if (yych == 'e')
+ goto yy809;
+ goto yy780;
+ yy806:
+ yych = *++p;
+ if (yych == 'F')
+ goto yy810;
+ if (yych == 'f')
+ goto yy810;
+ goto yy780;
+ yy807:
+ yych = *++p;
+ if (yych == 'E')
+ goto yy808;
+ if (yych != 'e')
+ goto yy780;
+ yy808:
+ yych = *++p;
+ if (yych == 'G')
+ goto yy810;
+ if (yych == 'g')
+ goto yy810;
+ goto yy780;
+ yy809:
+ yych = *++p;
+ if (yych == 'B')
+ goto yy811;
+ if (yych == 'b')
+ goto yy811;
+ goto yy780;
+ yy810:
+ ++p;
+ { return 0; }
+ yy811:
+ yych = *++p;
+ if (yych == 'P')
+ goto yy810;
+ if (yych == 'p')
+ goto yy810;
+ goto yy780;
+ }
+}
diff --git a/deps/cmark/src/scanners.h b/deps/cmark/src/scanners.h
new file mode 100644
index 0000000..92f654d
--- /dev/null
+++ b/deps/cmark/src/scanners.h
@@ -0,0 +1,61 @@
+#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_comment(const unsigned char *p);
+bufsize_t _scan_html_pi(const unsigned char *p);
+bufsize_t _scan_html_declaration(const unsigned char *p);
+bufsize_t _scan_html_cdata(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_comment(c, n) _scan_at(&_scan_html_comment, c, n)
+#define scan_html_pi(c, n) _scan_at(&_scan_html_pi, c, n)
+#define scan_html_declaration(c, n) _scan_at(&_scan_html_declaration, c, n)
+#define scan_html_cdata(c, n) _scan_at(&_scan_html_cdata, 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/deps/cmark/src/scanners.re b/deps/cmark/src/scanners.re
new file mode 100644
index 0000000..c7dd4f5
--- /dev/null
+++ b/deps/cmark/src/scanners.re
@@ -0,0 +1,344 @@
+#include
+#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-] | "--" [^\x00>])* "-->";
+
+ processinginstruction = ([^?>\x00]+ | [?][^>\x00] | [>])+;
+
+ declaration = [A-Z]+ [^>\x00]*;
+
+ cdata = "CDATA[" ([^\]\x00]+ | "]" [^\]\x00] | "]]" [^>\x00])*;
+
+ htmltag = opentag | closetag;
+
+ 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; }
+*/
+}
+
+bufsize_t _scan_html_comment(const unsigned char *p)
+{
+ const unsigned char *marker = NULL;
+ const unsigned char *start = p;
+/*!re2c
+ htmlcomment { return (bufsize_t)(p - start); }
+ * { return 0; }
+*/
+}
+
+bufsize_t _scan_html_pi(const unsigned char *p)
+{
+ const unsigned char *marker = NULL;
+ const unsigned char *start = p;
+/*!re2c
+ processinginstruction { return (bufsize_t)(p - start); }
+ * { return 0; }
+*/
+}
+
+bufsize_t _scan_html_declaration(const unsigned char *p)
+{
+ const unsigned char *marker = NULL;
+ const unsigned char *start = p;
+/*!re2c
+ declaration { return (bufsize_t)(p - start); }
+ * { return 0; }
+*/
+}
+
+bufsize_t _scan_html_cdata(const unsigned char *p)
+{
+ const unsigned char *marker = NULL;
+ const unsigned char *start = p;
+/*!re2c
+ cdata { 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'|'textarea'|'style') (spacechar | [>]) { return 1; }
+ '' { 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/deps/cmark/src/utf8.c b/deps/cmark/src/utf8.c
new file mode 100644
index 0000000..c29bbf7
--- /dev/null
+++ b/deps/cmark/src/utf8.c
@@ -0,0 +1,317 @@
+#include
+#include
+#include
+
+#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/deps/cmark/src/utf8.h b/deps/cmark/src/utf8.h
new file mode 100644
index 0000000..8e45714
--- /dev/null
+++ b/deps/cmark/src/utf8.h
@@ -0,0 +1,24 @@
+#ifndef CMARK_UTF8_H
+#define CMARK_UTF8_H
+
+#include
+#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/deps/cmark/src/xml.c b/deps/cmark/src/xml.c
new file mode 100644
index 0000000..45589b9
--- /dev/null
+++ b/deps/cmark/src/xml.c
@@ -0,0 +1,229 @@
+#include
+#include
+#include
+#include
+
+#include "config.h"
+#include "cmark.h"
+#include "node.h"
+#include "buffer.h"
+
+#define BUFFER_SIZE 100
+#define MAX_INDENT 40
+
+// Functions to convert cmark_nodes to XML strings.
+
+// C0 control characters, U+FFFE and U+FFF aren't allowed in XML.
+static const char XML_ESCAPE_TABLE[256] = {
+ /* 0x00 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1,
+ /* 0x10 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ /* 0x20 */ 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x30 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0,
+ /* 0x40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xA0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xB0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,
+ /* 0xC0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xD0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xE0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xF0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+// U+FFFD Replacement Character encoded in UTF-8
+#define UTF8_REPL "\xEF\xBF\xBD"
+
+static const char *XML_ESCAPES[] = {
+ "", UTF8_REPL, """, "&", "<", ">"
+};
+
+static void escape_xml(cmark_strbuf *ob, const unsigned char *src,
+ bufsize_t size) {
+ bufsize_t i = 0, org, esc = 0;
+
+ while (i < size) {
+ org = i;
+ while (i < size && (esc = XML_ESCAPE_TABLE[src[i]]) == 0)
+ i++;
+
+ if (i > org)
+ cmark_strbuf_put(ob, src + org, i - org);
+
+ if (i >= size)
+ break;
+
+ if (esc == 9) {
+ // To replace U+FFFE and U+FFFF with U+FFFD, only the last byte has to
+ // be changed.
+ // We know that src[i] is 0xBE or 0xBF.
+ if (i >= 2 && src[i-2] == 0xEF && src[i-1] == 0xBF) {
+ cmark_strbuf_putc(ob, 0xBD);
+ } else {
+ cmark_strbuf_putc(ob, src[i]);
+ }
+ } else {
+ cmark_strbuf_puts(ob, XML_ESCAPES[esc]);
+ }
+
+ i++;
+ }
+}
+
+static void escape_xml_str(cmark_strbuf *dest, const unsigned char *source) {
+ if (source)
+ escape_xml(dest, source, strlen((char *)source));
+}
+
+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 < MAX_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_str(xml, 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_str(xml, node->as.custom.on_enter);
+ cmark_strbuf_putc(xml, '"');
+ cmark_strbuf_puts(xml, " on_exit=\"");
+ escape_xml_str(xml, 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_str(xml, node->as.link.url);
+ cmark_strbuf_putc(xml, '"');
+ if (node->as.link.title) {
+ cmark_strbuf_puts(xml, " title=\"");
+ escape_xml_str(xml, 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, "\n");
+ cmark_strbuf_puts(state.xml,
+ "\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;
+}
diff --git a/deps/cmark/test/CMakeLists.txt b/deps/cmark/test/CMakeLists.txt
new file mode 100755
index 0000000..5c07fb7
--- /dev/null
+++ b/deps/cmark/test/CMakeLists.txt
@@ -0,0 +1,80 @@
+# To get verbose output: cmake --build build --target "test" -- ARGS='-V'
+
+# By default, we run the spec tests only if python3 is available.
+# To require the spec tests, compile with -DSPEC_TESTS=1
+
+if (SPEC_TESTS)
+ find_package(PythonInterp 3 REQUIRED)
+else(SPEC_TESTS)
+ find_package(PythonInterp 3)
+endif(SPEC_TESTS)
+
+if (CMARK_SHARED OR CMARK_STATIC)
+ add_test(NAME api_test COMMAND api_test)
+endif()
+
+if (WIN32)
+ file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR}/src WIN_DLL_DIR)
+ set(NEWPATH "${WIN_DLL_DIR};$ENV{PATH}")
+ string(REPLACE ";" "\\;" NEWPATH "${NEWPATH}")
+ set_tests_properties(api_test PROPERTIES ENVIRONMENT "PATH=${NEWPATH}")
+ set(ROUNDTRIP "${CMAKE_CURRENT_SOURCE_DIR}/roundtrip.bat")
+else(WIN32)
+ set(ROUNDTRIP "${CMAKE_CURRENT_SOURCE_DIR}/roundtrip.sh")
+endif(WIN32)
+
+IF (PYTHONINTERP_FOUND)
+
+ add_test(html_normalization
+ ${PYTHON_EXECUTABLE} "-m" "doctest"
+ "${CMAKE_CURRENT_SOURCE_DIR}/normalize.py"
+ )
+
+ if (CMARK_SHARED)
+ add_test(spectest_library
+ ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/spec_tests.py" "--no-normalize" "--spec"
+ "${CMAKE_CURRENT_SOURCE_DIR}/spec.txt" "--library-dir" "${CMAKE_CURRENT_BINARY_DIR}/../src"
+ )
+
+ add_test(pathological_tests_library
+ ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/pathological_tests.py"
+ "--library-dir" "${CMAKE_CURRENT_BINARY_DIR}/../src"
+ )
+
+ add_test(roundtriptest_library
+ ${PYTHON_EXECUTABLE}
+ "${CMAKE_CURRENT_SOURCE_DIR}/roundtrip_tests.py"
+ "--spec" "${CMAKE_CURRENT_SOURCE_DIR}/spec.txt"
+ "--library-dir" "${CMAKE_CURRENT_BINARY_DIR}/../src"
+ )
+
+ add_test(entity_library
+ ${PYTHON_EXECUTABLE}
+ "${CMAKE_CURRENT_SOURCE_DIR}/entity_tests.py"
+ "--library-dir" "${CMAKE_CURRENT_BINARY_DIR}/../src"
+ )
+ endif()
+
+ add_test(spectest_executable
+ ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/spec_tests.py" "--no-normalize" "--spec" "${CMAKE_CURRENT_SOURCE_DIR}/spec.txt" "--program" "${CMAKE_CURRENT_BINARY_DIR}/../src/cmark"
+ )
+
+ add_test(smartpuncttest_executable
+ ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/spec_tests.py" "--no-normalize" "--spec" "${CMAKE_CURRENT_SOURCE_DIR}/smart_punct.txt" "--program" "${CMAKE_CURRENT_BINARY_DIR}/../src/cmark --smart"
+ )
+
+ add_test(regressiontest_executable
+ ${PYTHON_EXECUTABLE}
+ "${CMAKE_CURRENT_SOURCE_DIR}/spec_tests.py" "--no-normalize" "--spec"
+ "${CMAKE_CURRENT_SOURCE_DIR}/regression.txt" "--program"
+ "${CMAKE_CURRENT_BINARY_DIR}/../src/cmark"
+ )
+
+ELSE(PYTHONINTERP_FOUND)
+
+ message("\n*** A python 3 interpreter is required to run the spec tests.\n")
+ add_test(skipping_spectests
+ echo "Skipping spec tests, because no python 3 interpreter is available.")
+
+ENDIF(PYTHONINTERP_FOUND)
+
diff --git a/deps/cmark/test/afl_test_cases/test.md b/deps/cmark/test/afl_test_cases/test.md
new file mode 100644
index 0000000..27eee00
--- /dev/null
+++ b/deps/cmark/test/afl_test_cases/test.md
@@ -0,0 +1,36 @@
+# H1
+
+H2
+--
+
+t ☺
+*b* **em** `c`
+≥\&\
+\_e\_
+
+4) I1
+
+5) I2
+ > [l](/u "t")
+ >
+ > - [f]
+ > - 
+ >
+ >>
+ >>
+
+~~~ l☺
+cb
+~~~
+
+ c1
+ c2
+
+***
+
+
+x
+
+
+[f]: /u "t"
+
diff --git a/deps/cmark/test/cmark-fuzz.c b/deps/cmark/test/cmark-fuzz.c
new file mode 100644
index 0000000..b078e3d
--- /dev/null
+++ b/deps/cmark/test/cmark-fuzz.c
@@ -0,0 +1,33 @@
+#include
+#include
+#include
+#include "cmark.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ struct __attribute__((packed)) {
+ int options;
+ int width;
+ } fuzz_config;
+
+ if (size >= sizeof(fuzz_config)) {
+ /* The beginning of `data` is treated as fuzzer configuration */
+ memcpy(&fuzz_config, data, sizeof(fuzz_config));
+
+ /* Mask off valid option bits */
+ fuzz_config.options &= (CMARK_OPT_SOURCEPOS | CMARK_OPT_HARDBREAKS | CMARK_OPT_UNSAFE | CMARK_OPT_NOBREAKS | CMARK_OPT_NORMALIZE | CMARK_OPT_VALIDATE_UTF8 | CMARK_OPT_SMART);
+
+ /* Remainder of input is the markdown */
+ const char *markdown = (const char *)(data + sizeof(fuzz_config));
+ const size_t markdown_size = size - sizeof(fuzz_config);
+ cmark_node *doc = cmark_parse_document(markdown, markdown_size, fuzz_config.options);
+
+ free(cmark_render_commonmark(doc, fuzz_config.options, fuzz_config.width));
+ free(cmark_render_html(doc, fuzz_config.options));
+ free(cmark_render_latex(doc, fuzz_config.options, fuzz_config.width));
+ free(cmark_render_man(doc, fuzz_config.options, fuzz_config.width));
+ free(cmark_render_xml(doc, fuzz_config.options));
+
+ cmark_node_free(doc);
+ }
+ return 0;
+}
diff --git a/deps/cmark/test/cmark.py b/deps/cmark/test/cmark.py
new file mode 100644
index 0000000..38d2f59
--- /dev/null
+++ b/deps/cmark/test/cmark.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from ctypes import CDLL, c_char_p, c_size_t, c_int, c_void_p
+from subprocess import *
+import platform
+import os
+
+def pipe_through_prog(prog, text):
+ p1 = Popen(prog.split(), stdout=PIPE, stdin=PIPE, stderr=PIPE)
+ [result, err] = p1.communicate(input=text.encode('utf-8'))
+ return [p1.returncode, result.decode('utf-8'), err]
+
+def to_html(lib, text):
+ markdown = lib.cmark_markdown_to_html
+ markdown.restype = c_char_p
+ markdown.argtypes = [c_char_p, c_size_t, c_int]
+ textbytes = text.encode('utf-8')
+ textlen = len(textbytes)
+ # 1 << 17 == CMARK_OPT_UNSAFE
+ result = markdown(textbytes, textlen, 1 << 17).decode('utf-8')
+ return [0, result, '']
+
+def to_commonmark(lib, text):
+ textbytes = text.encode('utf-8')
+ textlen = len(textbytes)
+ parse_document = lib.cmark_parse_document
+ parse_document.restype = c_void_p
+ parse_document.argtypes = [c_char_p, c_size_t, c_int]
+ render_commonmark = lib.cmark_render_commonmark
+ render_commonmark.restype = c_char_p
+ render_commonmark.argtypes = [c_void_p, c_int, c_int]
+ node = parse_document(textbytes, textlen, 0)
+ result = render_commonmark(node, 0, 0).decode('utf-8')
+ return [0, result, '']
+
+class CMark:
+ def __init__(self, prog=None, library_dir=None):
+ self.prog = prog
+ if prog:
+ prog += ' --unsafe'
+ self.to_html = lambda x: pipe_through_prog(prog, x)
+ self.to_commonmark = lambda x: pipe_through_prog(prog + ' -t commonmark', x)
+ else:
+ sysname = platform.system()
+ if sysname == 'Darwin':
+ libnames = [ "libcmark.dylib" ]
+ elif sysname == 'Windows':
+ libnames = [ "cmark.dll", "libcmark.dll" ]
+ else:
+ libnames = [ "libcmark.so" ]
+ if not library_dir:
+ library_dir = os.path.join("build", "src")
+ for libname in libnames:
+ candidate = os.path.join(library_dir, libname)
+ if os.path.isfile(candidate):
+ libpath = candidate
+ break
+ cmark = CDLL(libpath)
+ self.to_html = lambda x: to_html(cmark, x)
+ self.to_commonmark = lambda x: to_commonmark(cmark, x)
+
diff --git a/deps/cmark/test/entity_tests.py b/deps/cmark/test/entity_tests.py
new file mode 100644
index 0000000..27b70e6
--- /dev/null
+++ b/deps/cmark/test/entity_tests.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+import re
+import os
+import argparse
+import sys
+import platform
+import html
+from cmark import CMark
+
+def get_entities():
+ regex = r'^{\(unsigned char\*\)"([^"]+)", \{([^}]+)\}'
+ with open(os.path.join(os.path.dirname(__file__), '..', 'src', 'entities.inc')) as f:
+ code = f.read()
+ entities = []
+ for entity, utf8 in re.findall(regex, code, re.MULTILINE):
+ utf8 = bytes(map(int, utf8.split(", ")[:-1])).decode('utf-8')
+ entities.append((entity, utf8))
+ return entities
+
+parser = argparse.ArgumentParser(description='Run cmark tests.')
+parser.add_argument('--program', dest='program', nargs='?', default=None,
+ help='program to test')
+parser.add_argument('--library-dir', dest='library_dir', nargs='?',
+ default=None, help='directory containing dynamic library')
+args = parser.parse_args(sys.argv[1:])
+
+cmark = CMark(prog=args.program, library_dir=args.library_dir)
+
+entities = get_entities()
+
+passed = 0
+errored = 0
+failed = 0
+
+exceptions = {
+ 'quot': '"',
+ 'QUOT': '"',
+
+ # These are broken, but I'm not too worried about them.
+ 'nvlt': '<⃒',
+ 'nvgt': '>⃒',
+}
+
+print("Testing entities:")
+for entity, utf8 in entities:
+ [rc, actual, err] = cmark.to_html("&{};".format(entity))
+ check = exceptions.get(entity, utf8)
+
+ if rc != 0:
+ errored += 1
+ print(entity, '[ERRORED (return code {})]'.format(rc))
+ print(err)
+ elif check in actual:
+ # print(entity, '[PASSED]') # omit noisy success output
+ passed += 1
+ else:
+ print(entity, '[FAILED]')
+ print(repr(actual))
+ failed += 1
+
+print("{} passed, {} failed, {} errored".format(passed, failed, errored))
+if failed == 0 and errored == 0:
+ exit(0)
+else:
+ exit(1)
diff --git a/deps/cmark/test/fuzzing_dictionary b/deps/cmark/test/fuzzing_dictionary
new file mode 100644
index 0000000..b06783c
--- /dev/null
+++ b/deps/cmark/test/fuzzing_dictionary
@@ -0,0 +1,49 @@
+asterisk="*"
+attr_generic=" a=\"1\""
+attr_href=" href=\"1\""
+attr_xml_lang=" xml:lang=\"1\""
+attr_xmlns=" xmlns=\"1\""
+backslash="\\"
+backtick="`"
+colon=":"
+dashes="---"
+double_quote="\""
+entity_builtin="<"
+entity_decimal=""
+entity_external="&a;"
+entity_hex=""
+equals="==="
+exclamation="!"
+greater_than=">"
+hash="#"
+hyphen="-"
+indent=" "
+left_bracket="["
+left_paren="("
+less_than="<"
+plus="+"
+right_bracket="]"
+right_paren=")"
+single_quote="'"
+string_any="ANY"
+string_brackets="[]"
+string_cdata="CDATA"
+string_dashes="--"
+string_empty_dblquotes="\"\""
+string_empty_quotes="''"
+string_idrefs="IDREFS"
+string_parentheses="()"
+string_pcdata="#PCDATA"
+tag_cdata=""
+tag_doctype=""
+tag_open_close=""
+tag_open_exclamation=""
+tag_xml_q=""
+underscore="_"
diff --git a/deps/cmark/test/normalize.py b/deps/cmark/test/normalize.py
new file mode 100644
index 0000000..f8ece18
--- /dev/null
+++ b/deps/cmark/test/normalize.py
@@ -0,0 +1,194 @@
+# -*- coding: utf-8 -*-
+from html.parser import HTMLParser
+import urllib
+
+try:
+ from html.parser import HTMLParseError
+except ImportError:
+ # HTMLParseError was removed in Python 3.5. It could never be
+ # thrown, so we define a placeholder instead.
+ class HTMLParseError(Exception):
+ pass
+
+from html.entities import name2codepoint
+import sys
+import re
+import html
+
+# Normalization code, adapted from
+# https://github.com/karlcow/markdown-testsuite/
+significant_attrs = ["alt", "href", "src", "title"]
+whitespace_re = re.compile('\s+')
+class MyHTMLParser(HTMLParser):
+ def __init__(self):
+ HTMLParser.__init__(self)
+ self.convert_charrefs = False
+ self.last = "starttag"
+ self.in_pre = False
+ self.output = ""
+ self.last_tag = ""
+ def handle_data(self, data):
+ after_tag = self.last == "endtag" or self.last == "starttag"
+ after_block_tag = after_tag and self.is_block_tag(self.last_tag)
+ if after_tag and self.last_tag == "br":
+ data = data.lstrip('\n')
+ if not self.in_pre:
+ data = whitespace_re.sub(' ', data)
+ if after_block_tag and not self.in_pre:
+ if self.last == "starttag":
+ data = data.lstrip()
+ elif self.last == "endtag":
+ data = data.strip()
+ self.output += data
+ self.last = "data"
+ def handle_endtag(self, tag):
+ if tag == "pre":
+ self.in_pre = False
+ elif self.is_block_tag(tag):
+ self.output = self.output.rstrip()
+ self.output += "" + tag + ">"
+ self.last_tag = tag
+ self.last = "endtag"
+ def handle_starttag(self, tag, attrs):
+ if tag == "pre":
+ self.in_pre = True
+ if self.is_block_tag(tag):
+ self.output = self.output.rstrip()
+ self.output += "<" + tag
+ # For now we don't strip out 'extra' attributes, because of
+ # raw HTML test cases.
+ # attrs = filter(lambda attr: attr[0] in significant_attrs, attrs)
+ if attrs:
+ attrs.sort()
+ for (k,v) in attrs:
+ self.output += " " + k
+ if v in ['href','src']:
+ self.output += ("=" + '"' +
+ urllib.quote(urllib.unquote(v), safe='/') + '"')
+ elif v != None:
+ self.output += ("=" + '"' + html.escape(v,quote=True) + '"')
+ self.output += ">"
+ self.last_tag = tag
+ self.last = "starttag"
+ def handle_startendtag(self, tag, attrs):
+ """Ignore closing tag for self-closing """
+ self.handle_starttag(tag, attrs)
+ self.last_tag = tag
+ self.last = "endtag"
+ def handle_comment(self, data):
+ self.output += ''
+ self.last = "comment"
+ def handle_decl(self, data):
+ self.output += ''
+ self.last = "decl"
+ def unknown_decl(self, data):
+ self.output += ''
+ self.last = "decl"
+ def handle_pi(self,data):
+ self.output += '' + data + '>'
+ self.last = "pi"
+ def handle_entityref(self, name):
+ try:
+ c = chr(name2codepoint[name])
+ except KeyError:
+ c = None
+ self.output_char(c, '&' + name + ';')
+ self.last = "ref"
+ def handle_charref(self, name):
+ try:
+ if name.startswith("x"):
+ c = chr(int(name[1:], 16))
+ else:
+ c = chr(int(name))
+ except ValueError:
+ c = None
+ self.output_char(c, '&' + name + ';')
+ self.last = "ref"
+ # Helpers.
+ def output_char(self, c, fallback):
+ if c == '<':
+ self.output += "<"
+ elif c == '>':
+ self.output += ">"
+ elif c == '&':
+ self.output += "&"
+ elif c == '"':
+ self.output += """
+ elif c == None:
+ self.output += fallback
+ else:
+ self.output += c
+
+ def is_block_tag(self,tag):
+ return (tag in ['article', 'header', 'aside', 'hgroup', 'blockquote',
+ 'hr', 'iframe', 'body', 'li', 'map', 'button', 'object', 'canvas',
+ 'ol', 'caption', 'output', 'col', 'p', 'colgroup', 'pre', 'dd',
+ 'progress', 'div', 'section', 'dl', 'table', 'td', 'dt',
+ 'tbody', 'embed', 'textarea', 'fieldset', 'tfoot', 'figcaption',
+ 'th', 'figure', 'thead', 'footer', 'tr', 'form', 'ul',
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'video', 'script', 'style'])
+
+def normalize_html(html):
+ r"""
+ Return normalized form of HTML which ignores insignificant output
+ differences:
+
+ Multiple inner whitespaces are collapsed to a single space (except
+ in pre tags):
+
+ >>> normalize_html("a \t b
")
+ 'a b
'
+
+ >>> normalize_html("a \t\nb
")
+ 'a b
'
+
+ * Whitespace surrounding block-level tags is removed.
+
+ >>> normalize_html("a b
")
+ 'a b
'
+
+ >>> normalize_html(" a b
")
+ 'a b
'
+
+ >>> normalize_html("a b
")
+ 'a b
'
+
+ >>> normalize_html("\n\t\n\t\ta b\t\t
\n\t")
+ 'a b
'
+
+ >>> normalize_html("a b ")
+ 'a b '
+
+ * Self-closing tags are converted to open tags.
+
+ >>> normalize_html("
")
+ '
'
+
+ * Attributes are sorted and lowercased.
+
+ >>> normalize_html('x')
+ 'x'
+
+ * References are converted to unicode, except that '<', '>', '&', and
+ '"' are rendered using entities.
+
+ >>> normalize_html("∀&><"")
+ '\u2200&><"'
+
+ """
+ html_chunk_re = re.compile("(\|\<[^>]*\>|[^<]+)")
+ try:
+ parser = MyHTMLParser()
+ # We work around HTMLParser's limitations parsing CDATA
+ # by breaking the input into chunks and passing CDATA chunks
+ # through verbatim.
+ for chunk in re.finditer(html_chunk_re, html):
+ if chunk.group(0)[:8] == "\[%s\]\n){%d}" % (bad_key, COUNT-1))
+
+
+# list of pairs consisting of input and a regex that must match the output.
+pathological = {
+ # note - some pythons have limit of 65535 for {num-matches} in re.
+ "nested strong emph":
+ (("*a **a " * 32500) + "b" + (" a** a*" * 32500),
+ re.compile("(a a ){32500}b( a a){32500}")),
+ "many emph closers with no openers":
+ (("a_ " * 32500),
+ re.compile("(a[_] ){32499}a_")),
+ "many emph openers with no closers":
+ (("_a " * 32500),
+ re.compile("(_a ){32499}_a")),
+ "many link closers with no openers":
+ (("a]" * 32500),
+ re.compile("(a\]){32500}")),
+ "many link openers with no closers":
+ (("[a" * 32500),
+ re.compile("(\[a){32500}")),
+ "mismatched openers and closers":
+ (("*a_ " * 25000),
+ re.compile("([*]a[_] ){24999}[*]a_")),
+ "issue #389":
+ (("*a " * 20000 + "_a*_ " * 20000),
+ re.compile("(a ){20000}(_a<\/em>_ ?){20000}")),
+ "openers and closers multiple of 3":
+ (("a**b" + ("c* " * 25000)),
+ re.compile("a[*][*]b(c[*] ){24999}c[*]")),
+ "link openers and emph closers":
+ (("[ a_" * 25000),
+ re.compile("(\[ a_){25000}")),
+ "pattern [ (]( repeated":
+ (("[ (](" * 40000),
+ re.compile("(\[ \(\]\(){40000}")),
+ "pattern ![[]() repeated":
+ ("![[]()" * 160000,
+ re.compile("(!\[){160000}")),
+ "hard link/emph case":
+ ("**x [a*b**c*](d)",
+ re.compile("\\*\\*x ab\\*\\*c")),
+ "nested brackets":
+ (("[" * 25000) + "a" + ("]" * 25000),
+ re.compile("\[{25000}a\]{25000}")),
+ "nested block quotes":
+ ((("> " * 25000) + "a"),
+ re.compile("(\n){25000}")),
+ "deeply nested lists":
+ ("".join(map(lambda x: (" " * x + "* a\n"), range(0,500))),
+ re.compile("\n(- a\n
\n){499}- a
\n
\n( \n
\n){499}")),
+ "U+0000 in input":
+ ("abc\u0000de\u0000",
+ re.compile("abc\ufffd?de\ufffd?")),
+ "backticks":
+ ("".join(map(lambda x: ("e" + "`" * x), range(1,2500))),
+ re.compile("^[e`]*
\n$")),
+ "unclosed links A":
+ ("[a](line1
+line2
+````````````````````````````````
+
+Issue #114: cmark skipping first character in line
+(Important: the blank lines around "Repeatedly" contain a tab.)
+
+```````````````````````````````` example
+By taking it apart
+
+- alternative solutions
+→
+Repeatedly solving
+→
+- how techniques
+.
+By taking it apart
+
+- alternative solutions
+
+Repeatedly solving
+
+- how techniques
+
+````````````````````````````````
+
+Issue jgm/CommonMark#430: h2..h6 not recognized as block tags.
+
+```````````````````````````````` example
+lorem
+
+lorem
+
+lorem
+
+lorem
+
+lorem
+
+lorem
+.
+lorem
+lorem
+lorem
+lorem
+lorem
+lorem
+````````````````````````````````
+
+Issue jgm/commonmark.js#109 - tabs after setext header line
+
+
+```````````````````````````````` example
+hi
+--→
+.
+hi
+````````````````````````````````
+
+Issue #177 - incorrect emphasis parsing
+
+```````````````````````````````` example
+a***b* c*
+.
+a*b c
+````````````````````````````````
+
+Issue #193 - unescaped left angle brackets in link destination
+
+```````````````````````````````` example
+[a]
+
+[a]:
+.
+[a]
+[a]: <te
+````````````````````````````````
+
+Issue #192 - escaped spaces in link destination
+
+
+```````````````````````````````` example
+[a](te\ st)
+.
+[a](te\ st)
+````````````````````````````````
+
+Issue #527 - meta tags in inline contexts
+
+```````````````````````````````` example
+City:
+
+
+
+.
+City:
+
+
+
+````````````````````````````````
+
+Issue #530 - link parsing corner cases
+
+```````````````````````````````` example
+[a](\ b)
+
+[a](<[a](\ b)
+[a](<<b)
+[a](<b
+)
+````````````````````````````````
+
+Issue commonmark#526 - unescaped ( in link title
+
+```````````````````````````````` example
+[link](url ((title))
+.
+[link](url ((title))
+````````````````````````````````
+
+Issue commonamrk#517 - script, pre, style close tag without
+opener.
+
+```````````````````````````````` example
+
+
+
+
+
+.
+
+
+
+````````````````````````````````
+
+Issue #289.
+
+```````````````````````````````` example
+[a](
+.
+[a](<b) c>
+```````````````````````````````` + +Issue #334 - UTF-8 BOM + +```````````````````````````````` example +# Hi +. +**Helloworld
+```````````````````````````````` + +Issue #424 - emphasis before links + +```````````````````````````````` example +*text* [link](#section) +. +text link
+```````````````````````````````` + +` +. + +```````````````````````````````` + +Declarations don't need spaces, according to the spec +```````````````````````````````` example +x +. +x
+```````````````````````````````` + + diff --git a/deps/cmark/test/roundtrip_tests.py b/deps/cmark/test/roundtrip_tests.py new file mode 100644 index 0000000..13444b1 --- /dev/null +++ b/deps/cmark/test/roundtrip_tests.py @@ -0,0 +1,46 @@ +import re +import sys +from spec_tests import get_tests, do_test +from cmark import CMark +import argparse + +parser = argparse.ArgumentParser(description='Run cmark roundtrip tests.') +parser.add_argument('-p', '--program', dest='program', nargs='?', default=None, + help='program to test') +parser.add_argument('-s', '--spec', dest='spec', nargs='?', default='spec.txt', + help='path to spec') +parser.add_argument('-P', '--pattern', dest='pattern', nargs='?', + default=None, help='limit to sections matching regex pattern') +parser.add_argument('--library-dir', dest='library_dir', nargs='?', + default=None, help='directory containing dynamic library') +parser.add_argument('--no-normalize', dest='normalize', + action='store_const', const=False, default=True, + help='do not normalize HTML') +parser.add_argument('-n', '--number', type=int, default=None, + help='only consider the test with the given number') +args = parser.parse_args(sys.argv[1:]) + +spec = sys.argv[1] + +def converter(md): + cmark = CMark(prog=args.program, library_dir=args.library_dir) + [ec, result, err] = cmark.to_commonmark(md) + if ec == 0: + [ec, html, err] = cmark.to_html(result) + if ec == 0: + # In the commonmark writer we insert dummy HTML + # comments between lists, and between lists and code + # blocks. Strip these out, since the spec uses + # two blank lines instead: + return [ec, re.sub('\n', '', html), ''] + else: + return [ec, html, err] + else: + return [ec, result, err] + +tests = get_tests(args.spec) +result_counts = {'pass': 0, 'fail': 0, 'error': 0, 'skip': 0} +for test in tests: + do_test(converter, test, args.normalize, result_counts) + +exit(result_counts['fail'] + result_counts['error']) diff --git a/deps/cmark/test/run-cmark-fuzz b/deps/cmark/test/run-cmark-fuzz new file mode 100755 index 0000000..75100b8 --- /dev/null +++ b/deps/cmark/test/run-cmark-fuzz @@ -0,0 +1,4 @@ +#!/bin/bash -eu +CMARK_FUZZ="$1" +shift +ASAN_OPTIONS="quarantine_size_mb=10:detect_leaks=1" "${CMARK_FUZZ}" -max_len=256 -timeout=1 -dict=test/fuzzing_dictionary "$@" diff --git a/deps/cmark/test/smart_punct.txt b/deps/cmark/test/smart_punct.txt new file mode 100644 index 0000000..fd55e62 --- /dev/null +++ b/deps/cmark/test/smart_punct.txt @@ -0,0 +1,177 @@ +## Smart punctuation + +Open quotes are matched with closed quotes. +The same method is used for matching openers and closers +as is used in emphasis parsing: + +```````````````````````````````` example +"Hello," said the spider. +"'Shelob' is my name." +. +“Hello,” said the spider. +“‘Shelob’ is my name.”
+```````````````````````````````` + +```````````````````````````````` example +'A', 'B', and 'C' are letters. +. +‘A’, ‘B’, and ‘C’ are letters.
+```````````````````````````````` + +```````````````````````````````` example +'Oak,' 'elm,' and 'beech' are names of trees. +So is 'pine.' +. +‘Oak,’ ‘elm,’ and ‘beech’ are names of trees. +So is ‘pine.’
+```````````````````````````````` + +```````````````````````````````` example +'He said, "I want to go."' +. +‘He said, “I want to go.”’
+```````````````````````````````` + +A single quote that isn't an open quote matched +with a close quote will be treated as an +apostrophe: + +```````````````````````````````` example +Were you alive in the 70's? +. +Were you alive in the 70’s?
+```````````````````````````````` + +```````````````````````````````` example +Here is some quoted '`code`' and a "[quoted link](url)". +. +Here is some quoted ‘code
’ and a “quoted link”.
’tis the season to be ‘jolly’
+```````````````````````````````` + +Multiple apostrophes should not be marked as open/closing quotes. + +```````````````````````````````` example +'We'll use Jane's boat and John's truck,' Jenna said. +. +‘We’ll use Jane’s boat and John’s truck,’ Jenna said.
+```````````````````````````````` + +An unmatched double quote will be interpreted as a +left double quote, to facilitate this style: + +```````````````````````````````` example +"A paragraph with no closing quote. + +"Second paragraph by same speaker, in fiction." +. +“A paragraph with no closing quote.
+“Second paragraph by same speaker, in fiction.”
+```````````````````````````````` + +A quote following a `]` or `)` character cannot +be an open quote: + +```````````````````````````````` example +[a]'s b' +. +[a]’s b’
+```````````````````````````````` + +Quotes that are escaped come out as literal straight +quotes: + +```````````````````````````````` example +\"This is not smart.\" +This isn\'t either. +5\'8\" +. +"This is not smart." +This isn't either. +5'8"
+```````````````````````````````` + +Two hyphens form an en-dash, three an em-dash. + +```````````````````````````````` example +Some dashes: em---em +en--en +em --- em +en -- en +2--3 +. +Some dashes: em—em +en–en +em — em +en – en +2–3
+```````````````````````````````` + +A sequence of more than three hyphens is +parsed as a sequence of em and/or en dashes, +with no hyphens. If possible, a homogeneous +sequence of dashes is used (so, 10 hyphens += 5 en dashes, and 9 hyphens = 3 em dashes). +When a heterogeneous sequence must be used, +the em dashes come first, followed by the en +dashes, and as few en dashes as possible are +used (so, 7 hyphens = 2 em dashes an 1 en +dash). + +```````````````````````````````` example +one- +two-- +three--- +four---- +five----- +six------ +seven------- +eight-------- +nine--------- +thirteen-------------. +. +one- +two– +three— +four–– +five—– +six—— +seven—–– +eight–––– +nine——— +thirteen———––.
+```````````````````````````````` + +Hyphens can be escaped: + +```````````````````````````````` example +Escaped hyphens: \-- \-\-\-. +. +Escaped hyphens: -- ---.
+```````````````````````````````` + +Three periods form an ellipsis: + +```````````````````````````````` example +Ellipses...and...and.... +. +Ellipses…and…and….
+```````````````````````````````` + +Periods can be escaped if ellipsis-formation +is not wanted: + +```````````````````````````````` example +No ellipses\.\.\. +. +No ellipses...
+```````````````````````````````` diff --git a/deps/cmark/test/spec.txt b/deps/cmark/test/spec.txt new file mode 100644 index 0000000..43247fe --- /dev/null +++ b/deps/cmark/test/spec.txt @@ -0,0 +1,9742 @@ +--- +title: CommonMark Spec +author: John MacFarlane +version: '0.30' +date: '2021-06-19' +license: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)' +... + +# Introduction + +## What is Markdown? + +Markdown is a plain text format for writing structured documents, +based on conventions for indicating formatting in email +and usenet posts. It was developed by John Gruber (with +help from Aaron Swartz) and released in 2004 in the form of a +[syntax description](http://daringfireball.net/projects/markdown/syntax) +and a Perl script (`Markdown.pl`) for converting Markdown to +HTML. In the next decade, dozens of implementations were +developed in many languages. Some extended the original +Markdown syntax with conventions for footnotes, tables, and +other document elements. Some allowed Markdown documents to be +rendered in formats other than HTML. Websites like Reddit, +StackOverflow, and GitHub had millions of people using Markdown. +And Markdown started to be used beyond the web, to author books, +articles, slide shows, letters, and lecture notes. + +What distinguishes Markdown from many other lightweight markup +syntaxes, which are often easier to write, is its readability. +As Gruber writes: + +> The overriding design goal for Markdown's formatting syntax is +> to make it as readable as possible. The idea is that a +> Markdown-formatted document should be publishable as-is, as +> plain text, without looking like it's been marked up with tags +> or formatting instructions. +> (` tags? Can a list be partially "loose" and partially + "tight"? What should we do with a list like this? + + ``` markdown + 1. one + + 2. two + 3. three + ``` + + Or this? + + ``` markdown + 1. one + - a + + - b + 2. two + ``` + + (There are some relevant comments by John Gruber + [here](https://web.archive.org/web/20170611172104/http://article.gmane.org/gmane.text.markdown.general/2554).) + +5. Can list markers be indented? Can ordered list markers be right-aligned? + + ``` markdown + 8. item 1 + 9. item 2 + 10. item 2a + ``` + +6. Is this one list with a thematic break in its second item, + or two lists separated by a thematic break? + + ``` markdown + * a + * * * * * + * b + ``` + +7. When list markers change from numbers to bullets, do we have + two lists or one? (The Markdown syntax description suggests two, + but the perl scripts and many other implementations produce one.) + + ``` markdown + 1. fee + 2. fie + - foe + - fum + ``` + +8. What are the precedence rules for the markers of inline structure? + For example, is the following a valid link, or does the code span + take precedence ? + + ``` markdown + [a backtick (`)](/url) and [another backtick (`)](/url). + ``` + +9. What are the precedence rules for markers of emphasis and strong + emphasis? For example, how should the following be parsed? + + ``` markdown + *foo *bar* baz* + ``` + +10. What are the precedence rules between block-level and inline-level + structure? For example, how should the following be parsed? + + ``` markdown + - `a long code span can contain a hyphen like this + - and it can screw things up` + ``` + +11. Can list items include section headings? (`Markdown.pl` does not + allow this, but does allow blockquotes to include headings.) + + ``` markdown + - # Heading + ``` + +12. Can list items be empty? + + ``` markdown + * a + * + * b + ``` + +13. Can link references be defined inside block quotes or list items? + + ``` markdown + > Blockquote [foo]. + > + > [foo]: /url + ``` + +14. If there are multiple definitions for the same reference, which takes + precedence? + + ``` markdown + [foo]: /url1 + [foo]: /url2 + + [foo][] + ``` + +In the absence of a spec, early implementers consulted `Markdown.pl` +to resolve these ambiguities. But `Markdown.pl` was quite buggy, and +gave manifestly bad results in many cases, so it was not a +satisfactory replacement for a spec. + +Because there is no unambiguous spec, implementations have diverged +considerably. As a result, users are often surprised to find that +a document that renders one way on one system (say, a GitHub wiki) +renders differently on another (say, converting to docbook using +pandoc). To make matters worse, because nothing in Markdown counts +as a "syntax error," the divergence often isn't discovered right away. + +## About this document + +This document attempts to specify Markdown syntax unambiguously. +It contains many examples with side-by-side Markdown and +HTML. These are intended to double as conformance tests. An +accompanying script `spec_tests.py` can be used to run the tests +against any Markdown program: + + python test/spec_tests.py --spec spec.txt --program PROGRAM + +Since this document describes how Markdown is to be parsed into +an abstract syntax tree, it would have made sense to use an abstract +representation of the syntax tree instead of HTML. But HTML is capable +of representing the structural distinctions we need to make, and the +choice of HTML for the tests makes it possible to run the tests against +an implementation without writing an abstract syntax tree renderer. + +Note that not every feature of the HTML samples is mandated by +the spec. For example, the spec says what counts as a link +destination, but it doesn't mandate that non-ASCII characters in +the URL be percent-encoded. To use the automatic tests, +implementers will need to provide a renderer that conforms to +the expectations of the spec examples (percent-encoding +non-ASCII characters in URLs). But a conforming implementation +can use a different renderer and may choose not to +percent-encode non-ASCII characters in URLs. + +This document is generated from a text file, `spec.txt`, written +in Markdown with a small extension for the side-by-side tests. +The script `tools/makespec.py` can be used to convert `spec.txt` into +HTML or CommonMark (which can then be converted into other formats). + +In the examples, the `→` character is used to represent tabs. + +# Preliminaries + +## Characters and lines + +Any sequence of [characters] is a valid CommonMark +document. + +A [character](@) is a Unicode code point. Although some +code points (for example, combining accents) do not correspond to +characters in an intuitive sense, all code points count as characters +for purposes of this spec. + +This spec does not specify an encoding; it thinks of lines as composed +of [characters] rather than bytes. A conforming parser may be limited +to a certain encoding. + +A [line](@) is a sequence of zero or more [characters] +other than line feed (`U+000A`) or carriage return (`U+000D`), +followed by a [line ending] or by the end of file. + +A [line ending](@) is a line feed (`U+000A`), a carriage return +(`U+000D`) not followed by a line feed, or a carriage return and a +following line feed. + +A line containing no characters, or a line containing only spaces +(`U+0020`) or tabs (`U+0009`), is called a [blank line](@). + +The following definitions of character classes will be used in this spec: + +A [Unicode whitespace character](@) is +any code point in the Unicode `Zs` general category, or a tab (`U+0009`), +line feed (`U+000A`), form feed (`U+000C`), or carriage return (`U+000D`). + +[Unicode whitespace](@) is a sequence of one or more +[Unicode whitespace characters]. + +A [tab](@) is `U+0009`. + +A [space](@) is `U+0020`. + +An [ASCII control character](@) is a character between `U+0000–1F` (both +including) or `U+007F`. + +An [ASCII punctuation character](@) +is `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`, +`*`, `+`, `,`, `-`, `.`, `/` (U+0021–2F), +`:`, `;`, `<`, `=`, `>`, `?`, `@` (U+003A–0040), +`[`, `\`, `]`, `^`, `_`, `` ` `` (U+005B–0060), +`{`, `|`, `}`, or `~` (U+007B–007E). + +A [Unicode punctuation character](@) is an [ASCII +punctuation character] or anything in +the general Unicode categories `Pc`, `Pd`, `Pe`, `Pf`, `Pi`, `Po`, or `Ps`. + +## Tabs + +Tabs in lines are not expanded to [spaces]. However, +in contexts where spaces help to define block structure, +tabs behave as if they were replaced by spaces with a tab stop +of 4 characters. + +Thus, for example, a tab can be used instead of four spaces +in an indented code block. (Note, however, that internal +tabs are passed through as literal tabs, not expanded to +spaces.) + +```````````````````````````````` example +→foo→baz→→bim +. +
foo→baz→→bim
+
+````````````````````````````````
+
+```````````````````````````````` example
+ →foo→baz→→bim
+.
+foo→baz→→bim
+
+````````````````````````````````
+
+```````````````````````````````` example
+ a→a
+ ὐ→a
+.
+a→a
+ὐ→a
+
+````````````````````````````````
+
+In the following example, a continuation paragraph of a list
+item is indented with a tab; this has exactly the same effect
+as indentation with four spaces would:
+
+```````````````````````````````` example
+ - foo
+
+→bar
+.
+foo
+bar
+foo
+ bar
+
+++```````````````````````````````` + +```````````````````````````````` example +-→→foo +. ++foo +
foo
+
+foo
+bar
+
+````````````````````````````````
+
+```````````````````````````````` example
+ - foo
+ - bar
+→ - baz
+.
+!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
+```````````````````````````````` + + +Backslashes before other characters are treated as literal +backslashes: + +```````````````````````````````` example +\→\A\a\ \3\φ\« +. +\→\A\a\ \3\φ\«
+```````````````````````````````` + + +Escaped characters are treated as regular characters and do +not have their usual Markdown meanings: + +```````````````````````````````` example +\*not emphasized* +\*not emphasized* +<br/> not a tag +[not a link](/foo) +`not code` +1. not a list +* not a list +# not a heading +[foo]: /url "not a reference" +ö not a character entity
+```````````````````````````````` + + +If a backslash is itself escaped, the following character is not: + +```````````````````````````````` example +\\*emphasis* +. +\emphasis
+```````````````````````````````` + + +A backslash at the end of the line is a [hard line break]: + +```````````````````````````````` example +foo\ +bar +. +foo
+bar
\[\`
\[\]
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~
+\[\]
+~~~
+.
+\[\]
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo
+
+````````````````````````````````
+
+
+## Entity and numeric character references
+
+Valid HTML entity references and numeric character references
+can be used in place of the corresponding Unicode character,
+with the following exceptions:
+
+- Entity and character references are not recognized in code
+ blocks and code spans.
+
+- Entity and character references cannot stand in place of
+ special characters that define structural elements in
+ CommonMark. For example, although `*` can be used
+ in place of a literal `*` character, `*` cannot replace
+ `*` in emphasis delimiters, bullet list markers, or thematic
+ breaks.
+
+Conforming CommonMark parsers need not store information about
+whether a particular character was represented in the source
+using a Unicode character or an entity reference.
+
+[Entity references](@) consist of `&` + any of the valid
+HTML5 entity names + `;`. The
+document & © Æ Ď +¾ ℋ ⅆ +∲ ≧̸
+```````````````````````````````` + + +[Decimal numeric character +references](@) +consist of `` + a string of 1--7 arabic digits + `;`. A +numeric character reference is parsed as the corresponding +Unicode character. Invalid Unicode code points will be replaced by +the REPLACEMENT CHARACTER (`U+FFFD`). For security reasons, +the code point `U+0000` will also be replaced by `U+FFFD`. + +```````````````````````````````` example +# Ӓ Ϡ +. +# Ӓ Ϡ �
+```````````````````````````````` + + +[Hexadecimal numeric character +references](@) consist of `` + +either `X` or `x` + a string of 1-6 hexadecimal digits + `;`. +They too are parsed as the corresponding Unicode character (this +time specified with a hexadecimal numeral instead of decimal). + +```````````````````````````````` example +" ആ ಫ +. +" ആ ಫ
+```````````````````````````````` + + +Here are some nonentities: + +```````````````````````````````` example +  &x; + +abcdef0; +&ThisIsNotDefined; &hi?; +. +  &x; &#; &#x; +� +&#abcdef0; +&ThisIsNotDefined; &hi?;
+```````````````````````````````` + + +Although HTML5 does accept some entity references +without a trailing semicolon (such as `©`), these are not +recognized here, because it makes the grammar too ambiguous: + +```````````````````````````````` example +© +. +©
+```````````````````````````````` + + +Strings that are not on the list of HTML5 named entities are not +recognized as entity references either: + +```````````````````````````````` example +&MadeUpEntity; +. +&MadeUpEntity;
+```````````````````````````````` + + +Entity and numeric character references are recognized in any +context besides code spans or code blocks, including +URLs, [link titles], and [fenced code block][] [info strings]: + +```````````````````````````````` example + +. + +```````````````````````````````` + + +```````````````````````````````` example +[foo](/föö "föö") +. + +```````````````````````````````` + + +```````````````````````````````` example +[foo] + +[foo]: /föö "föö" +. + +```````````````````````````````` + + +```````````````````````````````` example +``` föö +foo +``` +. +foo
+
+````````````````````````````````
+
+
+Entity and numeric character references are treated as literal
+text in code spans and code blocks:
+
+```````````````````````````````` example
+`föö`
+.
+föö
föfö
+
+````````````````````````````````
+
+
+Entity and numeric character references cannot be used
+in place of symbols indicating structure in CommonMark
+documents.
+
+```````````````````````````````` example
+*foo*
+*foo*
+.
+*foo* +foo
+```````````````````````````````` + +```````````````````````````````` example +* foo + +* foo +. +* foo
+foo + +bar
+```````````````````````````````` + +```````````````````````````````` example + foo +. +→foo
+```````````````````````````````` + + +```````````````````````````````` example +[a](url "tit") +. +[a](url "tit")
+```````````````````````````````` + + + +# Blocks and inlines + +We can think of a document as a sequence of +[blocks](@)---structural elements like paragraphs, block +quotations, lists, headings, rules, and code blocks. Some blocks (like +block quotes and list items) contain other blocks; others (like +headings and paragraphs) contain [inline](@) content---text, +links, emphasized text, images, code spans, and so on. + +## Precedence + +Indicators of block structure always take precedence over indicators +of inline structure. So, for example, the following is a list with +two items, not a list with one item containing a code span: + +```````````````````````````````` example +- `one +- two` +. ++++
+```````````````````````````````` + + +```````````````````````````````` example +=== +. +===
+```````````````````````````````` + + +Not enough characters: + +```````````````````````````````` example +-- +** +__ +. +-- +** +__
+```````````````````````````````` + + +Up to three spaces of indentation are allowed: + +```````````````````````````````` example + *** + *** + *** +. +***
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+Foo
+ ***
+.
+Foo +***
+```````````````````````````````` + + +More than three characters may be used: + +```````````````````````````````` example +_____________________________________ +. +_ _ _ _ a
+a------
+---a---
+```````````````````````````````` + + +It is required that all of the characters other than spaces or tabs be the same. +So, this is not a thematic break: + +```````````````````````````````` example + *-* +. +-
+```````````````````````````````` + + +Thematic breaks do not need blank lines before or after: + +```````````````````````````````` example +- foo +*** +- bar +. +Foo
+bar
+```````````````````````````````` + + +If a line of dashes that meets the above conditions for being a +thematic break could also be interpreted as the underline of a [setext +heading], the interpretation as a +[setext heading] takes precedence. Thus, for example, +this is a setext heading, not a paragraph followed by a thematic break: + +```````````````````````````````` example +Foo +--- +bar +. +bar
+```````````````````````````````` + + +When both a thematic break and a list item are possible +interpretations of a line, the thematic break takes precedence: + +```````````````````````````````` example +* Foo +* * * +* Bar +. +####### foo
+```````````````````````````````` + + +At least one space or tab is required between the `#` characters and the +heading's contents, unless the heading is empty. Note that many +implementations currently do not require the space. However, the +space was required by the +[original ATX implementation](http://www.aaronsw.com/2002/atx/atx.py), +and it helps prevent things like the following from being parsed as +headings: + +```````````````````````````````` example +#5 bolt + +#hashtag +. +#5 bolt
+#hashtag
+```````````````````````````````` + + +This is not a heading, because the first `#` is escaped: + +```````````````````````````````` example +\## foo +. +## foo
+```````````````````````````````` + + +Contents are parsed as inlines: + +```````````````````````````````` example +# foo *bar* \*baz\* +. +# foo
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo
+ # bar
+.
+foo +# bar
+```````````````````````````````` + + +A closing sequence of `#` characters is optional: + +```````````````````````````````` example +## foo ## + ### bar ### +. +Foo bar
+Bar foo
+```````````````````````````````` + + +ATX headings can be empty: + +```````````````````````````````` example +## +# +### ### +. + + + +```````````````````````````````` + + +## Setext headings + +A [setext heading](@) consists of one or more +lines of text, not interrupted by a blank line, of which the first line does not +have more than 3 spaces of indentation, followed by +a [setext heading underline]. The lines of text must be such +that, were they not followed by the setext heading underline, +they would be interpreted as a paragraph: they cannot be +interpretable as a [code fence], [ATX heading][ATX headings], +[block quote][block quotes], [thematic break][thematic breaks], +[list item][list items], or [HTML block][HTML blocks]. + +A [setext heading underline](@) is a sequence of +`=` characters or a sequence of `-` characters, with no more than 3 +spaces of indentation and any number of trailing spaces or tabs. + +The heading is a level 1 heading if `=` characters are used in +the [setext heading underline], and a level 2 heading if `-` +characters are used. The contents of the heading are the result +of parsing the preceding lines of text as CommonMark inline +content. + +In general, a setext heading need not be preceded or followed by a +blank line. However, it cannot interrupt a paragraph, so when a +setext heading comes after a paragraph, a blank line is needed between +them. + +Simple examples: + +```````````````````````````````` example +Foo *bar* +========= + +Foo *bar* +--------- +. +Foo
+---
+
+Foo
+
+Foo +---
+```````````````````````````````` + + +The setext heading underline cannot contain internal spaces or tabs: + +```````````````````````````````` example +Foo += = + +Foo +--- - +. +Foo += =
+Foo
+`
+of dashes"/>
+```````````````````````````````` + + +The setext heading underline cannot be a [lazy continuation +line] in a list item or block quote: + +```````````````````````````````` example +> Foo +--- +. +++Foo
+
++```````````````````````````````` + + +```````````````````````````````` example +- Foo +--- +. +foo +bar +===
+
Baz
+```````````````````````````````` + + +Setext headings cannot be empty: + +```````````````````````````````` example + +==== +. +====
+```````````````````````````````` + + +Setext heading text lines must not be interpretable as block +constructs other than paragraphs. So, the line of dashes +in these examples gets interpreted as a thematic break: + +```````````````````````````````` example +--- +--- +. +foo
+
+++foo
+
Foo
+baz
+```````````````````````````````` + + +Authors who want interpretation 2 can put blank lines around +the thematic break, + +```````````````````````````````` example +Foo +bar + +--- + +baz +. +Foo +bar
+baz
+```````````````````````````````` + + +or use a thematic break that cannot count as a [setext heading +underline], such as + +```````````````````````````````` example +Foo +bar +* * * +baz +. +Foo +bar
+baz
+```````````````````````````````` + + +Authors who want interpretation 3 can use backslash escapes: + +```````````````````````````````` example +Foo +bar +\--- +baz +. +Foo +bar +--- +baz
+```````````````````````````````` + + +## Indented code blocks + +An [indented code block](@) is composed of one or more +[indented chunks] separated by blank lines. +An [indented chunk](@) is a sequence of non-blank lines, +each preceded by four or more spaces of indentation. The contents of the code +block are the literal contents of the lines, including trailing +[line endings], minus four spaces of indentation. +An indented code block has no [info string]. + +An indented code block cannot interrupt a paragraph, so there must be +a blank line between a paragraph and a following indented code block. +(A blank line is not needed, however, between a code block and a following +paragraph.) + +```````````````````````````````` example + a simple + indented code block +. +a simple
+ indented code block
+
+````````````````````````````````
+
+
+If there is any ambiguity between an interpretation of indentation
+as a code block and as indicating that material belongs to a [list
+item][list items], the list item interpretation takes precedence:
+
+```````````````````````````````` example
+ - foo
+
+ bar
+.
+foo
+bar
+foo
+<a/>
+*hi*
+
+- one
+
+````````````````````````````````
+
+
+Here we have three chunks separated by blank lines:
+
+```````````````````````````````` example
+ chunk1
+
+ chunk2
+
+
+
+ chunk3
+.
+chunk1
+
+chunk2
+
+
+
+chunk3
+
+````````````````````````````````
+
+
+Any initial spaces or tabs beyond four spaces of indentation will be included in
+the content, even in interior blank lines:
+
+```````````````````````````````` example
+ chunk1
+
+ chunk2
+.
+chunk1
+
+ chunk2
+
+````````````````````````````````
+
+
+An indented code block cannot interrupt a paragraph. (This
+allows hanging indents and the like.)
+
+```````````````````````````````` example
+Foo
+ bar
+
+.
+Foo +bar
+```````````````````````````````` + + +However, any non-blank line with fewer than four spaces of indentation ends +the code block immediately. So a paragraph may occur immediately +after indented code: + +```````````````````````````````` example + foo +bar +. +foo
+
+bar
+```````````````````````````````` + + +And indented code can occur immediately before and after other kinds of +blocks: + +```````````````````````````````` example +# Heading + foo +Heading +------ + foo +---- +. +foo
+
+foo
+
+ foo
+bar
+
+````````````````````````````````
+
+
+Blank lines preceding or following an indented code block
+are not included in it:
+
+```````````````````````````````` example
+
+
+ foo
+
+
+.
+foo
+
+````````````````````````````````
+
+
+Trailing spaces or tabs are included in the code block's content:
+
+```````````````````````````````` example
+ foo
+.
+foo
+
+````````````````````````````````
+
+
+
+## Fenced code blocks
+
+A [code fence](@) is a sequence
+of at least three consecutive backtick characters (`` ` ``) or
+tildes (`~`). (Tildes and backticks cannot be mixed.)
+A [fenced code block](@)
+begins with a code fence, preceded by up to three spaces of indentation.
+
+The line with the opening code fence may optionally contain some text
+following the code fence; this is trimmed of leading and trailing
+spaces or tabs and called the [info string](@). If the [info string] comes
+after a backtick fence, it may not contain any backtick
+characters. (The reason for this restriction is that otherwise
+some inline code would be incorrectly interpreted as the
+beginning of a fenced code block.)
+
+The content of the code block consists of all subsequent lines, until
+a closing [code fence] of the same type as the code block
+began with (backticks or tildes), and with at least as many backticks
+or tildes as the opening code fence. If the leading code fence is
+preceded by N spaces of indentation, then up to N spaces of indentation are
+removed from each line of the content (if present). (If a content line is not
+indented, it is preserved unchanged. If it is indented N spaces or less, all
+of the indentation is removed.)
+
+The closing code fence may be preceded by up to three spaces of indentation, and
+may be followed only by spaces or tabs, which are ignored. If the end of the
+containing block (or document) is reached and no closing code fence
+has been found, the code block contains all of the lines after the
+opening code fence until the end of the containing block (or
+document). (An alternative spec would require backtracking in the
+event that a closing code fence is not found. But this makes parsing
+much less efficient, and there seems to be no real downside to the
+behavior described here.)
+
+A fenced code block may interrupt a paragraph, and does not require
+a blank line either before or after.
+
+The content of a code fence is treated as literal text, not parsed
+as inlines. The first word of the [info string] is typically used to
+specify the language of the code sample, and rendered in the `class`
+attribute of the `code` tag. However, this spec does not mandate any
+particular treatment of the [info string].
+
+Here is a simple example with backticks:
+
+```````````````````````````````` example
+```
+<
+ >
+```
+.
+<
+ >
+
+````````````````````````````````
+
+
+With tildes:
+
+```````````````````````````````` example
+~~~
+<
+ >
+~~~
+.
+<
+ >
+
+````````````````````````````````
+
+Fewer than three backticks is not enough:
+
+```````````````````````````````` example
+``
+foo
+``
+.
+foo
aaa
+~~~
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~
+aaa
+```
+~~~
+.
+aaa
+```
+
+````````````````````````````````
+
+
+The closing code fence must be at least as long as the opening fence:
+
+```````````````````````````````` example
+````
+aaa
+```
+``````
+.
+aaa
+```
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~~
+aaa
+~~~
+~~~~
+.
+aaa
+~~~
+
+````````````````````````````````
+
+
+Unclosed code blocks are closed by the end of the document
+(or the enclosing [block quote][block quotes] or [list item][list items]):
+
+```````````````````````````````` example
+```
+.
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+`````
+
+```
+aaa
+.
+
+```
+aaa
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+> ```
+> aaa
+
+bbb
+.
++++aaa +
bbb
+```````````````````````````````` + + +A code block can have all empty lines as its content: + +```````````````````````````````` example +``` + + +``` +. +
+
+
+````````````````````````````````
+
+
+A code block can be empty:
+
+```````````````````````````````` example
+```
+```
+.
+
+````````````````````````````````
+
+
+Fences can be indented. If the opening fence is indented,
+content lines will have equivalent opening indentation removed,
+if present:
+
+```````````````````````````````` example
+ ```
+ aaa
+aaa
+```
+.
+aaa
+aaa
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+aaa
+ aaa
+aaa
+ ```
+.
+aaa
+aaa
+aaa
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+ aaa
+ aaa
+ aaa
+ ```
+.
+aaa
+ aaa
+aaa
+
+````````````````````````````````
+
+
+Four spaces of indentation is too many:
+
+```````````````````````````````` example
+ ```
+ aaa
+ ```
+.
+```
+aaa
+```
+
+````````````````````````````````
+
+
+Closing fences may be preceded by up to three spaces of indentation, and their
+indentation need not match that of the opening fence:
+
+```````````````````````````````` example
+```
+aaa
+ ```
+.
+aaa
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+aaa
+ ```
+.
+aaa
+
+````````````````````````````````
+
+
+This is not a closing fence, because it is indented 4 spaces:
+
+```````````````````````````````` example
+```
+aaa
+ ```
+.
+aaa
+ ```
+
+````````````````````````````````
+
+
+
+Code fences (opening and closing) cannot contain internal spaces or tabs:
+
+```````````````````````````````` example
+``` ```
+aaa
+.
+
+aaa
aaa
+~~~ ~~
+
+````````````````````````````````
+
+
+Fenced code blocks can interrupt paragraphs, and can be followed
+directly by paragraphs, without a blank line between:
+
+```````````````````````````````` example
+foo
+```
+bar
+```
+baz
+.
+foo
+bar
+
+baz
+```````````````````````````````` + + +Other blocks can also occur before and after fenced code blocks +without an intervening blank line: + +```````````````````````````````` example +foo +--- +~~~ +bar +~~~ +# baz +. +bar
+
+def foo(x)
+ return 3
+end
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~~ ruby startline=3 $%@#$
+def foo(x)
+ return 3
+end
+~~~~~~~
+.
+def foo(x)
+ return 3
+end
+
+````````````````````````````````
+
+
+```````````````````````````````` example
+````;
+````
+.
+
+````````````````````````````````
+
+
+[Info strings] for backtick code blocks cannot contain backticks:
+
+```````````````````````````````` example
+``` aa ```
+foo
+.
+aa
+foo
foo
+
+````````````````````````````````
+
+
+Closing code fences cannot have [info strings]:
+
+```````````````````````````````` example
+```
+``` aaa
+```
+.
+``` aaa
+
+````````````````````````````````
+
+
+
+## HTML blocks
+
+An [HTML block](@) is a group of lines that is treated
+as raw HTML (and will not be escaped in HTML output).
+
+There are seven kinds of [HTML block], which can be defined by their
+start and end conditions. The block begins with a line that meets a
+[start condition](@) (after up to three optional spaces of indentation).
+It ends with the first subsequent line that meets a matching
+[end condition](@), or the last line of the document, or the last line of
+the [container block](#container-blocks) containing the current HTML
+block, if no line is encountered that meets the [end condition]. If
+the first line meets both the [start condition] and the [end
+condition], the block will contain just that line.
+
+1. **Start condition:** line begins with the string ``, or the end of the line.\ +**End condition:** line contains an end tag +``, ``, ``, or `` (case-insensitive; it +need not match the start tag). + +2. **Start condition:** line begins with the string ``. + +3. **Start condition:** line begins with the string ``.\ +**End condition:** line contains the string `?>`. + +4. **Start condition:** line begins with the string ``. + +5. **Start condition:** line begins with the string +``. + +6. **Start condition:** line begins with the string `<` or `` +followed by one of the strings (case-insensitive) `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`, `summary`, `table`, `tbody`, `td`, +`tfoot`, `th`, `thead`, `title`, `tr`, `track`, `ul`, followed +by a space, a tab, the end of the line, the string `>`, or +the string `/>`.\ +**End condition:** line is followed by a [blank line]. + +7. **Start condition:** line begins with a complete [open tag] +(with any [tag name] other than `pre`, `script`, +`style`, or `textarea`) or a complete [closing tag], +followed by zero or more spaces and tabs, followed by the end of the line.\ +**End condition:** line is followed by a [blank line]. + +HTML blocks continue until they are closed by their appropriate +[end condition], or the last line of the document or other [container +block](#container-blocks). This means any HTML **within an HTML +block** that might otherwise be recognised as a start condition will +be ignored by the parser and passed through as-is, without changing +the parser's state. + +For instance, `
` within an HTML block started by `