cmark

My personal build of CMark ✏️

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

Diffstat

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"