Use more WideStringViews in CFX_CSSSelector. Work with indices and length, instead of manipulating pointers. Change-Id: Iaa692770f89ec8dd1531427fd6c91124d3f7b3ab Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/70733 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcrt/css/cfx_cssselector.cpp b/core/fxcrt/css/cfx_cssselector.cpp index 53f00b0..1ea8231 100644 --- a/core/fxcrt/css/cfx_cssselector.cpp +++ b/core/fxcrt/css/cfx_cssselector.cpp
@@ -12,24 +12,20 @@ namespace { -int32_t GetCSSNameLen(const wchar_t* psz, const wchar_t* pEnd) { - const wchar_t* pStart = psz; - while (psz < pEnd) { - if (!isascii(*psz) || (!isalnum(*psz) && *psz != '_' && *psz != '-')) { - break; - } - ++psz; +size_t GetCSSNameLen(WideStringView str) { + for (size_t i = 0; i < str.GetLength(); ++i) { + wchar_t wch = str[i]; + if (!isascii(wch) || (!isalnum(wch) && wch != '_' && wch != '-')) + return i; } - return psz - pStart; + return str.GetLength(); } } // namespace -CFX_CSSSelector::CFX_CSSSelector(const wchar_t* psz, - int32_t iLen, +CFX_CSSSelector::CFX_CSSSelector(WideStringView str, std::unique_ptr<CFX_CSSSelector> next) - : name_hash_( - FX_HashCode_GetW(WideStringView(psz, iLen), /*bIgnoreCase=*/true)), + : name_hash_(FX_HashCode_GetW(str, /*bIgnoreCase=*/true)), next_(std::move(next)) {} CFX_CSSSelector::~CFX_CSSSelector() = default; @@ -39,11 +35,8 @@ WideStringView str) { ASSERT(!str.IsEmpty()); - const wchar_t* psz = str.unterminated_c_str(); - const wchar_t* pStart = psz; - const wchar_t* pEnd = psz + str.GetLength(); - for (; psz < pEnd; ++psz) { - switch (*psz) { + for (wchar_t wch : str) { + switch (wch) { case '>': case '[': case '+': @@ -52,18 +45,19 @@ } std::unique_ptr<CFX_CSSSelector> head; - for (psz = pStart; psz < pEnd;) { - wchar_t wch = *psz; + for (size_t i = 0; i < str.GetLength();) { + wchar_t wch = str[i]; if ((isascii(wch) && isalpha(wch)) || wch == '*') { if (head) head->set_is_descendant(); - int32_t iNameLen = wch == '*' ? 1 : GetCSSNameLen(psz, pEnd); - auto new_head = - std::make_unique<CFX_CSSSelector>(psz, iNameLen, std::move(head)); + size_t len = + wch == '*' ? 1 : GetCSSNameLen(str.Last(str.GetLength() - i)); + auto new_head = std::make_unique<CFX_CSSSelector>(str.Substr(i, len), + std::move(head)); head = std::move(new_head); - psz += iNameLen; + i += len; } else if (wch == ' ') { - psz++; + ++i; } else { return nullptr; }
diff --git a/core/fxcrt/css/cfx_cssselector.h b/core/fxcrt/css/cfx_cssselector.h index 91778ab..41de083 100644 --- a/core/fxcrt/css/cfx_cssselector.h +++ b/core/fxcrt/css/cfx_cssselector.h
@@ -15,9 +15,7 @@ public: static std::unique_ptr<CFX_CSSSelector> FromString(WideStringView str); - CFX_CSSSelector(const wchar_t* psz, - int32_t iLen, - std::unique_ptr<CFX_CSSSelector> next); + CFX_CSSSelector(WideStringView str, std::unique_ptr<CFX_CSSSelector> next); ~CFX_CSSSelector(); bool is_descendant() const { return is_descendant_; }