diff --git a/include/ustring.h b/include/ustring.h index 293a579..7ae2c1b 100644 --- a/include/ustring.h +++ b/include/ustring.h @@ -355,6 +355,19 @@ UString ustring_join(UString const *strings, ulib_uint count, UString sep); ULIB_API UString ustring_repeating(UString string, ulib_uint times); +/** + * Returns a new string obtained by replacing all occurrences of a character with another. + * + * @param string String. + * @param needle Character to replace. + * @param replacement Replacement character. + * @return New string. + * + * @destructor{ustring_deinit} + */ +ULIB_API +UString ustring_replacing_char(UString string, char needle, char replacement); + /** * Checks if the string does not contain lowercase characters. * diff --git a/src/ustring.c b/src/ustring.c index ca7cee3..8845e97 100644 --- a/src/ustring.c +++ b/src/ustring.c @@ -290,6 +290,18 @@ UString ustring_repeating(UString string, ulib_uint times) { return ret; } +UString ustring_replacing_char(UString string, char needle, char replacement) { + ulib_uint const len = ustring_length(string); + UString ret; + char *buf = ustring(&ret, len); + if (!len) return ret; + memcpy(buf, ustring_data(string), len); + for (char *cur = buf; (cur = memchr(cur, needle, len - (cur - buf))) != NULL; ++cur) { + *cur = replacement; + } + return ret; +} + UString ustring_to_upper(UString string) { UString ret; ulib_uint const len = ustring_length(string); diff --git a/test/tests/ustring_tests.c b/test/tests/ustring_tests.c index 03734d6..0d7cb38 100644 --- a/test/tests/ustring_tests.c +++ b/test/tests/ustring_tests.c @@ -202,7 +202,10 @@ bool ustring_test_base(void) { a = ustring_repeating(ustring_literal("123"), 4); utest_assert_ustring(a, ==, ustring_literal("123123123123")); + b = ustring_replacing_char(a, '3', '4'); + utest_assert_ustring(b, ==, ustring_literal("124124124124")); ustring_deinit(&a); + ustring_deinit(&b); a = ustring_with_format("%d%d%d", 1, 2, 3); utest_assert_ustring(a, ==, ustring_literal("123"));