diff options
| author | Eric Springer <eric.springer@nokia.com> | 2011-03-01 18:53:10 +1000 |
|---|---|---|
| committer | Eric Springer <eric.springer@nokia.com> | 2011-03-01 18:53:10 +1000 |
| commit | 1373ad71bb4c6786fbb59f10ed8e9ac14e2e33c2 (patch) | |
| tree | a0e7e547c6168efa11b587fb55691578bbf5f42e /src/messaging/messagingutil.cpp | |
| parent | f3f78a0f408779db30f8bbb190e575e0fd4868bd (diff) | |
Fix globMatch (in both correctness and escaping)
Diffstat (limited to 'src/messaging/messagingutil.cpp')
| -rw-r--r-- | src/messaging/messagingutil.cpp | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/src/messaging/messagingutil.cpp b/src/messaging/messagingutil.cpp index 2bb861cfd1..7c3f2c0340 100644 --- a/src/messaging/messagingutil.cpp +++ b/src/messaging/messagingutil.cpp @@ -226,32 +226,49 @@ namespace MessagingUtil { return prefix; } - // Needs to support escaping, and to be unit tested :P + // TODO: directly unit test this bool globMatch(const QString &pattern, const QString &haystack) { QString::const_iterator patIt(pattern.begin()); QString::const_iterator hayIt(haystack.begin()); - for ( ; hayIt != haystack.end() && *patIt != '%' ; ++hayIt, ++patIt) { - if ((patIt->toLower() != hayIt->toLower()) - && (*patIt != '_')) { - return false; + bool escaping(false); + + while (hayIt != haystack.end() && (escaping || *patIt != '%')) { + + if (!escaping && *patIt == '\\') { + escaping = true; + ++patIt; + continue; } + + if ((patIt->toLower() != hayIt->toLower()) && (escaping || *patIt != '_')) + return false; + + escaping = false; + ++hayIt; + ++patIt; } QString::const_iterator tPatIt(pattern.end()); QString::const_iterator tHayIt(haystack.end()); while (patIt != pattern.end() && hayIt != haystack.end()) { - if (*patIt == '%') { + + if (!escaping && *patIt == '\\') { + escaping = true; + ++patIt; + } else if (!escaping && *patIt == '%') { if (++patIt == pattern.end()) return true; tPatIt = patIt; tHayIt = hayIt + 1; - } else if (patIt->toLower() == hayIt->toLower() || (*patIt != '_')) { - patIt++; - hayIt++; + } else if (patIt->toLower() == hayIt->toLower() || (!escaping && *patIt == '_')) { + escaping = false; + ++patIt; + ++hayIt; } else { + escaping = false; patIt = tPatIt; hayIt = tHayIt++; } @@ -259,7 +276,7 @@ namespace MessagingUtil { // eat trailing % while (patIt != pattern.end() && *patIt == '%') { - patIt++; + ++patIt; } return hayIt == haystack.end() && patIt == pattern.end(); |
