diff options
-rw-r--r-- | src/inlines.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/src/inlines.c b/src/inlines.c index 9ca2501..0ff5e0f 100644 --- a/src/inlines.c +++ b/src/inlines.c @@ -241,22 +241,47 @@ static cmark_node* handle_backticks(subject *subj) // 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) +static int +scan_delims(subject* subj, unsigned char c, bool * can_open, bool * can_close) { int numdelims = 0; - unsigned char char_before, char_after; + int before_char_pos; + int32_t after_char = 0; + int32_t before_char = 0; + int len; + + if (subj->pos == 0) { + before_char = 10; + } else { + before_char_pos = subj->pos - 1; + while (peek_at(subj, before_char_pos) >> 6 == 2 && + before_char_pos > 0) { + before_char_pos -= 1; + } + len = utf8proc_iterate(subj->input.data + before_char_pos, + subj->pos - before_char_pos, &before_char); + if (len == 0) { + before_char = 10; + } + } - char_before = subj->pos == 0 ? '\n' : peek_at(subj, subj->pos - 1); while (peek_char(subj) == c) { numdelims++; advance(subj); } - char_after = peek_char(subj); - *can_open = numdelims > 0 && !isspace(char_after); - *can_close = numdelims > 0 && !isspace(char_before); + + len = utf8proc_iterate(subj->input.data + subj->pos, + subj->input.len - subj->pos, &after_char); + if (len == 0) { + after_char = 10; + } + *can_open = numdelims > 0 && !utf8proc_is_space(after_char); + *can_close = numdelims > 0 && !utf8proc_is_space(before_char); if (c == '_') { - *can_open = *can_open && !isalnum(char_before); - *can_close = *can_close && !isalnum(char_after); + *can_open = *can_open && + !(before_char < 128 && isalnum((char)before_char)); + *can_close = *can_close && + !(before_char < 128 && isalnum((char)after_char)); } return numdelims; } |