diff options
Diffstat (limited to 'str.h')
-rw-r--r-- | str.h | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/str.h b/str.h index 3cc3f38..9b1aafc 100644 --- a/str.h +++ b/str.h @@ -14,21 +14,6 @@ typedef struct { #define S(s) (Str){s,sizeof(s)-1} -/* allocating */ - -Str str_dup(Str a, Arena *m) { - char *s = new_arr(m, char, a.n); - memcpy(s, a.s, a.n); - a.s = s; - return a; -} - -static inline void str_cat(Str *a, Str b, Arena *m) { - a->s = resize(m, a->s, a->n, a->n + b.n); - memcpy(&a->s[a->n], b.s, b.n); - a->n += b.n; -} - /* conversions */ static inline char *str_to_cstr(Str s, Arena *a) { @@ -119,4 +104,27 @@ static inline int str_contains(Str a, Str b) { return str_find(a, b).n > 0; } +/* allocating */ + +static inline Str str_dup(Str a, Arena *m) { + char *s = new_arr(m, char, a.n); + memcpy(s, a.s, a.n); + a.s = s; + return a; +} + +static inline void str_cat(Str *a, Str b, Arena *m) { + a->s = resize(m, a->s, a->n, a->n + b.n); + memcpy(&a->s[a->n], b.s, b.n); + a->n += b.n; +} + +static inline Str str_replace_end(Str s, Str a, Str b, Arena *m) { + if (!str_ends(s, a)) return s; + char *p = new_arr(m, char, s.n + b.n - a.n); + memcpy(p, s.s, s.n - a.n); + memcpy(p + s.n - a.n, b.s, b.n); + return (Str) { p, s.n + b.n - a.n }; +} + #endif |