summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsteven-na <noreply.github@stvnc.dev>2026-10-02 00:28:52 -0700
committersteven-na <noreply.github@stvnc.dev>2026-10-02 00:28:52 -0700
commit477ce90d019546e72dd6485139271806881a8e8e (patch)
treebf0abaa1529c7f56a7370c121e69d6d7e9186fc3 /src
parente01d3f64d42e2fe88f737d4616424b1c5949ae85 (diff)
lots of new string stuff
Diffstat (limited to 'src')
-rw-r--r--src/string.c57
-rw-r--r--src/string.h49
2 files changed, 88 insertions, 18 deletions
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);
diff --git a/src/string.h b/src/string.h
index 2259582..9620793 100644
--- a/src/string.h
+++ b/src/string.h
@@ -17,30 +17,37 @@ typedef struct {
char const *string;
} strng_view_t;
-strng_t * strng_new(smrt_arena_t *arena, u64 size);
-strng_t *strng_from(smrt_arena_t *arena, char const *c);
-strng_t * strng_dup(smrt_arena_t *arena, strng_t const *src);
- char * strng_str(smrt_arena_t *arena, strng_t const *string);
- i32 strng_set(strng_t *string, char const *c);
- i32 strng_set_ic(strng_t *string, u64 i, char c);
+strng_t * strng_new(smrt_arena_t *arena, u64 size);
+strng_t * strng_from(smrt_arena_t *arena, char const *c);
+strng_t *strng_from_sv(smrt_arena_t *arena, strng_view_t const *sv);
+strng_t * strng_dup(smrt_arena_t *arena, strng_t const *src);
+ char * strng_str(smrt_arena_t *arena, strng_t const *string);
+ i32 strng_set(strng_t *string, char const *c);
+ i32 strng_set_ic(strng_t *string, u64 i, char c);
// Append to strng, returns -1 if no space, new len otherwise
- i32 strng_app(strng_t *dest, strng_t const *source);
+ i32 strng_app(strng_t *dest, strng_t const *source);
// Append char* to strng, returns -1 if no space, new len otherwise
- i32 strng_app_c(strng_t *dest, char const *source);
+ i32 strng_app_c(strng_t *dest, char const *source);
// Append sv to strng, returns -1 if no space, new len otherwise
- i32 strng_app_v(strng_t *dest, strng_view_t const *source);
- void strng_clear(strng_t *string);
+ i32 strng_app_v(strng_t *dest, strng_view_t const *source);
+ void strng_clear(strng_t *string);
char *strng_malloc_str(strng_t const *string);
// Applies F to each char in string and updates the value
void strng_map(strng_t *string, char (F)(char c));
-#define STRNG_TO(s) (char *)((u8*)(s)+STRNG_BASE_POS)
-#define STRNG_FMT(s) (i32)s->len, (char *)((u8*)(s)+STRNG_BASE_POS)
+typedef b32 (*string_validation_func)(char c) ;
+// Runs *validation on each char in the string and returns true if all checks return true. If string.len == 0, returns true.
+b32 strng_validate(strng_t const *string, string_validation_func validation);
-#define SV_TO(sv) (char *)((u8*)((sv).string) + (sv).start)
-#define SV_FMT(sv) (i32)(sv_len(&(sv))), SV_TO((sv))
+#define STRNG_TO(s) (char *)((u8*)(s)+STRNG_BASE_POS)
+#define STRNG_FMT(s) (i32)(s)->len, (char *)(((u8*)(s))+STRNG_BASE_POS)
+#define STRNG_MAPKEY(s) (u8*)STRNG_TO((s)), (s)->len
+
+#define SV_TO(sv) (char *)((u8*)((sv).string) + (sv).start)
+#define SV_FMT(sv) (i32)(sv_len(&(sv))), SV_TO((sv))
+#define SV_MAPKEY(sv) (u8*)SV_TO((sv)), sv_len(&(sv))
static inline strng_view_t sv_from(strng_t const *string) {
return (strng_view_t){
@@ -111,19 +118,22 @@ void sv_set_len_left (strng_view_t *sv, u64 n);
// Sets length keeping end
void sv_set_len_right(strng_view_t *sv, u64 n);
+#define sv_pop_start(sv) sv_pop_left(sv)
+#define sv_pop_end(sv) sv_pop_right(sv)
static inline void sv_pop_left (strng_view_t *sv) { if (sv->start <= sv->end) sv->start++; }
static inline void sv_pop_right(strng_view_t *sv) { if (sv->end >= sv->start) sv->end--; }
static inline void sv_popn_left (strng_view_t *sv, u64 n) { for (u64 i = 0; i < n; i++) sv_pop_left(sv); }
static inline void sv_popn_right(strng_view_t *sv, u64 n) { for (u64 i = 0; i < n; i++) sv_pop_right(sv); }
+u64 sv_read_n(strng_view_t *sv, char *buf, u64 n);
+
char sv_get_start(strng_view_t const *sv);
char sv_get_end(strng_view_t const *sv);
-static inline void sv_reset(strng_view_t *sv) {
- sv->start=0;
- sv->end = sv->max;
-}
+static inline void sv_reset(strng_view_t *sv) { sv->start = 0;
+ sv->end = sv->max; }
+
static inline void sv_reset_right(strng_view_t *sv) { sv->end = sv->max; }
static inline void sv_reset_left(strng_view_t *sv) { sv->start = 0; }
@@ -144,6 +154,9 @@ static inline b32 sv_ends_with_c(strng_view_t const *sv, char c) { return
b32 sv_eq_case_insensitive(strng_view_t const *sv1, strng_view_t const *sv2);
+// Runs *validation on each char in the sv and returns true if all checks return true. If sv_len(sv) == 0, returns true.
+b32 sv_validate(strng_view_t const *sv, string_validation_func validation);
+
strng_view_t sv_split_once(strng_view_t *sv, char const *needle);
strng_view_t sv_split_once_c(strng_view_t *sv, char n);