summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2010-10-25 09:37:06 +0100
committerLars Wirzenius <liw@liw.fi>2010-10-25 09:37:06 +0100
commit0be32d20fecb5e34dfa4579110434ffe5530ffbc (patch)
treee0c079fc49590731789cdcf5cd7efc2933238b50
parent883b5642a7e24e3b82364db32091758321b8f1df (diff)
downloaddynstr-0be32d20fecb5e34dfa4579110434ffe5530ffbc.tar.gz
Implement dynstr_last_string.
-rw-r--r--dynstr.c19
-rw-r--r--unittests.c102
2 files changed, 121 insertions, 0 deletions
diff --git a/dynstr.c b/dynstr.c
index 076f277..66da740 100644
--- a/dynstr.c
+++ b/dynstr.c
@@ -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]);