summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lisiblestd/string.c32
-rw-r--r--src/lisiblestd/string.h13
-rw-r--r--tests/string.c29
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 <string.h>
-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 <lisiblestd/string.h>
-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))
Go back to lisible.xyz