Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: src/plugin/PluginUtil.cpp

Issue 5750789393874944: [IE] First round of ATL removal (Closed)
Patch Set: Created June 20, 2014, 9:22 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 );
+}

Powered by Google App Engine
This is Rietveld