From 399be44fbc3767e7c1ff505119f9e07ee25b1078 Mon Sep 17 00:00:00 2001 From: Clement Sibille Date: Sun, 19 May 2024 23:33:44 +0900 Subject: Add String_eq and update the String API --- src/lisiblestd/string.c | 32 +++++++++++++++++++++++--------- src/lisiblestd/string.h | 13 +++++++++++-- tests/string.c | 29 ++++++++++++++++++++++++----- 3 files changed, 58 insertions(+), 16 deletions(-) diff --git a/src/lisiblestd/string.c b/src/lisiblestd/string.c index 3de3272..2b191b2 100644 --- a/src/lisiblestd/string.c +++ b/src/lisiblestd/string.c @@ -4,21 +4,18 @@ #include -bool String_from_str(Allocator *allocator, String *string, const char *str) { +String String_new(Allocator *allocator, const char *str) { LSTD_ASSERT(allocator != NULL); - LSTD_ASSERT(string != NULL); LSTD_ASSERT(str != NULL); usize length = strlen(str); - char *value = Allocator_allocate_array(allocator, length + 1, sizeof(char)); - if (!value) { - return false; - } + char *value = Allocator_allocate(allocator, length + 1); + LSTD_ASSERT(value != NULL); + + strncpy(value, str, length); value[length] = '\0'; - string->value = value; - string->length = length; - return true; + return (String){.value = value, .length = length}; } void String_destroy(Allocator *allocator, String *string) { @@ -27,7 +24,24 @@ void String_destroy(Allocator *allocator, String *string) { Allocator_free(allocator, string->value); } +bool String_eq(const String *lhs, const String *rhs) { + if (lhs == NULL || rhs == NULL || lhs->length != rhs->length) { + return false; + } + + return strncmp(lhs->value, rhs->value, lhs->length) == 0; +} + +StringView String_view(const String *str) { + return (StringView){.value = str->value, .length = str->length}; +} + usize String_length(const String *string) { LSTD_ASSERT(string != NULL); return string->length; } + +StringView StringView_from_str(const char *data) { + LSTD_ASSERT(data != NULL); + return (StringView){.value = data, .length = strlen(data)}; +} diff --git a/src/lisiblestd/string.h b/src/lisiblestd/string.h index 79ee6b8..cc7f3f4 100644 --- a/src/lisiblestd/string.h +++ b/src/lisiblestd/string.h @@ -9,11 +9,20 @@ struct String { char *value; usize length; }; - typedef struct String String; +typedef struct StringView StringView; -bool String_from_str(Allocator *allocator, String *string, const char *str); +String String_new(Allocator *allocator, const char *str); void String_destroy(Allocator *allocator, String *string); +bool String_eq(const String *lhs, const String *rhs); +StringView String_view(const String *str); usize String_length(const String *string); +struct StringView { + const char *value; + usize length; +}; + +StringView StringView_from_str(const char *data); + #endif // LSTD_STRING_H diff --git a/tests/string.c b/tests/string.c index e3d68f4..6b4d411 100644 --- a/tests/string.c +++ b/tests/string.c @@ -2,13 +2,32 @@ #include "test.h" #include -void t_String_from_str(void) { - String string; - String_from_str(&system_allocator, &string, "Some string"); - T_ASSERT(strncmp(string.value, "Some string", 11)); +void t_String_new(void) { + String string = String_new(&system_allocator, "Some string"); + T_ASSERT(strncmp(string.value, "Some string", 11) == 0); T_ASSERT_EQ(string.length, 11); + String_destroy(&system_allocator, &string); +} + +void t_String_eq(void) { + String first_string = String_new(&system_allocator, "abc"); + String second_string = String_new(&system_allocator, "abc"); + String third_string = String_new(&system_allocator, "bcd"); + T_ASSERT(String_eq(&first_string, &second_string)); + T_ASSERT(!String_eq(&second_string, &third_string)); + T_ASSERT(!String_eq(&second_string, NULL)); + T_ASSERT(!String_eq(NULL, NULL)); + String_destroy(&system_allocator, &first_string); + String_destroy(&system_allocator, &second_string); + String_destroy(&system_allocator, &third_string); +} +void t_String_view(void) { + String string = String_new(&system_allocator, "abc"); + StringView string_view = String_view(&string); + T_ASSERT_EQ(string_view.length, 3); + T_ASSERT(strncmp(string_view.value, "abc", 3) == 0); String_destroy(&system_allocator, &string); } -TEST_SUITE(TEST(t_String_from_str)) +TEST_SUITE(TEST(t_String_new), TEST(t_String_eq), TEST(t_String_view)) -- cgit v1.2.3