diff --git a/src/basic/string-util.c b/src/basic/string-util.c index 6ceaeaf9df1..71ce921288f 100644 --- a/src/basic/string-util.c +++ b/src/basic/string-util.c @@ -1162,3 +1162,15 @@ bool streq_skip_trailing_chars(const char *s1, const char *s2, const char *ok) { return in_charset(s1, ok) && in_charset(s2, ok); } + +char *string_replace_char(char *str, char old_char, char new_char) { + assert(str); + assert(old_char != '\0'); + assert(new_char != '\0'); + assert(old_char != new_char); + + for (char *p = strchr(str, old_char); p; p = strchr(p + 1, old_char)) + *p = new_char; + + return str; +} diff --git a/src/basic/string-util.h b/src/basic/string-util.h index ffb69e69cc4..b871224f7b6 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -233,3 +233,5 @@ static inline int string_contains_word(const char *string, const char *separator } bool streq_skip_trailing_chars(const char *s1, const char *s2, const char *ok); + +char *string_replace_char(char *str, char old_char, char new_char); diff --git a/src/test/test-string-util.c b/src/test/test-string-util.c index 93b674baabf..63bb74ac106 100644 --- a/src/test/test-string-util.c +++ b/src/test/test-string-util.c @@ -935,6 +935,14 @@ TEST(strextendf) { assert_se(streq(p, "<77>,<99>,< 88>,<00001234>")); } +TEST(string_replace_char) { + assert_se(streq(string_replace_char(strdupa(""), 'a', 'b'), "")); + assert_se(streq(string_replace_char(strdupa("abc"), 'a', 'b'), "bbc")); + assert_se(streq(string_replace_char(strdupa("hoge"), 'a', 'b'), "hoge")); + assert_se(streq(string_replace_char(strdupa("aaaa"), 'a', 'b'), "bbbb")); + assert_se(streq(string_replace_char(strdupa("aaaa"), 'a', '\t'), "\t\t\t\t")); +} + TEST(streq_skip_trailing_chars) { /* NULL is WHITESPACE by default*/ assert_se(streq_skip_trailing_chars("foo bar", "foo bar", NULL));