diff --git a/slre.c b/slre.c index 2d2566a..0ff4097 100644 --- a/slre.c +++ b/slre.c @@ -207,8 +207,6 @@ static int bar(const char *re, int re_len, const char *s, int s_len, /* i is offset in re, j is offset in s, bi is brackets index */ int i, j, n, step; - DBG(("%s [%.*s] [%.*s]\n", __func__, re_len, re, s_len, s)); - for (i = j = 0; i < re_len && j <= s_len; i += step) { /* Handle quantifiers. Get the length of the chunk. */ @@ -247,7 +245,10 @@ static int bar(const char *re, int re_len, const char *s, int s_len, if (nj > j && non_greedy) break; j2 += n1; } + DBG(("STAR/PLUS END: %d %d %d\n", j, nj, re_len - ni)); FAIL_IF(re[i + step] == '+' && nj == j, static_error_no_match); + + /* Returning here cause we've matched the rest of RE already */ return nj; } continue; @@ -304,6 +305,20 @@ static int doh(const char *s, int s_len, struct regex_info *info, int bi) { return result; } +static int baz(const char *s, int s_len, struct regex_info *info) { + int i, result = 0, is_anchored = info->brackets[0].ptr[0] == '^'; + + for (i = 0; i < s_len; i++) { + result = doh(s + i, s_len - i, info, 0); + if (result > 0 || is_anchored) { + result += i; + break; + } + } + + return result; +} + static void setup_branch_points(struct regex_info *info) { int i, j; struct branch tmp; @@ -335,7 +350,7 @@ static void setup_branch_points(struct regex_info *info) { static int foo(const char *re, int re_len, const char *s, int s_len, struct regex_info *info) { - int result, i, step, depth = 0; + int i, step, depth = 0; const char *stack[ARRAY_SIZE(info->brackets)]; stack[0] = re; @@ -380,22 +395,9 @@ static int foo(const char *re, int re_len, const char *s, int s_len, } FAIL_IF(depth != 0, static_error_unbalanced_brackets); - setup_branch_points(info); - /* Scan the string from left to right, applying the regex. Stop on match. */ - result = 0; - for (i = 0; i < s_len; i++) { - result = doh(s + i, s_len - i, info, 0); - DBG((" (iter %d) -> %d [%.*s] [%.*s] [%s]\n", i, result, re_len, re, - s_len - i, s + i, info->error_msg)); - if (result > 0 || re[0] == '^') { - result += i; - break; - } - } - - return result; + return baz(s, s_len, info); } int slre_match(const char *regexp, const char *s, int s_len, @@ -479,6 +481,19 @@ int main(void) { const char *msg = ""; struct slre_cap caps[10]; + /* Metacharacters */ +#if 0 + ASSERT(slre_match("$", "abcd", 4, NULL, 0, &msg) == 4); + ASSERT(slre_match("^", "abcd", 4, NULL, 0, &msg) == 0); + ASSERT(slre_match("x|^", "abcd", 4, NULL, 0, &msg) == 0); + ASSERT(slre_match("x|$", "abcd", 4, NULL, 0, &msg) == 4); + ASSERT(slre_match("x", "abcd", 4, NULL, 0, &msg) == -1); + ASSERT(slre_match("\\\\", "c:\\Tools", 8, NULL, 0, &msg) == 3); + ASSERT(slre_match("\\\\.*", "c:\\Tools", 8, NULL, 0, &msg) == 8); + ASSERT(slre_match("\\\\.*$", "c:\\Tools", 8, NULL, 0, &msg) == 8); + ASSERT(slre_match("(?i)^.*\\\\.*$", "c:\\Tools", 8, NULL, 0, &msg) == 8); +#endif + /* Character sets */ ASSERT(slre_match("[abc]", "1c2", 3, NULL, 0, &msg) == 2); ASSERT(slre_match("[abc]", "1C2", 3, NULL, 0, &msg) == 0);