barbieri pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=9944c164bdeec56d3664ec6832e3a471a24930fd

commit 9944c164bdeec56d3664ec6832e3a471a24930fd
Author: Gustavo Sverzut Barbieri <[email protected]>
Date:   Tue Aug 23 18:41:20 2016 -0300

    eina_slice: fix multi-byte find function, add tests.
---
 src/lib/eina/eina_inline_slice.x |  4 +--
 src/tests/eina/eina_test_slice.c | 54 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/src/lib/eina/eina_inline_slice.x b/src/lib/eina/eina_inline_slice.x
index 27cca37..2f272ad 100644
--- a/src/lib/eina/eina_inline_slice.x
+++ b/src/lib/eina/eina_inline_slice.x
@@ -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);
diff --git a/src/tests/eina/eina_test_slice.c b/src/tests/eina/eina_test_slice.c
index ca73e73..5634ed4 100644
--- a/src/tests/eina/eina_test_slice.c
+++ b/src/tests/eina/eina_test_slice.c
@@ -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);
 }

-- 


Reply via email to