diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/string.c | 49 | ||||
| -rw-r--r-- | src/string.h | 23 |
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){ |