diff options
author | Lars Wirzenius <liw@liw.fi> | 2010-10-25 09:28:30 +0100 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2010-10-25 09:28:30 +0100 |
commit | 883b5642a7e24e3b82364db32091758321b8f1df (patch) | |
tree | c6bc108f395dfa602bc63eb792ec31d382bf70d0 | |
parent | 05fd0b47a1d97c453676d7d92716eee8a5eb72a1 (diff) | |
download | dynstr-883b5642a7e24e3b82364db32091758321b8f1df.tar.gz |
Implement dynstr_first_string.
-rw-r--r-- | dynstr.c | 16 | ||||
-rw-r--r-- | unittests.c | 102 |
2 files changed, 118 insertions, 0 deletions
@@ -231,3 +231,19 @@ size_t dynstr_last_byte(Dynstr *dynstr, size_t offset, int byte) return (size_t) (p - dynstr->mem); } + +size_t dynstr_first_string(Dynstr *dynstr, size_t offset, Dynstr *pattern) +{ + const unsigned char *p; + + if (offset >= dynstr->size) + return DYNSTR_NOT_FOUND; + if (pattern->size == 0) + return DYNSTR_NOT_FOUND; + p = memmem(dynstr->mem + offset, dynstr->size - offset, + pattern->mem, pattern->size); + if (p == NULL) + return DYNSTR_NOT_FOUND; + return (size_t) (p - dynstr->mem); +} + diff --git a/unittests.c b/unittests.c index 24935ad..4004eec 100644 --- a/unittests.c +++ b/unittests.c @@ -681,6 +681,102 @@ static int test_last_byte_only_finds_byte_inside_range(void) } +static int test_first_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_first_string(dynstr, 0, pattern); + FAIL_UNLESS_EQUAL(offset, 2); + dynstr_free(dynstr); + dynstr_free(pattern); + return true; +} + + +static int test_first_string_only_finds_first_pattern(void) +{ + Dynstr *dynstr; + Dynstr *pattern; + size_t offset; + + dynstr = dynstr_new_from_cstring("123123"); + pattern = dynstr_new_from_cstring("123"); + offset = dynstr_first_string(dynstr, 0, pattern); + FAIL_UNLESS_EQUAL(offset, 0); + dynstr_free(dynstr); + dynstr_free(pattern); + return true; +} + + +static int test_first_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_first_string(dynstr, 0, pattern); + FAIL_UNLESS_EQUAL(offset, DYNSTR_NOT_FOUND); + dynstr_free(dynstr); + dynstr_free(pattern); + return true; +} + + +static int test_first_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_first_string(dynstr, 3, pattern); + FAIL_UNLESS_EQUAL(offset, DYNSTR_NOT_FOUND); + dynstr_free(dynstr); + dynstr_free(pattern); + return true; +} + + +static int test_first_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_first_string(dynstr, 3, pattern); + FAIL_UNLESS_EQUAL(offset, 5); + dynstr_free(dynstr); + dynstr_free(pattern); + return true; +} + + +static int test_first_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_first_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(); @@ -746,6 +842,12 @@ static const struct test tests[] = { TEST(test_last_byte_does_not_find_nonexistent_byte), TEST(test_last_byte_does_not_find_byte_outside_range), TEST(test_last_byte_only_finds_byte_inside_range), + TEST(test_first_string_finds_pattern), + TEST(test_first_string_only_finds_first_pattern), + TEST(test_first_string_does_not_find_nonexistent_pattern), + 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), }; static const int num_tests = sizeof(tests) / sizeof(tests[0]); |