blob: d15bf4a898e534b748d52404be47544d3d172724 [file] [log] [blame]
diff --git a/third_party/zxcvbn-cpp/native-src/zxcvbn/util.cpp b/third_party/zxcvbn-cpp/native-src/zxcvbn/util.cpp
index 107bce0af064..349c2a5448ae 100644
--- a/third_party/zxcvbn-cpp/native-src/zxcvbn/util.cpp
+++ b/third_party/zxcvbn-cpp/native-src/zxcvbn/util.cpp
@@ -8,72 +8,53 @@
#include <cassert>
-#include "base/no_destructor.h"
+#include "base/strings/string_piece.h"
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversion_utils.h"
namespace zxcvbn {
namespace util {
+bool utf8_valid(std::string::const_iterator start,
+ std::string::const_iterator end) {
+ return base::IsStringUTF8(base::MakeStringPiece(start, end));
+}
+
+bool utf8_valid(const std::string & str) {
+ return utf8_valid(str.begin(), str.end());
+}
+
std::string ascii_lower(const std::string & in) {
- const char A = 0x41, Z = 0x5A;
- const char a = 0x61;
- auto result = in;
- std::transform(result.begin(), result.end(), result.begin(),
- [&] (char c) {
- return (c >= A && c <= Z
- ? c - A + a
- : c);
- });
- return result;
+ return base::ToLowerASCII(in);
}
std::string reverse_string(const std::string & in) {
+ if (!utf8_valid(in))
+ return std::string(in.rbegin(), in.rend());
+
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv;
auto ret = conv.from_bytes(in);
std::reverse(ret.begin(), ret.end());
return conv.to_bytes(ret);
}
-const std::codecvt_utf8<char32_t>& char32_conv() {
- static base::NoDestructor<std::codecvt_utf8<char32_t>> char32_conv;
- return *char32_conv;
-}
+template<class It>
+std::pair<char32_t, It> _utf8_decode(It it, It end) {
+ assert(it != end);
+ const char* src = &*it;
+ size_t src_len = static_cast<size_t>(std::distance(it, end));
+ size_t char_index = 0;
+ base_icu::UChar32 code_point_out;
-bool utf8_valid(std::string::const_iterator start,
- std::string::const_iterator end) {
- while (start != end) {
- std::mbstate_t st;
-
- const char *from = &*start;
- const char *from_end = &*end;
- const char *from_next;
-
- char32_t new_char;
- char32_t *to_next;
-
- auto res = char32_conv().in(st, from, from_end, from_next, &new_char,
- &new_char + 1, to_next);
- if (!((res == std::codecvt_utf8<char32_t>::result::partial &&
- from_next != from_end) ||
- (res == std::codecvt_utf8<char32_t>::result::ok &&
- from_next == from_end))) {
- return false;
- }
- start += (from_next - from);
- }
- return true;
+ base::ReadUnicodeCharacter(src, src_len, &char_index, &code_point_out);
+ return {code_point_out, it + ++char_index};
}
-bool utf8_valid(const std::string & str) {
- return utf8_valid(str.begin(), str.end());
-}
template<class It>
It _utf8_iter(It start, It end) {
- assert(start != end);
- std::mbstate_t st;
- auto amt = char32_conv().length(st, &*start, &*end, 1);
- return start + amt;
+ return _utf8_decode(start, end).second;
}
std::string::iterator utf8_iter(std::string::iterator start,
@@ -104,38 +85,6 @@ std::string::size_type character_len(const std::string & str) {
return character_len(str, 0, str.size());
}
-template<class It>
-std::pair<char32_t, It> _utf8_decode(It it, It end) {
- std::mbstate_t st;
- char32_t new_char;
- char32_t *to_next;
-
- assert(it != end);
-
- const char *from = &*it;
- const char *from_end = &*end;
- const char *from_next;
- auto res = char32_conv().in(st, from, from_end, from_next, &new_char,
- &new_char + 1, to_next);
- assert((res == std::codecvt_utf8<char32_t>::result::partial &&
- from_next != from_end) ||
- (res == std::codecvt_utf8<char32_t>::result::ok &&
- from_next == from_end));
- (void) res;
-
- return std::make_pair(new_char, it + (from_next - from));
-}
-
-std::pair<char32_t, std::string::iterator> utf8_decode(std::string::iterator start,
- std::string::iterator end) {
- return _utf8_decode(start, end);
-}
-
-std::pair<char32_t, std::string::const_iterator> utf8_decode(std::string::const_iterator start,
- std::string::const_iterator end) {
- return _utf8_decode(start, end);
-}
-
char32_t utf8_decode(const std::string & start,
std::string::size_type & idx) {
auto ret = _utf8_decode(start.begin() + idx, start.end());
diff --git a/third_party/zxcvbn-cpp/native-src/zxcvbn/util.hpp b/third_party/zxcvbn-cpp/native-src/zxcvbn/util.hpp
index b784c1f6c1d2..90fa99816c92 100644
--- a/third_party/zxcvbn-cpp/native-src/zxcvbn/util.hpp
+++ b/third_party/zxcvbn-cpp/native-src/zxcvbn/util.hpp
@@ -29,8 +29,6 @@ std::string::size_type character_len(const std::string &,
std::string::size_type end) __attribute__((pure));
std::string::size_type character_len(const std::string &) __attribute__((pure));
-std::pair<char32_t, std::string::iterator> utf8_decode(std::string::iterator);
-std::pair<char32_t, std::string::const_iterator> utf8_decode(std::string::const_iterator);
char32_t utf8_decode(const std::string & start,
std::string::size_type & idx);