fixed and reworked cutils_memmem() and added more tests for string_find_str()

AuthorKonata <konata@posteo.jp>
Date
Commitd893ce4a2c75403ef13588b5328737e9726b47b5
Parente2601f0
2 files changed, 74 insertions(+), 8 deletions(-)
▾Msrc/extensions.c
@@ -68,27 +68,59 @@ char* cutil_strndup(const char* s, size_t n)
bool cutil_memmem(const void* haystack, size_t haystacklen, const void* needle, size_t needlelen, size_t* pos)
{
size_t i, j;
size_t newoffset, offset = 0, i, j;
const byte* haystackb = haystack;
const byte* needleb = needle;
byte* start;
bool newoffset_set = false;
if(needlelen == 0)
{
*pos = 0;
return true;
}
if(HEDLEY_UNLIKELY((haystacklen == 0 && needlelen != 0 )|| haystacklen < needlelen))
if(HEDLEY_UNLIKELY((haystacklen == 0 && needlelen > 0 )|| haystacklen < needlelen))
return false;
//TODO: use memchr as base search
for(i = 0; i < haystacklen; i++)
CUTIL_LOOP
{
for(j = 0, *pos = i; j < needlelen && i < haystacklen; j++, i++)
start = memchr(haystackb+offset, needleb[0], haystacklen-offset);
if(!start)
{
return false;
} else if(needlelen == 1) {
*pos = (size_t)(start-haystackb);
return true;
}
for(i = (size_t)(start-haystackb+1), j = 1; i < haystacklen && j < needlelen; i++, j++)
{
if(!newoffset_set && haystackb[i] == needleb[0])
{
newoffset = i;
newoffset_set = true;
}
if(haystackb[i] != needleb[j])
{
break;
else if(j == needlelen-1)
} else if(j == needlelen-1) {
*pos = (size_t)(start-haystackb);
return true;
}
}
if(newoffset_set)
{
offset = newoffset;
newoffset_set = false;
} else {
offset = i;
}
}
return false;
}
▾Msrc/test.c
@@ -108,11 +108,44 @@ static void test_string(void)
delete_string(string2);
delete_string(string);
string = from_cstring("abcd", truth);
string2 = from_cstring("cd", truth);
string = from_cstring("abababcd", truth);
string2 = from_cstring("ababcd", truth);
assert(string_find_str(string, string2, &tmp));
assert(tmp == 2);
delete_string(string2);
delete_string(string);
string = from_cstring("abab", truth);
string2 = from_cstring("abc", truth);
assert(!string_find_str(string, string2, &tmp));
delete_string(string2);
delete_string(string);
string = from_cstring("abababcd", truth);
string2 = from_cstring("ab", truth);
assert(string_find_str(string, string2, &tmp));
assert(tmp == 0);
delete_string(string2);
delete_string(string);
string = from_cstring("ABC ABCDAB ABCDABCDABDE", truth);
string2 = from_cstring("ABCDABD", truth);
assert(string_find_str(string, string2, &tmp));
assert(tmp == 15);
delete_string(string2);
delete_string(string);
string = from_cstring("asdasdasdasdp", truth);
string2 = from_cstring("p", truth);
assert(string_find_str(string, string2, &tmp));
assert(tmp == 12);
delete_string(string2);
delete_string(string);
string = from_cstring("asdpsdasdasdpa", truth);
string2 = from_cstring("pa", truth);
assert(string_find_str(string, string2, &tmp));
assert(tmp == 12);
delete_string(string2);
delete_string(string);
@@ -385,3 +418,4 @@ int main(int argc, char** argv)
return 0;
}
/* TODO: split up test files */