Index: base/string_split.cc |
diff --git a/base/string_split.cc b/base/string_split.cc |
index bc7955d74134407e8342e8345cf9e33c3d80cb10..44b5d067615c8d4cd1b1112d8cc2642a6ae76d6b 100644 |
--- a/base/string_split.cc |
+++ b/base/string_split.cc |
@@ -168,4 +168,61 @@ void SplitStringDontTrim(const std::string& str, |
SplitStringT(str, c, false, r); |
} |
+template<typename STR> |
+void SplitStringAlongWhitespaceT(const STR& str, std::vector<STR>* result) { |
+ const size_t length = str.length(); |
+ if (!length) |
+ return; |
+ |
+ bool last_was_ws = false; |
+ size_t last_non_ws_start = 0; |
+ for (size_t i = 0; i < length; ++i) { |
+ switch (str[i]) { |
+ // HTML 5 defines whitespace as: space, tab, LF, line tab, FF, or CR. |
+ case L' ': |
+ case L'\t': |
+ case L'\xA': |
+ case L'\xB': |
+ case L'\xC': |
+ case L'\xD': |
+ if (!last_was_ws) { |
+ if (i > 0) { |
+ result->push_back( |
+ str.substr(last_non_ws_start, i - last_non_ws_start)); |
+ } |
+ last_was_ws = true; |
+ } |
+ break; |
+ |
+ default: // Not a space character. |
+ if (last_was_ws) { |
+ last_was_ws = false; |
+ last_non_ws_start = i; |
+ } |
+ break; |
+ } |
+ } |
+ if (!last_was_ws) { |
+ result->push_back( |
+ str.substr(last_non_ws_start, length - last_non_ws_start)); |
+ } |
+} |
+ |
+void SplitStringAlongWhitespace(const std::wstring& str, |
+ std::vector<std::wstring>* result) { |
+ SplitStringAlongWhitespaceT(str, result); |
+} |
+ |
+#if !defined(WCHAR_T_IS_UTF16) |
+void SplitStringAlongWhitespace(const string16& str, |
+ std::vector<string16>* result) { |
+ SplitStringAlongWhitespaceT(str, result); |
+} |
+#endif |
+ |
+void SplitStringAlongWhitespace(const std::string& str, |
+ std::vector<std::string>* result) { |
+ SplitStringAlongWhitespaceT(str, result); |
+} |
+ |
} // namespace base |