summaryrefslogtreecommitdiff
path: root/src/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/string.c')
-rw-r--r--src/string.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/string.c b/src/string.c
index 63c886a..0925a43 100644
--- a/src/string.c
+++ b/src/string.c
@@ -5,6 +5,7 @@
#include <immintrin.h>
#include <ctype.h>
+#include <stdlib.h>
#include <string.h>
strng_t *strng_new(smrt_arena_t *arena, u64 size) {
@@ -79,6 +80,13 @@ i32 strng_set(strng_t *string, char const *c) {
return 0;
}
+i32 strng_set_ic(strng_t *string, u64 i, char c) {
+ if (i >= string->alloc_size) return -1;
+ if (i >= string->len) string->len = i+1;
+ memset(STRNG_TO(string)+i, c, 1);
+ return 0;
+}
+
i32 strng_app(strng_t *dest, strng_t const *source) {
u64 slen = source->len;
u64 nlen = dest->len + slen;
@@ -123,6 +131,13 @@ void strng_clear(strng_t *string) {
string->len = 0;
}
+char *strng_malloc_str(strng_t const *string) {
+ char *s = malloc(string->len);
+ if (!s) return NULL;
+ memcpy(s, STRNG_TO(string), string->len);
+ return s;
+}
+
strng_view_t sv_from_chars(char const* c) { u64 l = strlen(c);
return (strng_view_t){
.start=0,
@@ -214,6 +229,20 @@ void sv_set_len_right(strng_view_t *sv, u64 n) {
sv->start = sv->end - n + 1;
}
+char sv_get_start(strng_view_t const *sv) {
+ if (sv_len(sv)) {
+ return *(sv->string + sv->start);
+ }
+ return 0;
+}
+
+char sv_get_end(strng_view_t const *sv){
+ if (sv_len(sv)) {
+ return *(sv->string + sv->end);
+ }
+ return 0;
+}
+
i32 sv_find_substr(strng_view_t const *sv, char const *_needle) {
u64 nlen = strlen(_needle);
u64 hlen = sv_len(sv);
@@ -279,6 +308,16 @@ lt_32:
return -1;
}
+u64 sv_count_c(strng_view_t const *sv, char n) {
+ // TODO: simd
+ u64 x = 0;
+ for (u64 i = 0; i < sv_len(sv); i++) {
+ char c = *((u8*)(SV_TO(*sv))+i);
+ if (c == n) x++;
+ }
+ return x;
+}
+
b32 sv_starts_with(strng_view_t const *sv, char const *prefix) {
u64 plen = strlen(prefix);
u64 hlen = sv_len(sv);