diff options
| author | steven-na <noreply.github@stvnc.dev> | 2026-10-02 00:28:52 -0700 |
|---|---|---|
| committer | steven-na <noreply.github@stvnc.dev> | 2026-10-02 00:28:52 -0700 |
| commit | 477ce90d019546e72dd6485139271806881a8e8e (patch) | |
| tree | bf0abaa1529c7f56a7370c121e69d6d7e9186fc3 /src/string.h | |
| parent | e01d3f64d42e2fe88f737d4616424b1c5949ae85 (diff) | |
lots of new string stuff
Diffstat (limited to 'src/string.h')
| -rw-r--r-- | src/string.h | 49 |
1 files changed, 31 insertions, 18 deletions
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); |