- Commit
- 7c9e3c4c5547d97d09ab842ac14e44ff391f6905
- Parent
- 45bfbcc9d2a82bb79d57aead9e51099e71e187e9
- Author
- John MacFarlane <jgm@berkeley.edu>
- Date
Merge pull request #134 from nwellnhof/ctype-fixes
Fix character type detection in commonmark.c
My personal build of CMark ✏️
Merge pull request #134 from nwellnhof/ctype-fixes
Fix character type detection in commonmark.c
4 files changed, 13 insertions, 9 deletions
Status | File Name | N° Changes | Insertions | Deletions |
Modified | src/cmark_ctype.c | 2 | 2 | 0 |
Modified | src/cmark_ctype.h | 2 | 2 | 0 |
Modified | src/commonmark.c | 17 | 9 | 8 |
Modified | src/latex.c | 1 | 0 | 1 |
diff --git a/src/cmark_ctype.c b/src/cmark_ctype.c @@ -40,3 +40,5 @@ int cmark_isalnum(char c) { } int cmark_isdigit(char c) { return cmark_ctype_class[(uint8_t)c] == 3; } + +int cmark_isalpha(char c) { return cmark_ctype_class[(uint8_t)c] == 4; }
diff --git a/src/cmark_ctype.h b/src/cmark_ctype.h @@ -17,6 +17,8 @@ int cmark_isalnum(char c); int cmark_isdigit(char c); +int cmark_isalpha(char c); + #ifdef __cplusplus } #endif
diff --git a/src/commonmark.c b/src/commonmark.c @@ -2,7 +2,6 @@ #include <stdio.h> #include <string.h> #include <assert.h> -#include <ctype.h> #include "config.h" #include "cmark.h" @@ -31,24 +30,26 @@ static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_escaping escape, char encoded[ENCODED_SIZE]; needs_escaping = + c < 0x80 && escape != LITERAL && ((escape == NORMAL && (c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' || c == '>' || c == '\\' || c == '`' || c == '!' || - (c == '&' && isalpha(nextc)) || (c == '!' && nextc == '[') || + (c == '&' && cmark_isalpha(nextc)) || (c == '!' && nextc == '[') || (renderer->begin_content && (c == '-' || c == '+' || c == '=') && // begin_content doesn't get set to false til we've passed digits // at the beginning of line, so... !follows_digit) || (renderer->begin_content && (c == '.' || c == ')') && follows_digit && (nextc == 0 || cmark_isspace(nextc))))) || - (escape == URL && (c == '`' || c == '<' || c == '>' || isspace(c) || - c == '\\' || c == ')' || c == '(')) || + (escape == URL && (c == '`' || c == '<' || c == '>' || + cmark_isspace(c) || c == '\\' || c == ')' || + c == '(')) || (escape == TITLE && (c == '`' || c == '<' || c == '>' || c == '"' || c == '\\'))); if (needs_escaping) { - if (isspace(c)) { + if (cmark_isspace(c)) { // use percent encoding for spaces snprintf(encoded, ENCODED_SIZE, "%%%2x", c); cmark_strbuf_puts(renderer->buffer, encoded); @@ -280,9 +281,9 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node, // use indented form if no info, and code doesn't // begin or end with a blank line, and code isn't // first thing in a list item - if (info_len == 0 && (code_len > 2 && !isspace((unsigned char)code[0]) && - !(isspace((unsigned char)code[code_len - 1]) && - isspace((unsigned char)code[code_len - 2]))) && + if (info_len == 0 && (code_len > 2 && !cmark_isspace(code[0]) && + !(cmark_isspace(code[code_len - 1]) && + cmark_isspace(code[code_len - 2]))) && !first_in_list_item) { LIT(" "); cmark_strbuf_puts(renderer->prefix, " ");
diff --git a/src/latex.c b/src/latex.c @@ -2,7 +2,6 @@ #include <stdio.h> #include <string.h> #include <assert.h> -#include <ctype.h> #include "config.h" #include "cmark.h"