From 477ce90d019546e72dd6485139271806881a8e8e Mon Sep 17 00:00:00 2001 From: steven-na Date: Fri, 2 Oct 2026 00:28:52 -0700 Subject: lots of new string stuff --- src/string.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'src/string.c') diff --git a/src/string.c b/src/string.c index f9340dd..5ecb020 100644 --- a/src/string.c +++ b/src/string.c @@ -36,6 +36,22 @@ strng_t *strng_from(smrt_arena_t *arena, char const *c) { return s; } +strng_t *strng_from_sv(smrt_arena_t *arena, strng_view_t const *sv) { + u64 size = sv_len(sv); + + strng_t *s = strng_new(arena, size); + + if (!s) { + log_error("Failed to allocate strng"); + return NULL; + } + + memcpy((u8*)s+STRNG_BASE_POS, SV_TO(*sv), size); + s->len = size; + + return s; +} + strng_t *strng_dup(smrt_arena_t *arena, strng_t const *src) { u64 size = src->len + sizeof(strng_t); @@ -144,6 +160,19 @@ void strng_map(strng_t *string, char (F)(char c)) { } } +b32 strng_validate(strng_t const *string, string_validation_func validation) { + u64 l = string->len; + if (l == 0) return true; + + for (u64 i = 0; i < l; i++) { + char c = *(STRNG_TO(string)+i); + if (!validation(c)) { + return false; + } + } + + return true; +} strng_view_t sv_from_chars(char const* c) { u64 l = strlen(c); return (strng_view_t){ .start=0, @@ -252,6 +281,20 @@ void sv_set_len_right(strng_view_t *sv, u64 n) { sv->start = sv->end - n + 1; } +u64 sv_read_n(strng_view_t *sv, char *buf, u64 n) { + u64 l = sv_len(sv); + if (n > l) { + n = l; + } + + if (n == 0) return 0; + + memcpy(buf, SV_TO(*sv), n); + + sv->start += n; + + return n; +} char sv_get_start(strng_view_t const *sv) { if (sv_len(sv)) { return *(sv->string + sv->start); @@ -398,6 +441,20 @@ b32 sv_eq_case_insensitive(strng_view_t const *sv1, strng_view_t const *sv2) { return true; } +b32 sv_validate(strng_view_t const *sv, string_validation_func validation) { + u64 l = sv_len(sv); + if (l == 0) return true; + + for (u64 i = 0; i < l; i++) { + char c = *(sv->string+sv->start+i); + if (!validation(c)) { + return false; + } + } + + return true; +} + strng_view_t sv_split_once(strng_view_t *sv, char const *needle) { u64 nlen = strlen(needle); u64 hlen = sv_len(sv); -- cgit v1.2.3