static bool match_here(struct utf8_iter expr, struct utf8_iter text, char **end) { unsigned pre = expr.chr; int flags = 0; if (pre == 0) { if (end != NULL) *end = text.head; return true; } if (pre == '~') { pre = utf8_next(&expr); flags |= NEGATE; } if (pre == '%') { pre = utf8_next(&expr); switch (pre) { case 'a': /* alpha */ case 'd': /* digit */ case 'f': /* float */ case 'g': /* graphic */ case 'n': /* newline */ case 's': /* space */ case 'x': /* hex */ case '?': /* anything */ flags |= CLASS; } } utf8_next(&expr); if (expr.chr == '*') { utf8_next(&expr); return match_star(pre, flags, expr, text, end); } else if (expr.chr == '+') { utf8_next(&expr); return match_plus(pre, flags, expr, text, end); } if (pre == '$' && expr.chr == 0) { if (end != NULL) *end = text.head; return text.chr == 0; } if (text.chr != 0 && match_char(pre, flags, &text)) { utf8_next(&text); return match_here(expr, text, end); } return false; }
bool match_here(const std::string& str, int a, const std::string& regex, int b) { if (b == regex.size()) { return true; } if (b == regex.size() - 1 && regex[b] == '$') { return a == (str.size()-1); } if (regex.size() - b >= 2 && regex[b + 1] == '*') { return match_star(regex[b], str, a, regex, b+2); } if (a != str.size() && (str[a] == regex[b] || regex[b] == '.')) { return match_here(str, a + 1, regex, b + 1); } return false; }