summaryrefslogtreecommitdiff
path: root/src/string.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/string.h')
-rw-r--r--src/string.h49
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);