Compare commits

...

2 commits

Author SHA1 Message Date
aecae2baa8 axl_string.h shouldn't depend on axl_memory.h 2025-12-02 17:17:13 +03:00
0b74748a0d axl_strstr 2025-12-02 17:16:04 +03:00
3 changed files with 144 additions and 1 deletions

View file

@ -139,3 +139,28 @@ const i8* axl_strchr(const i8* str, i8 c)
return (c == '\0') ? str : NULL;
}
i8* axl_strstr(const i8* str, const i8* substr)
{
if(!str || !substr)
{
return NULL;
}
if(*substr == '\0')
{
return (i8*)str;
}
u32 n = axl_strlen(substr);
while(*str)
{
if(!axl_strncmp(str++, substr, n))
{
return (i8*)(str - 1);
}
}
return NULL;
}

View file

@ -11,5 +11,5 @@ i8* axl_strncat(i8* dst, const i8* src, u32 n);
i32 axl_strcmp(const i8* s1, const i8* s2);
i32 axl_strncmp(const i8* s1, const i8* s2, u32 n);
const i8* axl_strchr(const i8* str, i8 c);
i8* axl_strstr(const i8* str, const i8* substr);
#endif // AXL_STRING

View file

@ -322,6 +322,124 @@ KOAN(strchr_returns_proper_ptr)
ASSERT_PTR_EQ(str + 7, axl_strchr(str, '\0'));
}
KOAN(strstr_null_pointer)
{
ASSERT_NULL(axl_strstr(NULL, "test"));
ASSERT_NULL(axl_strstr("test", NULL));
ASSERT_NULL(axl_strstr(NULL, NULL));
}
KOAN(strstr_empty_string)
{
i8 str[] = "";
ASSERT_NULL(axl_strstr(str, "test"));
ASSERT_PTR_EQ(str, axl_strstr(str, ""));
}
KOAN(strstr_empty_substring)
{
i8 str[] = "hello world";
ASSERT_PTR_EQ(str, axl_strstr(str, ""));
}
KOAN(strstr_exact_match)
{
i8 str[] = "hello world";
ASSERT_PTR_EQ(str, axl_strstr(str, "hello world"));
}
KOAN(strstr_prefix_match)
{
i8 str[] = "hello world";
ASSERT_PTR_EQ(str, axl_strstr(str, "hello"));
}
KOAN(strstr_suffix_match)
{
i8 str[] = "hello world";
ASSERT_PTR_EQ(str + 6, axl_strstr(str, "world"));
}
KOAN(strstr_middle_match)
{
i8 str[] = "hello world";
ASSERT_PTR_EQ(str + 2, axl_strstr(str, "llo"));
}
KOAN(strstr_single_char_match)
{
i8 str[] = "hello world";
ASSERT_PTR_EQ(str + 4, axl_strstr(str, "o"));
}
KOAN(strstr_multiple_occurrences)
{
i8 str[] = "hello world";
ASSERT_PTR_EQ(str + 4, axl_strstr(str, "o"));
}
KOAN(strstr_not_found)
{
i8 str[] = "hello world";
ASSERT_NULL(axl_strstr(str, "xyz"));
ASSERT_NULL(axl_strstr(str, "hello!"));
ASSERT_NULL(axl_strstr(str, "world!"));
}
KOAN(strstr_partial_match_but_not_full)
{
i8 str[] = "hello world";
ASSERT_NULL(axl_strstr(str, "helloo"));
ASSERT_NULL(axl_strstr(str, "worldd"));
}
KOAN(strstr_case_sensitive)
{
i8 str[] = "Hello World";
ASSERT_NULL(axl_strstr(str, "hello"));
ASSERT_NULL(axl_strstr(str, "world"));
ASSERT_PTR_EQ(str, axl_strstr(str, "Hello"));
ASSERT_PTR_EQ(str + 6, axl_strstr(str, "World"));
}
KOAN(strstr_with_null_bytes)
{
i8 str[] = "ab\0cde";
ASSERT_PTR_EQ(str, axl_strstr(str, "ab"));
ASSERT_NULL(axl_strstr(str, "cde"));
}
KOAN(strstr_longer_substring_than_string)
{
i8 str[] = "short";
ASSERT_NULL(axl_strstr(str, "longer string"));
}
KOAN(strstr_repeated_pattern)
{
i8 str[] = "ababab";
ASSERT_PTR_EQ(str, axl_strstr(str, "ab"));
ASSERT_PTR_EQ(str + 1, axl_strstr(str, "baba"));
}
KOAN(strstr_overlapping_match)
{
i8 str[] = "aaaaa";
ASSERT_PTR_EQ(str, axl_strstr(str, "aa"));
ASSERT_PTR_EQ(str, axl_strstr(str, "aaa"));
ASSERT_PTR_EQ(str, axl_strstr(str, "aaaa"));
ASSERT_PTR_EQ(str, axl_strstr(str, "aaaaa"));
}
KOAN(strstr_special_chars)
{
i8 str[] = "hello\tworld\n";
ASSERT_PTR_EQ(str, axl_strstr(str, "hello"));
ASSERT_PTR_EQ(str + 6, axl_strstr(str, "world"));
ASSERT_PTR_EQ(str + 5, axl_strstr(str, "\t"));
ASSERT_PTR_EQ(str + 11, axl_strstr(str, "\n"));
}
int main(void)
{
axl_init();