eina_slice: fix multi-byte find function, add tests.

This commit is contained in:
Gustavo Sverzut Barbieri 2016-08-23 18:41:20 -03:00
parent ae83b96030
commit 9944c164bd
2 changed files with 56 additions and 2 deletions

View File

@ -155,13 +155,13 @@ eina_slice_find(const Eina_Slice slice, const Eina_Slice needle)
if (slice.len == 0) return NULL;
if (needle.len == 0) return NULL;
if (slice.len < needle.len) return NULL;
if (slice.len == 1) return eina_slice_strchr(slice, needle.bytes[0]);
if (needle.len == 1) return eina_slice_strchr(slice, needle.bytes[0]);
if ((slice.len == needle.len) &&
(memcmp(slice.mem, needle.mem, needle.len) == 0))
return slice.mem;
s.mem = slice.mem;
s.len = slice.len - needle.len;
s.len = slice.len - (needle.len - 1);
c = needle.bytes[0];
n.mem = (const void *)(needle.bytes + 1);

View File

@ -209,6 +209,59 @@ START_TEST(eina_test_slice_print)
}
END_TEST
START_TEST(eina_test_slice_find)
{
Eina_Slice slice = EINA_SLICE_STR_LITERAL("abcdef");
const char *p;
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("a"));
fail_if(p == NULL);
ck_assert_str_eq(p, (const char *)slice.bytes);
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("ab"));
fail_if(p == NULL);
ck_assert_str_eq(p, (const char *)slice.bytes);
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("abc"));
fail_if(p == NULL);
ck_assert_str_eq(p, (const char *)slice.bytes);
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("f"));
fail_if(p == NULL);
ck_assert_str_eq(p, (const char *)slice.bytes + strlen("abcde"));
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("ef"));
fail_if(p == NULL);
ck_assert_str_eq(p, (const char *)slice.bytes + strlen("abcd"));
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("def"));
fail_if(p == NULL);
ck_assert_str_eq(p, (const char *)slice.bytes + strlen("abc"));
p = eina_slice_find(slice, slice);
fail_if(p == NULL);
ck_assert_str_eq(p, (const char *)slice.bytes);
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("x"));
fail_unless(p == NULL);
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("xyz"));
fail_unless(p == NULL);
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("xa"));
fail_unless(p == NULL);
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("xb"));
fail_unless(p == NULL);
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL("abcdefgh"));
fail_unless(p == NULL);
p = eina_slice_find(slice, (Eina_Slice)EINA_SLICE_STR_LITERAL(""));
fail_unless(p == NULL);
}
END_TEST
void
eina_test_slice(TCase *tc)
{
@ -216,4 +269,5 @@ eina_test_slice(TCase *tc)
tcase_add_test(tc, eina_test_slice_ro);
tcase_add_test(tc, eina_test_slice_rw);
tcase_add_test(tc, eina_test_slice_print);
tcase_add_test(tc, eina_test_slice_find);
}