diff options
author | Lars Wirzenius <liw@liw.fi> | 2010-10-25 09:37:06 +0100 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2010-10-25 09:37:06 +0100 |
commit | 0be32d20fecb5e34dfa4579110434ffe5530ffbc (patch) | |
tree | e0c079fc49590731789cdcf5cd7efc2933238b50 | |
parent | 883b5642a7e24e3b82364db32091758321b8f1df (diff) | |
download | dynstr-0be32d20fecb5e34dfa4579110434ffe5530ffbc.tar.gz |
Implement dynstr_last_string.
-rw-r--r-- | dynstr.c | 19 | ||||
-rw-r--r-- | unittests.c | 102 |
2 files changed, 121 insertions, 0 deletions
@@ -247,3 +247,22 @@ size_t dynstr_first_string(Dynstr *dynstr, size_t offset, Dynstr *pattern) return (size_t) (p - dynstr->mem); } + +size_t dynstr_last_string(Dynstr *dynstr, size_t offset, Dynstr *pattern) +{ + size_t result; + size_t new_result; + + /* GNU libc lacks a memrmem function, so we loop to the last + * dynstr_first_string match. */ + result = DYNSTR_NOT_FOUND; + for (;;) { + new_result = dynstr_first_string(dynstr, offset, pattern); + if (new_result == DYNSTR_NOT_FOUND) + break; + result = new_result; + offset = result + 1; + } + return result; +} + diff --git a/unittests.c b/unittests.c index 4004eec..d9b14d3 100644 --- a/unittests.c +++ b/unittests.c @@ -777,6 +777,102 @@ static int test_first_string_does_not_find_empty_pattern(void) } +static int test_last_string_finds_pattern(void) +{ + Dynstr *dynstr; + Dynstr *pattern; + size_t offset; + + dynstr = dynstr_new_from_cstring("123456"); + pattern = dynstr_new_from_cstring("345"); + offset = dynstr_last_string(dynstr, 0, pattern); + FAIL_UNLESS_EQUAL(offset, 2); + dynstr_free(dynstr); + dynstr_free(pattern); + return true; +} + + +static int test_last_string_only_finds_last_pattern(void) +{ + Dynstr *dynstr; + Dynstr *pattern; + size_t offset; + + dynstr = dynstr_new_from_cstring("123123"); + pattern = dynstr_new_from_cstring("123"); + offset = dynstr_last_string(dynstr, 0, pattern); + FAIL_UNLESS_EQUAL(offset, 3); + dynstr_free(dynstr); + dynstr_free(pattern); + return true; +} + + +static int test_last_string_does_not_find_nonexistent_pattern(void) +{ + Dynstr *dynstr; + Dynstr *pattern; + size_t offset; + + dynstr = dynstr_new_from_cstring("123456"); + pattern = dynstr_new_from_cstring("x"); + offset = dynstr_last_string(dynstr, 0, pattern); + FAIL_UNLESS_EQUAL(offset, DYNSTR_NOT_FOUND); + dynstr_free(dynstr); + dynstr_free(pattern); + return true; +} + + +static int test_last_string_does_not_find_pattern_outside_range(void) +{ + Dynstr *dynstr; + Dynstr *pattern; + size_t offset; + + dynstr = dynstr_new_from_cstring("123456"); + pattern = dynstr_new_from_cstring("123"); + offset = dynstr_last_string(dynstr, 3, pattern); + FAIL_UNLESS_EQUAL(offset, DYNSTR_NOT_FOUND); + dynstr_free(dynstr); + dynstr_free(pattern); + return true; +} + + +static int test_last_string_only_finds_pattern_inside_range(void) +{ + Dynstr *dynstr; + Dynstr *pattern; + size_t offset; + + dynstr = dynstr_new_from_cstring("123123"); + pattern = dynstr_new_from_cstring("3"); + offset = dynstr_last_string(dynstr, 3, pattern); + FAIL_UNLESS_EQUAL(offset, 5); + dynstr_free(dynstr); + dynstr_free(pattern); + return true; +} + + +static int test_last_string_does_not_find_empty_pattern(void) +{ + Dynstr *dynstr; + Dynstr *pattern; + size_t offset; + + dynstr = dynstr_new_from_cstring("123123"); + pattern = dynstr_new_from_cstring(""); + offset = dynstr_last_string(dynstr, 0, pattern); + FAIL_UNLESS_EQUAL(offset, DYNSTR_NOT_FOUND); + dynstr_free(dynstr); + dynstr_free(pattern); + return true; +} + + static void setup(void) { dynstr_init(); @@ -848,6 +944,12 @@ static const struct test tests[] = { TEST(test_first_string_does_not_find_pattern_outside_range), TEST(test_first_string_only_finds_pattern_inside_range), TEST(test_first_string_does_not_find_empty_pattern), + TEST(test_last_string_finds_pattern), + TEST(test_last_string_only_finds_last_pattern), + TEST(test_last_string_does_not_find_nonexistent_pattern), + TEST(test_last_string_does_not_find_pattern_outside_range), + TEST(test_last_string_only_finds_pattern_inside_range), + TEST(test_last_string_does_not_find_empty_pattern), }; static const int num_tests = sizeof(tests) / sizeof(tests[0]); |