diff options
author | Lars Wirzenius <liw@liw.fi> | 2010-10-24 22:56:10 +0100 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2010-10-24 22:56:10 +0100 |
commit | f02f6787f36808663b17091d530bd91391a0b390 (patch) | |
tree | fe18aff82c0ddcd534c5f505cb8973ea648a4678 | |
parent | e68e53a99c1c27acd156faf685ef2a07315ecfd1 (diff) | |
download | dynstr-f02f6787f36808663b17091d530bd91391a0b390.tar.gz |
Implement dynstr_first_byte.
-rw-r--r-- | dynstr.c | 13 | ||||
-rw-r--r-- | dynstr.h | 10 | ||||
-rw-r--r-- | unittests.c | 70 |
3 files changed, 87 insertions, 6 deletions
@@ -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); +} + @@ -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]); |