summaryrefslogtreecommitdiffstats
path: root/src/messaging/messagingutil.cpp
diff options
context:
space:
mode:
authorEric Springer <eric.springer@nokia.com>2011-03-01 18:53:10 +1000
committerEric Springer <eric.springer@nokia.com>2011-03-01 18:53:10 +1000
commit1373ad71bb4c6786fbb59f10ed8e9ac14e2e33c2 (patch)
treea0e7e547c6168efa11b587fb55691578bbf5f42e /src/messaging/messagingutil.cpp
parentf3f78a0f408779db30f8bbb190e575e0fd4868bd (diff)
Fix globMatch (in both correctness and escaping)
Diffstat (limited to 'src/messaging/messagingutil.cpp')
-rw-r--r--src/messaging/messagingutil.cpp37
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();