summaryrefslogtreecommitdiff
path: root/xs.h
diff options
context:
space:
mode:
authordefault <nobody@localhost>2023-05-02 06:41:45 +0200
committerdefault <nobody@localhost>2023-05-02 06:41:45 +0200
commit29815a38736666e2226454d96ba444843853dca5 (patch)
treeeb40343211edc8ba8257e52a19fa9c245f0e0f9f /xs.h
parentf1756a53d1c2f3308fefda669ae4d372daf88f8d (diff)
Backport from xs.
Diffstat (limited to 'xs.h')
-rw-r--r--xs.h12
1 files changed, 8 insertions, 4 deletions
diff --git a/xs.h b/xs.h
index fef91b7..c4c961b 100644
--- a/xs.h
+++ b/xs.h
@@ -65,8 +65,10 @@ xs_str *xs_str_new(const char *str);
xs_str *xs_str_wrap_i(const char *prefix, xs_str *str, const char *suffix);
#define xs_str_prepend_i(str, prefix) xs_str_wrap_i(prefix, str, NULL)
#define xs_str_cat(str, suffix) xs_str_wrap_i(NULL, str, suffix)
-xs_str *xs_replace_i(xs_str *str, const char *sfrom, const char *sto);
-#define xs_replace(str, sfrom, sto) xs_replace_i(xs_dup(str), sfrom, sto)
+xs_str *xs_replace_in(xs_str *str, const char *sfrom, const char *sto, int times);
+#define xs_replace_i(str, sfrom, sto) xs_replace_in(str, sfrom, sto, XS_ALL)
+#define xs_replace(str, sfrom, sto) xs_replace_in(xs_dup(str), sfrom, sto, XS_ALL)
+#define xs_replace_n(str, sfrom, sto, times) xs_replace_in(xs_dup(str), sfrom, sto, times)
xs_str *xs_fmt(const char *fmt, ...);
int xs_str_in(const char *haystack, const char *needle);
int _xs_startsorends(const char *str, const char *xfix, int ends);
@@ -416,7 +418,7 @@ xs_str *xs_str_wrap_i(const char *prefix, xs_str *str, const char *suffix)
}
-xs_str *xs_replace_i(xs_str *str, const char *sfrom, const char *sto)
+xs_str *xs_replace_in(xs_str *str, const char *sfrom, const char *sto, int times)
/* replaces inline all sfrom with sto */
{
XS_ASSERT_TYPE(str, XSTYPE_STRING);
@@ -426,7 +428,7 @@ xs_str *xs_replace_i(xs_str *str, const char *sfrom, const char *sto)
char *ss;
int offset = 0;
- while ((ss = strstr(str + offset, sfrom)) != NULL) {
+ while (times > 0 && (ss = strstr(str + offset, sfrom)) != NULL) {
int n_offset = ss - str;
str = xs_collapse(str, n_offset, sfsz);
@@ -434,6 +436,8 @@ xs_str *xs_replace_i(xs_str *str, const char *sfrom, const char *sto)
memcpy(str + n_offset, sto, stsz);
offset = n_offset + stsz;
+
+ times--;
}
return str;