From ca57867dcb572d7fd2b3b61a6342d004c5a5d18e Mon Sep 17 00:00:00 2001 From: Yossi Itigin Date: Thu, 3 Feb 2022 22:06:04 +0200 Subject: [PATCH] UCS/STRING/TEST: Fix ucs_string_buffer_rtrim() for empty string --- src/ucs/datastruct/string_buffer.c | 9 +++++++-- test/gtest/ucs/test_string.cc | 6 +++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/ucs/datastruct/string_buffer.c b/src/ucs/datastruct/string_buffer.c index c3acea17eb9..bc3b809fe3d 100644 --- a/src/ucs/datastruct/string_buffer.c +++ b/src/ucs/datastruct/string_buffer.c @@ -146,7 +146,12 @@ void ucs_string_buffer_rtrim(ucs_string_buffer_t *strb, const char *charset) { char *ptr = ucs_array_end(&strb->str); - while (ucs_array_length(&strb->str) > 0) { + if (ucs_array_is_empty(&strb->str)) { + /* If the string is empty, do not write '\0' terminator */ + return; + } + + do { --ptr; if (((charset == NULL) && !isspace(*ptr)) || ((charset != NULL) && (strchr(charset, *ptr) == NULL))) { @@ -155,7 +160,7 @@ void ucs_string_buffer_rtrim(ucs_string_buffer_t *strb, const char *charset) } ucs_array_set_length(&strb->str, ucs_array_length(&strb->str) - 1); - } + } while (!ucs_array_is_empty(&strb->str)); /* mark the new end of string */ *(ptr + 1) = '\0'; diff --git a/test/gtest/ucs/test_string.cc b/test/gtest/ucs/test_string.cc index 01b215c9d73..34de90fb045 100644 --- a/test/gtest/ucs/test_string.cc +++ b/test/gtest/ucs/test_string.cc @@ -156,7 +156,6 @@ class test_string_buffer : public ucs::test { void check_extract_mem(ucs_string_buffer_t *strb); }; - UCS_TEST_F(test_string_buffer, appendf) { ucs_string_buffer_t strb; @@ -200,6 +199,11 @@ UCS_TEST_F(test_string_buffer, rtrim) { static const char *test_string = "wabbalubbadabdab"; ucs_string_buffer_t strb; + ucs_string_buffer_init(&strb); + ucs_string_buffer_rtrim(&strb, "x"); + EXPECT_EQ(std::string(""), ucs_string_buffer_cstr(&strb)); + ucs_string_buffer_cleanup(&strb); + ucs_string_buffer_init(&strb); ucs_string_buffer_appendf(&strb, "%s%s", test_string, ",,"); ucs_string_buffer_rtrim(&strb, ",");