summaryrefslogtreecommitdiff
path: root/str.h
diff options
context:
space:
mode:
Diffstat (limited to 'str.h')
-rw-r--r--str.h38
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