/* 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) { 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 */ 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; /* 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] == '-')) i++; if (i > 1 && data[i] == '@') { if ((j = is_mail_autolink(data + i, size - i)) != 0) { *autolink = MKDA_EMAIL; return i + j; } } if (i > 2 && data[i] == ':') { *autolink = MKDA_NORMAL; i++; } /* completing autolink test: no whitespace or ' or " */ if (i >= size) *autolink = MKDA_NOT_AUTOLINK; else if (*autolink) { j = i; while (i < size) { if (data[i] == '\\') i += 2; else if (data[i] == '>' || data[i] == '\'' || data[i] == '"' || isspace(data[i])) break; else i += 1; } if (i >= size) return 0; if (i > j && data[i] == '>') return i + 1; /* one of the forbidden chars has been found */ *autolink = MKDA_NOT_AUTOLINK; } /* looking for sometinhg looking like a tag end */ while (i < size && data[i] != '>') i += 1; if (i >= size) return 0; return i + 1; }
/* 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) { 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 */ 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; /* scheme test */ *autolink = MKDA_NOT_AUTOLINK; if (size > 6 && strncasecmp(data + 1, "http", 4) == 0 && (data[5] == ':' || ((data[5] == 's' || data[5] == 'S') && data[6] == ':'))) { i = data[5] == ':' ? 6 : 7; *autolink = MKDA_NORMAL; } else if (size > 5 && strncasecmp(data + 1, "ftp:", 4) == 0) { i = 5; *autolink = MKDA_NORMAL; } else if (size > 7 && strncasecmp(data + 1, "mailto:", 7) == 0) { i = 8; /* not changing *autolink to go to the address test */ } /* completing autolink test: no whitespace or ' or " */ if (i >= size || i == '>') *autolink = MKDA_NOT_AUTOLINK; else if (*autolink) { j = i; while (i < size && data[i] != '>' && data[i] != '\'' && data[i] != '"' && data[i] != ' ' && data[i] != '\t' && data[i] != '\t') i += 1; if (i >= size) return 0; if (i > j && data[i] == '>') return i + 1; /* one of the forbidden chars has been found */ *autolink = MKDA_NOT_AUTOLINK; } else if ((j = is_mail_autolink(data + i, size - i)) != 0) { *autolink = (i == 8) ? MKDA_EXPLICIT_EMAIL : MKDA_IMPLICIT_EMAIL; return i + j; } /* looking for sometinhg looking like a tag end */ while (i < size && data[i] != '>') i += 1; if (i >= size) return 0; return i + 1; }