diff options
author | Chris Wilson <chris+github@qwirx.com> | 2006-10-16 23:23:03 +0000 |
---|---|---|
committer | Chris Wilson <chris+github@qwirx.com> | 2006-10-16 23:23:03 +0000 |
commit | aa04aefdbd2fcd1fd288b78719f474e6b6fa77fb (patch) | |
tree | 69f3ec5be0c1b7e66a7de9fc718a460308a7b7dd /lib/common/ExcludeList.cpp | |
parent | 55eb800fe8eb48a13e7f45671284ce5eb536fbee (diff) |
Match case-insensitively on Win32. (refs #3)
Diffstat (limited to 'lib/common/ExcludeList.cpp')
-rw-r--r-- | lib/common/ExcludeList.cpp | 76 |
1 files changed, 70 insertions, 6 deletions
diff --git a/lib/common/ExcludeList.cpp b/lib/common/ExcludeList.cpp index 43991594..b13b6026 100644 --- a/lib/common/ExcludeList.cpp +++ b/lib/common/ExcludeList.cpp @@ -65,6 +65,45 @@ ExcludeList::~ExcludeList() } } +#ifdef WIN32 +std::string ExcludeList::ReplaceSlashesDefinite(const std::string& input) const +{ + std::string output = input; + + for (std::string::size_type pos = output.find("/"); + pos != std::string::npos; + pos = output.find("/")) + { + output.replace(pos, 1, DIRECTORY_SEPARATOR); + } + + for (std::string::iterator i = output.begin(); i != output.end(); i++) + { + *i = tolower(*i); + } + + return output; +} + +std::string ExcludeList::ReplaceSlashesRegex(const std::string& input) const +{ + std::string output = input; + + for (std::string::size_type pos = output.find("/"); + pos != std::string::npos; + pos = output.find("/")) + { + output.replace(pos, 1, "\\" DIRECTORY_SEPARATOR); + } + + for (std::string::iterator i = output.begin(); i != output.end(); i++) + { + *i = tolower(*i); + } + + return output; +} +#endif // -------------------------------------------------------------------------- // @@ -88,7 +127,16 @@ void ExcludeList::AddDefiniteEntries(const std::string &rEntries) { if(i->size() > 0) { - mDefinite.insert(*i); + std::string entry = *i; + + // Convert any forward slashes in the string + // to backslashes + + #ifdef WIN32 + entry = ReplaceSlashesDefinite(entry); + #endif + + mDefinite.insert(entry); } } } @@ -123,8 +171,18 @@ void ExcludeList::AddRegexEntries(const std::string &rEntries) try { + std::string entry = *i; + + // Convert any forward slashes in the string + // to appropriately escaped backslashes + + #ifdef WIN32 + entry = ReplaceSlashesRegex(entry); + #endif + // Compile - if(::regcomp(pregex, i->c_str(), REG_EXTENDED | REG_NOSUB) != 0) + if(::regcomp(pregex, entry.c_str(), + REG_EXTENDED | REG_NOSUB) != 0) { THROW_EXCEPTION(CommonException, BadRegularExpression) } @@ -132,7 +190,7 @@ void ExcludeList::AddRegexEntries(const std::string &rEntries) // Store in list of regular expressions mRegex.push_back(pregex); // Store in list of regular expression string for Serialize - mRegexStr.push_back(i->c_str()); + mRegexStr.push_back(entry.c_str()); } catch(...) { @@ -158,10 +216,16 @@ void ExcludeList::AddRegexEntries(const std::string &rEntries) // -------------------------------------------------------------------------- bool ExcludeList::IsExcluded(const std::string &rTest) const { + std::string test = rTest; + + #ifdef WIN32 + test = ReplaceSlashesDefinite(test); + #endif + // Check against the always include list if(mpAlwaysInclude != 0) { - if(mpAlwaysInclude->IsExcluded(rTest)) + if(mpAlwaysInclude->IsExcluded(test)) { // Because the "always include" list says it's 'excluded' // this means it should actually be included. @@ -170,7 +234,7 @@ bool ExcludeList::IsExcluded(const std::string &rTest) const } // Is it in the set of definite entries? - if(mDefinite.find(rTest) != mDefinite.end()) + if(mDefinite.find(test) != mDefinite.end()) { return true; } @@ -180,7 +244,7 @@ bool ExcludeList::IsExcluded(const std::string &rTest) const for(std::vector<regex_t *>::const_iterator i(mRegex.begin()); i != mRegex.end(); ++i) { // Test against this expression - if(regexec(*i, rTest.c_str(), 0, 0 /* no match information required */, 0 /* no flags */) == 0) + if(regexec(*i, test.c_str(), 0, 0 /* no match information required */, 0 /* no flags */) == 0) { // match happened return true; |