| Index: src/plugin/PluginUtil.cpp | 
| =================================================================== | 
| --- a/src/plugin/PluginUtil.cpp | 
| +++ b/src/plugin/PluginUtil.cpp | 
| @@ -2,26 +2,12 @@ | 
| #include <algorithm> | 
| #include <stdexcept> | 
| #include <vector> | 
| +#include <cctype> | 
| #include "../shared/Utils.h" | 
| #include "PluginUtil.h" | 
| #include "PluginSettings.h" | 
| -BString::BString(const std::wstring& value) | 
| - : value(::SysAllocString(value.c_str())) | 
| -{ | 
| -} | 
| - | 
| -BString::~BString() | 
| -{ | 
| - ::SysFreeString(value); | 
| -} | 
| - | 
| -BString::operator BSTR() | 
| -{ | 
| - return value; | 
| -} | 
| - | 
| std::wstring HtmlFolderPath() | 
| { | 
| return GetDllDir() + L"html\\templates\\"; | 
| @@ -43,3 +29,138 @@ | 
| std::replace(url.begin(), url.end(), L'\\', L'/'); | 
| return L"file:///" + url; | 
| } | 
| + | 
| +/** | 
| + * Case-insensitive wide-string equality | 
| + * | 
| + * We only use any kind of case-insensitive comparison in 'InjectABP'. | 
| + */ | 
| +bool ABP::util::wstring_equal_ci( std::wstring & a, std::wstring & b ) | 
| +{ | 
| 
 
Oleksandr
2014/06/26 00:48:43
Since these functions are generic enough, I think
 
Eric
2014/06/26 15:13:56
I'm OK with that.
I'd prefer to do it in a separa
 
 | 
| + /* | 
| + * We don't need ordering, so first just compare lengths. | 
| + */ | 
| + size_t n = a.length(); | 
| + if ( n != b.length() ) | 
| + { | 
| + return false; | 
| + } | 
| + // Assert 'a' and 'b' have the same length | 
| + for ( size_t j = 0 ; j < n ; ++ j ) | 
| + { | 
| + if ( std::tolower( a[j] ) != std::tolower( b[j] ) ) | 
| 
 
sergei
2014/07/08 11:58:34
Strictly speaking it's not a correct implementatio
 
Eric
2014/07/08 17:46:37
That's right, it's not correct for every purpose.
 
 | 
| + { | 
| + return false; | 
| + } | 
| + } | 
| + return true; | 
| +} | 
| + | 
| +void ABP::util::trim( std::wstring & s ) | 
| +{ | 
| 
 
Oleksandr
2014/06/26 00:48:43
We already gave AdblockPlus::Utils::TrimString
 
Eric
2014/06/26 15:13:56
I noticed that after I posted the review.
 
 | 
| + static wchar_t whitespace[] = L" \r\n\t"; | 
| + size_t len = s.length(); | 
| + if ( len == 0 ) | 
| + { | 
| + return; | 
| + } | 
| + size_t n = s.find_first_not_of( whitespace, 0, 4 ); | 
| + // Assert substring s[0,n) is all whitespace | 
| + // If n==0, the interval is empty. | 
| + // If n==wstring::npos, the whole string matched | 
| + if ( n == std::wstring::npos ) | 
| + { | 
| + s.clear(); | 
| + return; | 
| + } | 
| + else if ( n > 0 ) | 
| + { | 
| + s.erase( 0, n ); | 
| + len -= n; | 
| + if ( len == 0 ) | 
| + { | 
| + return; | 
| + } | 
| + } | 
| + // Assert 's' is not empty | 
| + // Assert the first character of 's' is not whitespace | 
| + // Assert len == s.length() | 
| + n = s.find_last_not_of( whitespace, len, 4 ) + 1; | 
| + if ( n < len ) | 
| + { | 
| + s.erase( n ); | 
| + } | 
| +} | 
| + | 
| +void ABP::util::trim_leading( std::wstring & s ) | 
| +{ | 
| + static wchar_t whitespace[] = L" \r\n\t"; | 
| + if ( s.length() == 0 ) | 
| + { | 
| + return; | 
| + } | 
| + size_t n = s.find_first_not_of( whitespace, 0, 4 ); | 
| + // Assert substring s[0,n) is all whitespace | 
| + // If n==0, the interval is empty, that is, no leading whitespace | 
| + // If n==wstring::npos, the whole string matched, that is, it's all whitespace | 
| + if ( n == std::wstring::npos ) | 
| + { | 
| + s.clear(); | 
| + } | 
| + else if ( n > 0 ) | 
| + { | 
| + s.erase( 0, n ); | 
| + } | 
| +} | 
| + | 
| +void ABP::util::trim_trailing( std::wstring & s ) | 
| +{ | 
| + static wchar_t whitespace[] = L" \r\n\t"; | 
| + size_t len = s.length(); | 
| + if ( len == 0 ) | 
| + { | 
| + return; | 
| + } | 
| + // Assert 's' is not empty | 
| + size_t n = s.find_last_not_of( whitespace, len, 4 ) + 1; | 
| + if ( n < len ) | 
| + { | 
| + s.erase( n ); | 
| + } | 
| +} | 
| + | 
| +void ABP::util::to_lower( std::wstring & s ) | 
| +{ | 
| + size_t n = s.length(); | 
| + for ( size_t j = 0 ; j < n ; ++j ) | 
| + { | 
| + s[ j ] = tolower( s[ j ] ); | 
| + } | 
| +} | 
| + | 
| +std::wstring ABP::util::extract_token( const std::wstring source, size_t & start, const std::wstring tokens ) | 
| +{ | 
| + // Skip initial tokens | 
| + size_t begin = source.find_first_not_of( tokens, start ); | 
| + if ( begin == std::wstring::npos ) | 
| + { | 
| + // Assert the source is all whitespace following the start position. | 
| + start = begin; | 
| + return std::wstring(); | 
| + } | 
| + // Assert n < source.length | 
| + // Assert source[ start, n ) is all whitespace ( an empty interval if start == n ) | 
| + // Assert source[ n ] is not whitespace | 
| + size_t end = source.find_first_of( tokens, begin + 1 ); | 
| + if ( end == std::wstring::npos ) | 
| + { | 
| + start = std::wstring::npos; | 
| + return source.substr( begin ); | 
| + } | 
| + if ( end + 1 >= source.length() ) { | 
| + start = std::wstring::npos; | 
| + } else { | 
| + start = end + 1; | 
| + } | 
| + return source.substr( begin, end - begin ); | 
| +} |