summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2010-10-25 09:28:30 +0100
committerLars Wirzenius <liw@liw.fi>2010-10-25 09:28:30 +0100
commit883b5642a7e24e3b82364db32091758321b8f1df (patch)
treec6bc108f395dfa602bc63eb792ec31d382bf70d0
parent05fd0b47a1d97c453676d7d92716eee8a5eb72a1 (diff)
downloaddynstr-883b5642a7e24e3b82364db32091758321b8f1df.tar.gz
Implement dynstr_first_string.
-rw-r--r--dynstr.c16
-rw-r--r--unittests.c102
2 files changed, 118 insertions, 0 deletions
diff --git a/dynstr.c b/dynstr.c
index b160b58..076f277 100644
--- a/dynstr.c
+++ b/dynstr.c
@@ -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]);