diff --git a/common/text/config_utils.cc b/common/text/config_utils.cc index 6df74bf67..10eae12be 100644 --- a/common/text/config_utils.cc +++ b/common/text/config_utils.cc @@ -45,7 +45,8 @@ absl::Status ParseNameValues(string_view config_string, const std::initializer_list &spec) { if (config_string.empty()) return absl::OkStatus(); - for (const string_view single_config : absl::StrSplit(config_string, ';')) { + for (const string_view single_config : + absl::StrSplit(config_string, ';', absl::SkipEmpty())) { const std::pair nv_pair = absl::StrSplit(single_config, ':'); const auto value_config = std::find_if( // linear search diff --git a/common/text/config_utils_test.cc b/common/text/config_utils_test.cc index 33a0e7e34..322ece67f 100644 --- a/common/text/config_utils_test.cc +++ b/common/text/config_utils_test.cc @@ -201,5 +201,29 @@ TEST(ConfigUtilsTest, ParseMultipleParameters) { EXPECT_EQ(str1, "some text string"); EXPECT_EQ(regex->pattern(), "[A-B0-9_]"); } + +TEST(ConfigUtilsTest, AllowTrailingOrLeadingSemicolons) { + absl::Status s; + int answer; + bool panic; + s = ParseNameValues("answer:42;panic:off;", {{"answer", SetInt(&answer)}, + {"panic", SetBool(&panic)}}); + EXPECT_TRUE(s.ok()); + EXPECT_FALSE(panic); + EXPECT_EQ(answer, 42); + + s = ParseNameValues(";answer:43;panic:on", {{"answer", SetInt(&answer)}, + {"panic", SetBool(&panic)}}); + EXPECT_TRUE(s.ok()) << s.message(); + EXPECT_TRUE(panic); + EXPECT_EQ(answer, 43); + + s = ParseNameValues(";answer:44;panic:on;", {{"answer", SetInt(&answer)}, + {"panic", SetBool(&panic)}}); + EXPECT_TRUE(s.ok()) << s.message(); + EXPECT_TRUE(panic); + EXPECT_EQ(answer, 44); +} + } // namespace config } // namespace verible