static cmark_node *function_link_match(cmark_syntax_extension *self, cmark_parser *parser, cmark_node *parent, cmark_inline_parser *inline_parser) { cmark_node *ret = NULL; delimiter *tmp_delim; int offset; int start; offset = cmark_inline_parser_get_offset(inline_parser); if (offset == 0) goto done; if (cmark_inline_parser_peek_at(inline_parser, offset + 1) != ')') goto done; start = offset - 1; if (!is_valid_c(cmark_inline_parser_peek_at(inline_parser, start))) goto done; while (start >= 0) { unsigned char c = cmark_inline_parser_peek_at(inline_parser, start); if (is_valid_c(c)) { start -= 1; } else { break; } } ret = fixup_nodes(inline_parser, parent, offset - start - 1); if (!ret) goto done; tmp_delim = cmark_inline_parser_get_last_delimiter(inline_parser); while (tmp_delim) { delimiter *prev = tmp_delim->previous; if (tmp_delim->position < start + 1) { break; } cmark_inline_parser_remove_delimiter(inline_parser, tmp_delim); tmp_delim = prev; } cmark_inline_parser_advance_offset(inline_parser); cmark_inline_parser_advance_offset(inline_parser); done: return ret; }
static delimiter *insert(cmark_syntax_extension *self, cmark_parser *parser, cmark_inline_parser *inline_parser, delimiter *opener, delimiter *closer) { cmark_node *strikethrough; cmark_node *tmp, *next; delimiter *delim, *tmp_delim; delimiter *res = closer->next; strikethrough = opener->inl_text; if (!cmark_node_set_type(strikethrough, CMARK_NODE_STRIKETHROUGH)) goto done; cmark_node_set_syntax_extension(strikethrough, self); cmark_node_set_string_content(strikethrough, "~"); tmp = cmark_node_next(opener->inl_text); while (tmp) { if (tmp == closer->inl_text) break; next = cmark_node_next(tmp); cmark_node_append_child(strikethrough, tmp); tmp = next; } strikethrough->end_column = closer->inl_text->start_column + closer->inl_text->as.literal.len - 1; cmark_node_free(closer->inl_text); delim = closer; while (delim != NULL && delim != opener) { tmp_delim = delim->previous; cmark_inline_parser_remove_delimiter(inline_parser, delim); delim = tmp_delim; } cmark_inline_parser_remove_delimiter(inline_parser, opener); done: return res; }