From 538cfdafa5976487cb03afc44f4ef745e9b1dcea Mon Sep 17 00:00:00 2001 From: ThoNohT Date: Thu, 14 May 2026 21:39:51 +0200 Subject: [PATCH] noh.h: Add noh_sv_copy_cstr and noh_sv_compare --- src/noh.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/noh.h b/src/noh.h index 226b956..f57a8ff 100644 --- a/src/noh.h +++ b/src/noh.h @@ -357,6 +357,9 @@ typedef struct { const char *elems; } Noh_String_View; +// Copies a c-string to the arena and returns it as a Noh_String_View. +Noh_String_View noh_sv_copy_cstr(Noh_Arena *arena, const char *cstr); + // Appends a Noh_String_View view into a Noh_String. void noh_string_append_sv(Noh_String *string, Noh_String_View sv); @@ -403,6 +406,13 @@ Noh_String_View noh_sv_from_cstr(const char *cstr); // Creates a string view from a string. Noh_String_View noh_sv_from_string(const Noh_String *string); +// Compares two string views. +// Returns: +// - 0 if the two strings are equal. +// - A negative value if a is smaller than b. +// - A positive value if a is greater than b. +int noh_sv_compare(Noh_String_View a, Noh_String_View b); + // Checks whether to string views contain the same string. bool noh_sv_eq(Noh_String_View a, Noh_String_View b); @@ -883,6 +893,13 @@ defer: ///////////////////////// String view ///////////////////////// +Noh_String_View noh_sv_copy_cstr(Noh_Arena *arena, const char *cstr) { + size_t len = strlen(cstr); + char *buffer = noh_arena_alloc(arena, len); + memcpy(buffer, cstr, len); + return (Noh_String_View){ .elems = buffer, .count = len }; +} + void noh_string_append_sv(Noh_String *string, Noh_String_View sv) { noh_da_append_multiple(string, sv.elems, sv.count); } @@ -999,6 +1016,18 @@ Noh_String_View noh_sv_from_string(const Noh_String *string) { return result; } +int noh_sv_compare(Noh_String_View a, Noh_String_View b) { + size_t count = a.count; + if (b.count < a.count) count = b.count; + + for (size_t i = 0; i < count; i++) { + if (a.elems[i] == b.elems[i]) continue; + return a.elems[i] - b.elems[i]; + } + + return a.count - b.count; +} + bool noh_sv_eq(Noh_String_View a, Noh_String_View b) { if (a.count != b.count) return false;