summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2010-10-24 22:56:10 +0100
committerLars Wirzenius <liw@liw.fi>2010-10-24 22:56:10 +0100
commitf02f6787f36808663b17091d530bd91391a0b390 (patch)
treefe18aff82c0ddcd534c5f505cb8973ea648a4678
parente68e53a99c1c27acd156faf685ef2a07315ecfd1 (diff)
downloaddynstr-f02f6787f36808663b17091d530bd91391a0b390.tar.gz
Implement dynstr_first_byte.
-rw-r--r--dynstr.c13
-rw-r--r--dynstr.h10
-rw-r--r--unittests.c70
3 files changed, 87 insertions, 6 deletions
diff --git a/dynstr.c b/dynstr.c
index 777ed28..bff6460 100644
--- a/dynstr.c
+++ b/dynstr.c
@@ -205,3 +205,16 @@ int dynstr_byte_at(Dynstr *dynstr, size_t offset)
return dynstr->mem[offset];
}
+
+size_t dynstr_first_byte(Dynstr *dynstr, size_t offset, int byte)
+{
+ unsigned char *p;
+
+ if (offset >= dynstr->size)
+ return DYNSTR_NOT_FOUND;
+ p = memchr(dynstr->mem + offset, byte, dynstr->size - offset);
+ if (p == NULL)
+ return DYNSTR_NOT_FOUND;
+ return (size_t) (p - dynstr->mem);
+}
+
diff --git a/dynstr.h b/dynstr.h
index f7ff523..b532074 100644
--- a/dynstr.h
+++ b/dynstr.h
@@ -121,17 +121,15 @@ size_t dynstr_memcpy(void *mem, Dynstr *dynstr, size_t offset, size_t size);
* within a given range. Return offset of matching byte, or
* DYNSTR_NOT_FOUND if not found. Offset is from beginning of string,
* not beginning of range. */
-size_t dynstr_first_byte(Dynstr *dynstr, size_t offset, size_t size, int byte);
-size_t dynstr_last_byte(Dynstr *dynstr, size_t offset, size_t size, int byte);
+size_t dynstr_first_byte(Dynstr *dynstr, size_t offset, int byte);
+size_t dynstr_last_byte(Dynstr *dynstr, size_t offset, int byte);
/* Search for first or last occurrence of a substring in a string,
* within a given range. Return offset of match, or
* DYNSTR_NOT_FOUND if not found. Offset is from beginning of string,
* not beginning of range. */
-size_t dynstr_first_string(Dynstr *dynstr, size_t offset, size_t size,
- Dynstr *pattern);
-size_t dynstr_last_string(Dynstr *dynstr, size_t offset, size_t size,
- Dynstr *pattern);
+size_t dynstr_first_string(Dynstr *dynstr, size_t offset, Dynstr *pattern);
+size_t dynstr_last_string(Dynstr *dynstr, size_t offset, Dynstr *pattern);
/* Write a dynamic string into an open file, either FILE or a Unix file
* handle. Return value is number of bytes written, just like for fwrite(3).
diff --git a/unittests.c b/unittests.c
index e651ea9..2e2aa78 100644
--- a/unittests.c
+++ b/unittests.c
@@ -551,6 +551,71 @@ static int test_byteat_reports_0xff_correctly(void)
}
+static int test_first_byte_finds_byte(void)
+{
+ Dynstr *dynstr;
+ size_t offset;
+
+ dynstr = dynstr_new_from_cstring("123456");
+ offset = dynstr_first_byte(dynstr, 0, '3');
+ FAIL_UNLESS_EQUAL(offset, 2);
+ dynstr_free(dynstr);
+ return true;
+}
+
+
+static int test_first_byte_only_finds_first_byte(void)
+{
+ Dynstr *dynstr;
+ size_t offset;
+
+ dynstr = dynstr_new_from_cstring("123123");
+ offset = dynstr_first_byte(dynstr, 0, '3');
+ FAIL_UNLESS_EQUAL(offset, 2);
+ dynstr_free(dynstr);
+ return true;
+}
+
+
+static int test_first_byte_does_not_find_nonexistent_byte(void)
+{
+ Dynstr *dynstr;
+ size_t offset;
+
+ dynstr = dynstr_new_from_cstring("123456");
+ offset = dynstr_first_byte(dynstr, 0, 'x');
+ FAIL_UNLESS_EQUAL(offset, DYNSTR_NOT_FOUND);
+ dynstr_free(dynstr);
+ return true;
+}
+
+
+static int test_first_byte_does_not_find_byte_outside_range(void)
+{
+ Dynstr *dynstr;
+ size_t offset;
+
+ dynstr = dynstr_new_from_cstring("123456");
+ offset = dynstr_first_byte(dynstr, 4, '3');
+ FAIL_UNLESS_EQUAL(offset, DYNSTR_NOT_FOUND);
+ dynstr_free(dynstr);
+ return true;
+}
+
+
+static int test_first_byte_only_finds_byte_inside_range(void)
+{
+ Dynstr *dynstr;
+ size_t offset;
+
+ dynstr = dynstr_new_from_cstring("123123");
+ offset = dynstr_first_byte(dynstr, 3, '3');
+ FAIL_UNLESS_EQUAL(offset, 5);
+ dynstr_free(dynstr);
+ return true;
+}
+
+
static void setup(void)
{
dynstr_init();
@@ -606,6 +671,11 @@ static const struct test tests[] = {
TEST(test_byteat_reports_correct_character),
TEST(test_byteat_reports_error_for_too_large_offset),
TEST(test_byteat_reports_0xff_correctly),
+ TEST(test_first_byte_finds_byte),
+ TEST(test_first_byte_only_finds_first_byte),
+ TEST(test_first_byte_does_not_find_nonexistent_byte),
+ TEST(test_first_byte_does_not_find_byte_outside_range),
+ TEST(test_first_byte_only_finds_byte_inside_range),
};
static const int num_tests = sizeof(tests) / sizeof(tests[0]);