diff --git a/src/cpp/rtps/builtin/discovery/endpoint/EDP.cpp b/src/cpp/rtps/builtin/discovery/endpoint/EDP.cpp index 5db6905288d..3a557239fae 100644 --- a/src/cpp/rtps/builtin/discovery/endpoint/EDP.cpp +++ b/src/cpp/rtps/builtin/discovery/endpoint/EDP.cpp @@ -67,12 +67,6 @@ namespace rtps { using reader_map_helper = utilities::collections::map_size_helper; using writer_map_helper = utilities::collections::map_size_helper; -static bool is_partition_empty( - const fastdds::dds::Partition_t& partition) -{ - return partition.size() <= 1 && 0 == strlen(partition.name()); -} - static bool is_same_type( const dds::xtypes::TypeInformation& t1, const dds::xtypes::TypeInformation& t2) @@ -987,7 +981,7 @@ bool EDP::valid_matching( for (auto rnameit = rdata->partition.begin(); rnameit != rdata->partition.end(); ++rnameit) { - if (is_partition_empty(*rnameit)) + if (StringMatching::matchString("", rnameit->name())) { matched = true; break; @@ -999,7 +993,7 @@ bool EDP::valid_matching( for (auto wnameit = wdata->partition.begin(); wnameit != wdata->partition.end(); ++wnameit) { - if (is_partition_empty(*wnameit)) + if (StringMatching::matchString(wnameit->name(), "")) { matched = true; break; diff --git a/src/cpp/utils/StringMatching.cpp b/src/cpp/utils/StringMatching.cpp index cb8cd28ecc2..2df1815c6ee 100644 --- a/src/cpp/utils/StringMatching.cpp +++ b/src/cpp/utils/StringMatching.cpp @@ -25,6 +25,7 @@ #include #include #elif defined(_WIN32) +#include #include "Shlwapi.h" #else #include @@ -46,7 +47,7 @@ StringMatching::~StringMatching() } #if defined(__cplusplus_winrt) -void replace_all( +static void replace_all( std::string& subject, const std::string& search, const std::string& replace) @@ -59,7 +60,7 @@ void replace_all( } } -bool StringMatching::matchPattern( +static bool do_match_pattern( const char* pattern, const char* str) { @@ -71,87 +72,52 @@ bool StringMatching::matchPattern( std::regex path_regex(path); std::smatch spec_match; - if (std::regex_match(spec, spec_match, path_regex)) - { - return true; - } - - return false; + return std::regex_match(spec, spec_match, path_regex); } -bool StringMatching::matchString( - const char* str1, - const char* str2) +#elif defined(_WIN32) +static bool do_match_pattern( + const char* pattern, + const char* str) { - if (StringMatching::matchPattern(str1, str2)) + // An empty pattern only matches an empty string + if (strlen(pattern) == 0) { - return true; + return strlen(str) == 0; } - - if (StringMatching::matchPattern(str2, str1)) + // An empty string also matches a pattern of "*" + if (strlen(str) == 0) { - return true; + return strcmp(pattern, "*") == 0; } - - return false; + // Leave rest of cases to PathMatchSpecA + return PathMatchSpecA(str, pattern); } -#elif defined(_WIN32) -bool StringMatching::matchPattern( +#else +static bool do_match_pattern( const char* pattern, const char* str) { - if (PathMatchSpecA(str, pattern)) - { - return true; - } - return false; + return fnmatch(pattern, str, FNM_NOESCAPE) == 0; } -bool StringMatching::matchString( - const char* str1, - const char* str2) -{ - if (PathMatchSpecA(str1, str2)) - { - return true; - } - if (PathMatchSpecA(str2, str1)) - { - return true; - } - return false; -} +#endif // if defined(__cplusplus_winrt) -#else bool StringMatching::matchPattern( const char* pattern, const char* str) { - if (fnmatch(pattern, str, FNM_NOESCAPE) == 0) - { - return true; - } - return false; + return do_match_pattern(pattern, str); } bool StringMatching::matchString( const char* str1, const char* str2) { - if (fnmatch(str1, str2, FNM_NOESCAPE) == 0) - { - return true; - } - if (fnmatch(str2, str1, FNM_NOESCAPE) == 0) - { - return true; - } - return false; + return do_match_pattern(str1, str2) || do_match_pattern(str2, str1); } -#endif // if defined(__cplusplus_winrt) - } /* namespace rtps */ } /* namespace fastdds */ } /* namespace eprosima */ diff --git a/test/unittest/utils/StringMatchingTests.cpp b/test/unittest/utils/StringMatchingTests.cpp index 3ef84302476..1f728c912b6 100644 --- a/test/unittest/utils/StringMatchingTests.cpp +++ b/test/unittest/utils/StringMatchingTests.cpp @@ -62,6 +62,14 @@ TEST_F(StringMatchingTests, patterns_with_wildcards) ASSERT_FALSE(StringMatching::matchString(path, pattern9)); } +TEST_F(StringMatchingTests, empty_string) +{ + ASSERT_TRUE(StringMatching::matchString("", "")); + ASSERT_TRUE(StringMatching::matchString("", "*")); + ASSERT_FALSE(StringMatching::matchString("", "?")); + ASSERT_FALSE(StringMatching::matchString("", "a")); +} + int main( int argc,