diff options
author | Max Horn | 2008-09-05 20:29:03 +0000 |
---|---|---|
committer | Max Horn | 2008-09-05 20:29:03 +0000 |
commit | 0dcb30e75c79900d90874eb098fbec67ef0c703b (patch) | |
tree | 1b8f75d715be40c87c0756a54979795a97da1f6c | |
parent | e5c8ebf995a8500d5c99cc238f911eac43e8073d (diff) | |
download | scummvm-rg350-0dcb30e75c79900d90874eb098fbec67ef0c703b.tar.gz scummvm-rg350-0dcb30e75c79900d90874eb098fbec67ef0c703b.tar.bz2 scummvm-rg350-0dcb30e75c79900d90874eb098fbec67ef0c703b.zip |
Optimized matchString for the common case where there is a trailing * (if that is the case, abort immediately instead of scanning the rest of the string)
svn-id: r34367
-rw-r--r-- | common/str.cpp | 5 | ||||
-rw-r--r-- | test/common/str.h | 8 |
2 files changed, 13 insertions, 0 deletions
diff --git a/common/str.cpp b/common/str.cpp index b2c9a7cdbf..a415e376c9 100644 --- a/common/str.cpp +++ b/common/str.cpp @@ -605,13 +605,18 @@ bool matchString(const char *str, const char *pat) { for (;;) { switch (*pat) { case '*': + // Record pattern / string possition for backtracking p = ++pat; q = str; + // If pattern ended with * -> match + if (!*pat) + return true; break; default: if (*pat != *str) { if (p) { + // No match, oops -> try to backtrack pat = p; str = ++q; if (!*str) diff --git a/test/common/str.h b/test/common/str.h index 921c4614f5..a94ec3227f 100644 --- a/test/common/str.h +++ b/test/common/str.h @@ -191,6 +191,14 @@ class StringTestSuite : public CxxTest::TestSuite } void test_matchString(void) { + TS_ASSERT( Common::matchString("", "*")); + TS_ASSERT( Common::matchString("a", "*")); + TS_ASSERT( Common::matchString("monkey.s01", "*")); + + TS_ASSERT(!Common::matchString("", "?")); + TS_ASSERT( Common::matchString("a", "?")); + TS_ASSERT(!Common::matchString("monkey.s01", "?")); + TS_ASSERT( Common::matchString("monkey.s01", "monkey.s??")); TS_ASSERT( Common::matchString("monkey.s99", "monkey.s??")); TS_ASSERT(!Common::matchString("monkey.s101", "monkey.s??")); |