diff --git a/axl_string.c b/axl_string.c index 4e9c6c6..3eb6894 100644 --- a/axl_string.c +++ b/axl_string.c @@ -108,7 +108,7 @@ i32 axl_strncmp(const i8* s1, const i8* s2, u32 n) return (s1 == s2) ? 0 : (!s1 ? -1 : 1); } - for (u32 i = 0; i < n; s1++, s2++) + for (u32 i = 0; i < n; s1++, s2++, i++) { u8 c1 = *(const u8*)s1; u8 c2 = *(const u8*)s2; @@ -124,6 +124,11 @@ i32 axl_strncmp(const i8* s1, const i8* s2, u32 n) const i8* axl_strchr(const i8* str, i8 c) { + if(!str) + { + return NULL; + } + u32 i = 0; while(str[i] != '\0') diff --git a/axl_string.h b/axl_string.h index 0e4431f..9dc8c3d 100644 --- a/axl_string.h +++ b/axl_string.h @@ -9,6 +9,7 @@ i8* axl_strncpy(i8* dst, const i8* src, u32 n); i8* axl_strcat(i8* dst, const i8* src); 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); #endif // AXL_STRING diff --git a/axl_string_test.c b/axl_string_test.c index c7cc3b2..492b4b8 100644 --- a/axl_string_test.c +++ b/axl_string_test.c @@ -24,6 +24,11 @@ KOAN(strlen_with_special_chars) ASSERT_UINT_EQ(12, axl_strlen(s)); } +KOAN(strlen_null) +{ + ASSERT_UINT_EQ(0, axl_strlen(NULL)); +} + KOAN(strcpy_basic) { i8* src = (i8*)"test"; @@ -51,6 +56,17 @@ KOAN(strcpy_empty) axl_free(dst); } +KOAN(strcpy_null_dst) +{ + i8 buf[10]; + ASSERT_PTR_EQ(buf, axl_strcpy(buf, NULL)); +} + +KOAN(strcpy_null_src) +{ + ASSERT_NULL(axl_strcpy(NULL, (const i8*)"test")); +} + KOAN(strncpy_exact) { i8* src = (i8*)"hello"; @@ -91,6 +107,22 @@ KOAN(strncpy_pads_with_nulls) axl_free(dst); } +KOAN(strncpy_zero_n) +{ + i8 dst[10] = {'w'}; + axl_strncpy(dst, (const i8*)"test", 0); + ASSERT_INT_EQ('w', dst[0]); +} + +KOAN(strncpy_embedded_null) +{ + i8* dst = (i8*)axl_malloc(10); + i8* src = (i8*)"ab\0cde"; + axl_strncpy(dst, src, 5); + ASSERT_TRUE(memcmp(dst, "ab\0\0\0", 5) == 0); + axl_free(dst); +} + KOAN(strcat_basic) { i8* dst = (i8*)axl_malloc(20); @@ -152,11 +184,18 @@ KOAN(strncat_always_null_terminates) i8* result = axl_strncat(dst, (i8*)"123456789", 3); ASSERT_PTR_EQ(dst, result); ASSERT_STR_EQ("test123", (const char*)dst); - ASSERT_INT_EQ(0, (int)dst[7]); // Ensure null at position 7 + ASSERT_INT_EQ(0, (int)dst[7]); axl_free(dst); } +KOAN(strncat_zero_n) +{ + i8 dst[10] = "hi"; + axl_strncat(dst, (const i8*)"world", 0); + ASSERT_STR_EQ("hi", (char*)dst); +} + KOAN(strcmp_equal) { i8* s1 = (i8*)"hello"; @@ -199,40 +238,79 @@ KOAN(strcmp_first_empty) ASSERT_TRUE(axl_strcmp(s1, s2) < 0); } -KOAN(strlen_null) -{ - ASSERT_UINT_EQ(0, axl_strlen(NULL)); -} - -KOAN(strcpy_null_dst) -{ - i8 buf[10]; - ASSERT_PTR_EQ(buf, axl_strcpy(buf, NULL)); -} - -KOAN(strcpy_null_src) -{ - ASSERT_NULL(axl_strcpy(NULL, (const i8*)"test")); -} - -KOAN(strncpy_zero_n) +KOAN(strncmp_equal_shorter_n) { - i8 dst[10] = {'w'}; - axl_strncpy(dst, (const i8*)"test", 0); - ASSERT_INT_EQ('w', dst[0]); + i8* s1 = (i8*)"hello"; + i8* s2 = (i8*)"help!"; + ASSERT_INT_EQ(0, axl_strncmp(s1, s2, 3)); } -KOAN(strncat_zero_n) +KOAN(strncmp_equal_longer_n) { - i8 dst[10] = "hi"; - axl_strncat(dst, (const i8*)"world", 0); - ASSERT_STR_EQ("hi", (char*)dst); + i8* s1 = (i8*)"test"; + i8* s2 = (i8*)"test"; + ASSERT_INT_EQ(0, axl_strncmp(s1, s2, 10)); +} + +KOAN(strncmp_differs_at_n) +{ + i8* s1 = (i8*)"hello"; + i8* s2 = (i8*)"helma"; + ASSERT_TRUE(axl_strncmp(s1, s2, 5) < 0); +} + +KOAN(strncmp_zero_n) +{ + i8* s1 = (i8*)"hello"; + i8* s2 = (i8*)"world"; + ASSERT_INT_EQ(0, axl_strncmp(s1, s2, 0)); +} + +KOAN(strncmp_null_ptrs) +{ + ASSERT_INT_EQ(0, axl_strncmp(NULL, NULL, 5)); + ASSERT_TRUE(axl_strncmp(NULL, (i8*)"test", 5) < 0); + ASSERT_TRUE(axl_strncmp((i8*)"test", NULL, 5) > 0); +} + +KOAN(strchr_null) +{ + ASSERT_NULL(axl_strchr(NULL, 'a')); +} + +KOAN(strchr_empty) +{ + i8 str[] = ""; + ASSERT_NULL(axl_strchr(str, 'a')); +} + +KOAN(strchr_not_found) +{ + i8 str[] = "hello"; + ASSERT_NULL(axl_strchr(str, 'x')); +} + +KOAN(strchr_first_char) +{ + i8 str[] = "hello"; + ASSERT_PTR_EQ(str, axl_strchr(str, 'h')); +} + +KOAN(strchr_last_char) +{ + i8 str[] = "hello"; + ASSERT_PTR_EQ(str + 4, axl_strchr(str, 'o')); +} + +KOAN(strchr_null_terminator) +{ + i8 str[] = "hello"; + ASSERT_PTR_EQ(str + 5, axl_strchr(str, '\0')); } KOAN(strchr_returns_proper_ptr) { i8 str[] = "hi Mark"; - ASSERT_PTR_EQ(str + 0, axl_strchr(str, 'h')); ASSERT_PTR_EQ(str + 1, axl_strchr(str, 'i')); ASSERT_PTR_EQ(str + 2, axl_strchr(str, ' ')); @@ -240,9 +318,8 @@ KOAN(strchr_returns_proper_ptr) ASSERT_PTR_EQ(str + 4, axl_strchr(str, 'a')); ASSERT_PTR_EQ(str + 5, axl_strchr(str, 'r')); ASSERT_PTR_EQ(str + 6, axl_strchr(str, 'k')); - - ASSERT_NULL(axl_strchr(str, '\0')); ASSERT_NULL(axl_strchr(str, 'm')); + ASSERT_PTR_EQ(str + 7, axl_strchr(str, '\0')); } int main(void)