ext/redcarpet/markdown.c in redcarpet-1.13.2 vs ext/redcarpet/markdown.c in redcarpet-1.14.0

- old
+ new

@@ -259,19 +259,32 @@ is_mail_autolink(char *data, size_t size) { size_t i = 0, nb = 0; /* address is assumed to be: [-@._a-zA-Z0-9]+ with exactly one '@' */ - while (i < size && (data[i] == '-' || data[i] == '.' - || data[i] == '_' || data[i] == '@' - || (data[i] >= 'a' && data[i] <= 'z') - || (data[i] >= 'A' && data[i] <= 'Z') - || (data[i] >= '0' && data[i] <= '9'))) { - if (data[i] == '@') nb += 1; - i += 1; } - if (i >= size || data[i] != '>' || nb != 1) return 0; - return i + 1; + for (i = 0; i < size; ++i) { + if (isalnum(data[i])) + continue; + + switch (data[i]) { + case '@': + nb++; + + case '-': + case '.': + case '_': + break; + + case '>': + return (nb == 1) ? i + 1 : 0; + + default: + return 0; + } + } + + return 0; } /* tag_length • returns the length of the given tag, or 0 is it's not valid */ static size_t tag_length(char *data, size_t size, enum mkd_autolink *autolink) @@ -279,20 +292,21 @@ size_t i, j; /* a valid tag can't be shorter than 3 chars */ if (size < 3) return 0; - /* begins with a '<' optionally followed by '/', followed by letter */ + /* begins with a '<' optionally followed by '/', followed by letter or number */ if (data[0] != '<') return 0; i = (data[1] == '/') ? 2 : 1; - if ((data[i] < 'a' || data[i] > 'z') - && (data[i] < 'A' || data[i] > 'Z')) return 0; + if (!isalnum(data[i])) + return 0; + /* scheme test */ *autolink = MKDA_NOT_AUTOLINK; /* try to find the beggining of an URI */ - while (i < size && (isalpha(data[i]) || data[i] == '.' || data[i] == '+' || data[i] == '-')) + while (i < size && (isalnum(data[i]) || data[i] == '.' || data[i] == '+' || data[i] == '-')) i++; if (i > 1 && data[i] == '@') { if ((j = is_mail_autolink(data + i, size - i)) != 0) { *autolink = MKDA_EMAIL;