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 +++++++++++-- 2 files changed, 34 insertions(+), 11 deletions(-) (limited to 'src') 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 -- cgit v1.2.3