From 0b74748a0d7e4a1d07db59d948fdd23361b7b4fd Mon Sep 17 00:00:00 2001 From: NukeBird Date: Tue, 2 Dec 2025 17:16:04 +0300 Subject: [PATCH] axl_strstr --- axl_string.c | 26 ++++++++++ axl_string.h | 2 +- axl_string_test.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 1 deletion(-) diff --git a/axl_string.c b/axl_string.c index 7fafcd0..1cc060a 100644 --- a/axl_string.c +++ b/axl_string.c @@ -1,4 +1,5 @@ #include "axl_string.h" +#include "axl_memory.h" u32 axl_strlen(const i8* s) { @@ -139,3 +140,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_memcmp(str++, substr, n)) + { + return (i8*)(str - 1); + } + } + + return NULL; +} diff --git a/axl_string.h b/axl_string.h index 5c65cb2..7ea2da2 100644 --- a/axl_string.h +++ b/axl_string.h @@ -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 diff --git a/axl_string_test.c b/axl_string_test.c index 6019c7d..c6f7bcf 100644 --- a/axl_string_test.c +++ b/axl_string_test.c @@ -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();