chiark / gitweb /
util: add strreplace() to replace a substring by another string
authorLennart Poettering <lennart@poettering.net>
Wed, 14 Nov 2012 21:16:23 +0000 (22:16 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 14 Nov 2012 21:21:16 +0000 (22:21 +0100)
src/shared/util.c
src/shared/util.h

index 5a326ec43512f7cd85927daaa2f105f0e8da7b9a..6d826b6f5eafbf185bc0191d850a176ff3aff6a3 100644 (file)
@@ -6163,3 +6163,53 @@ const char *draw_special_char(DrawSpecialChar ch) {
 
         return draw_table[!is_locale_utf8()][ch];
 }
 
         return draw_table[!is_locale_utf8()][ch];
 }
+
+char *strreplace(const char *text, const char *old_string, const char *new_string) {
+        const char *f;
+        char *t, *r;
+        size_t l, old_len, new_len;
+
+        assert(text);
+        assert(old_string);
+        assert(new_string);
+
+        old_len = strlen(old_string);
+        new_len = strlen(new_string);
+
+        l = strlen(text);
+        r = new(char, l+1);
+        if (!r)
+                return NULL;
+
+        f = text;
+        t = r;
+        while (*f) {
+                char *a;
+                size_t d, nl;
+
+                if (!startswith(f, old_string)) {
+                        *(t++) = *(f++);
+                        continue;
+                }
+
+                d = t - r;
+                nl = l - old_len + new_len;
+                a = realloc(r, nl + 1);
+                if (!a)
+                        goto oom;
+
+                l = nl;
+                r = a;
+                t = r + d;
+
+                t = stpcpy(t, new_string);
+                f += old_len;
+        }
+
+        *t = 0;
+        return r;
+
+oom:
+        free(r);
+        return NULL;
+}
index c2bed2a84832858603e4c62ea9e26cd8024ce28c..a148ebbc5887b4790ab343a60a6d08f82408dab7 100644 (file)
@@ -611,3 +611,5 @@ typedef enum DrawSpecialChar {
         _DRAW_SPECIAL_CHAR_MAX
 } DrawSpecialChar;
 const char *draw_special_char(DrawSpecialChar ch);
         _DRAW_SPECIAL_CHAR_MAX
 } DrawSpecialChar;
 const char *draw_special_char(DrawSpecialChar ch);
+
+char *strreplace(const char *text, const char *old_string, const char *new_string);