summaryrefslogtreecommitdiff
path: root/src/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/string.c')
-rw-r--r--src/string.c57
1 files changed, 57 insertions, 0 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);