summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsteven-na <noreply.github@stvnc.dev>2026-08-15 05:11:44 -0700
committersteven-na <noreply.github@stvnc.dev>2026-08-15 05:11:44 -0700
commit3d92fc50597816dfee09137fd2c4f0cc81935d56 (patch)
tree8e1054e58daa0d8bc84561959f4b321ab8e1aabb
parent06ebe0aa31569c017f43e513047b1e339f52b6e6 (diff)
Added string procs
-rw-r--r--src/string.c49
-rw-r--r--src/string.h23
2 files changed, 62 insertions, 10 deletions
diff --git a/src/string.c b/src/string.c
index 38d7824..2185a81 100644
--- a/src/string.c
+++ b/src/string.c
@@ -78,6 +78,45 @@ i32 strng_set(strng_t *string, char const *c) {
return 0;
}
+i32 strng_app(strng_t *dest, strng_t const *source) {
+ u64 slen = source->len;
+ u64 nlen = dest->len + slen;
+ if (nlen > dest->alloc_size) return -1;
+
+ char *dst = STRNG_TO(dest)+dest->len;
+ char const *src = STRNG_TO(source);
+ memcpy(dst, src, slen);
+
+ dest->len = nlen;
+ return nlen;
+}
+
+i32 strng_app_c(strng_t *dest, char const *source) {
+ u64 slen = strlen(source);
+ u64 nlen = dest->len + slen;
+ if (nlen > dest->alloc_size) return -1;
+
+ char *dst = STRNG_TO(dest)+dest->len;
+ char const *src = source;
+ memcpy(dst, src, slen);
+
+ dest->len = nlen;
+ return nlen;
+}
+
+i32 strng_app_v(strng_t *dest, strng_view_t const *source) {
+ u64 slen = source->end - source->start;
+ u64 nlen = dest->len + slen;
+ if (nlen > dest->alloc_size) return -1;
+
+ char *dst = STRNG_TO(dest)+dest->len;
+ char const *src = source->string+source->start;
+ memcpy(dst, src, slen);
+
+ dest->len = nlen;
+ return nlen;
+}
+
void strng_clear(strng_t *string) {
memset((u8*)string+STRNG_BASE_POS, 0, string->len);
string->len = 0;
@@ -90,8 +129,14 @@ strng_view_t sv_from_chars(char const* c) { u64 l = strlen(c);
.max=l,
.string=c, }; }
-void sv_trim_left(strng_view_t *sv) { while (sv->start<= sv->end && isspace(*(sv->string+sv->start)) ) sv->start++; }
-void sv_trim_right(strng_view_t *sv) { while (sv->end >=sv->start && isspace(*( sv->string+sv->end)) ) sv->end--; }
+void sv_trim_left(strng_view_t *sv) {
+ while (sv->start <= sv->end && isspace(*(sv->string+sv->start))) sv->start++;
+ if (sv->start > sv->end) sv->start = sv->end;
+}
+void sv_trim_right(strng_view_t *sv) {
+ while (sv->end >= sv->start && isspace(*(sv->string+sv->end))) sv->end--;
+ if (sv->end < sv->start) sv->end = sv->start;
+}
void sv_trim(strng_view_t *sv) { sv_trim_left(sv);
sv_trim_right(sv); }
diff --git a/src/string.h b/src/string.h
index 999add8..a2e69c9 100644
--- a/src/string.h
+++ b/src/string.h
@@ -10,21 +10,28 @@ typedef struct {
u64 len;
} strng_t;
+typedef struct {
+ u64 start;
+ u64 end;
+ u64 max;
+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);
+// Append to strng, returns -1 if no space, new len otherwise
+ 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);
+// 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);
-#define STRNG_FMT(s) (i32)s->len, (char *)((u8*)s+STRNG_BASE_POS)
-
-typedef struct {
- u64 start;
- u64 end;
- u64 max;
-char const *string;
-} strng_view_t;
+#define STRNG_TO(s) (char *)((u8*)(s)+STRNG_BASE_POS)
+#define STRNG_FMT(s) (i32)s->len, (char *)((u8*)(s)+STRNG_BASE_POS)
static inline strng_view_t sv_from(strng_t *string) {
return (strng_view_t){