Use span<> in CFXA_FMLexer.

Change-Id: Ief4c541c4342464de1f17b9ee47401bb428ba194
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/52690
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
index 000a683..b0dc693 100644
--- a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
@@ -130,28 +130,26 @@
 #endif  // NDEBUG
 
 CXFA_FMLexer::CXFA_FMLexer(WideStringView wsFormCalc)
-    : m_cursor(wsFormCalc.unterminated_c_str()),
-      m_end(m_cursor + wsFormCalc.GetLength()),
-      m_lexer_error(false) {}
+    : m_spInput(wsFormCalc.span()) {}
 
 CXFA_FMLexer::~CXFA_FMLexer() = default;
 
 CXFA_FMToken CXFA_FMLexer::NextToken() {
-  if (m_lexer_error)
+  if (m_bLexerError)
     return CXFA_FMToken();
 
-  while (!IsComplete() && *m_cursor) {
-    if (!IsFormCalcCharacter(*m_cursor)) {
+  while (!IsComplete() && m_spInput[m_nCursor]) {
+    if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
       RaiseError();
       return CXFA_FMToken();
     }
 
-    switch (*m_cursor) {
+    switch (m_spInput[m_nCursor]) {
       case '\n':
-        ++m_cursor;
+        ++m_nCursor;
         break;
       case '\r':
-        ++m_cursor;
+        ++m_nCursor;
         break;
       case ';':
         AdvanceForComment();
@@ -170,129 +168,129 @@
       case '9':
         return AdvanceForNumber();
       case '=':
-        ++m_cursor;
-        if (m_cursor >= m_end)
+        ++m_nCursor;
+        if (m_nCursor >= m_spInput.size())
           return CXFA_FMToken(TOKassign);
 
-        if (!IsFormCalcCharacter(*m_cursor)) {
+        if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
           RaiseError();
           return CXFA_FMToken();
         }
-        if (*m_cursor == '=') {
-          ++m_cursor;
+        if (m_spInput[m_nCursor] == '=') {
+          ++m_nCursor;
           return CXFA_FMToken(TOKeq);
         }
         return CXFA_FMToken(TOKassign);
       case '<':
-        ++m_cursor;
-        if (m_cursor >= m_end)
+        ++m_nCursor;
+        if (m_nCursor >= m_spInput.size())
           return CXFA_FMToken(TOKlt);
 
-        if (!IsFormCalcCharacter(*m_cursor)) {
+        if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
           RaiseError();
           return CXFA_FMToken();
         }
-        if (*m_cursor == '=') {
-          ++m_cursor;
+        if (m_spInput[m_nCursor] == '=') {
+          ++m_nCursor;
           return CXFA_FMToken(TOKle);
         }
-        if (*m_cursor == '>') {
-          ++m_cursor;
+        if (m_spInput[m_nCursor] == '>') {
+          ++m_nCursor;
           return CXFA_FMToken(TOKne);
         }
         return CXFA_FMToken(TOKlt);
       case '>':
-        ++m_cursor;
-        if (m_cursor >= m_end)
+        ++m_nCursor;
+        if (m_nCursor >= m_spInput.size())
           return CXFA_FMToken(TOKgt);
 
-        if (!IsFormCalcCharacter(*m_cursor)) {
+        if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
           RaiseError();
           return CXFA_FMToken();
         }
-        if (*m_cursor == '=') {
-          ++m_cursor;
+        if (m_spInput[m_nCursor] == '=') {
+          ++m_nCursor;
           return CXFA_FMToken(TOKge);
         }
         return CXFA_FMToken(TOKgt);
       case ',':
-        ++m_cursor;
+        ++m_nCursor;
         return CXFA_FMToken(TOKcomma);
       case '(':
-        ++m_cursor;
+        ++m_nCursor;
         return CXFA_FMToken(TOKlparen);
       case ')':
-        ++m_cursor;
+        ++m_nCursor;
         return CXFA_FMToken(TOKrparen);
       case '[':
-        ++m_cursor;
+        ++m_nCursor;
         return CXFA_FMToken(TOKlbracket);
       case ']':
-        ++m_cursor;
+        ++m_nCursor;
         return CXFA_FMToken(TOKrbracket);
       case '&':
-        ++m_cursor;
+        ++m_nCursor;
         return CXFA_FMToken(TOKand);
       case '|':
-        ++m_cursor;
+        ++m_nCursor;
         return CXFA_FMToken(TOKor);
       case '+':
-        ++m_cursor;
+        ++m_nCursor;
         return CXFA_FMToken(TOKplus);
       case '-':
-        ++m_cursor;
+        ++m_nCursor;
         return CXFA_FMToken(TOKminus);
       case '*':
-        ++m_cursor;
+        ++m_nCursor;
         return CXFA_FMToken(TOKmul);
       case '/': {
-        ++m_cursor;
-        if (m_cursor >= m_end)
+        ++m_nCursor;
+        if (m_nCursor >= m_spInput.size())
           return CXFA_FMToken(TOKdiv);
 
-        if (!IsFormCalcCharacter(*m_cursor)) {
+        if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
           RaiseError();
           return CXFA_FMToken();
         }
-        if (*m_cursor != '/')
+        if (m_spInput[m_nCursor] != '/')
           return CXFA_FMToken(TOKdiv);
 
         AdvanceForComment();
         break;
       }
       case '.':
-        ++m_cursor;
-        if (m_cursor >= m_end)
+        ++m_nCursor;
+        if (m_nCursor >= m_spInput.size())
           return CXFA_FMToken(TOKdot);
 
-        if (!IsFormCalcCharacter(*m_cursor)) {
+        if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
           RaiseError();
           return CXFA_FMToken();
         }
 
-        if (*m_cursor == '.') {
-          ++m_cursor;
+        if (m_spInput[m_nCursor] == '.') {
+          ++m_nCursor;
           return CXFA_FMToken(TOKdotdot);
         }
-        if (*m_cursor == '*') {
-          ++m_cursor;
+        if (m_spInput[m_nCursor] == '*') {
+          ++m_nCursor;
           return CXFA_FMToken(TOKdotstar);
         }
-        if (*m_cursor == '#') {
-          ++m_cursor;
+        if (m_spInput[m_nCursor] == '#') {
+          ++m_nCursor;
           return CXFA_FMToken(TOKdotscream);
         }
-        if (FXSYS_IsDecimalDigit(*m_cursor)) {
-          --m_cursor;
+        if (FXSYS_IsDecimalDigit(m_spInput[m_nCursor])) {
+          --m_nCursor;
           return AdvanceForNumber();
         }
         return CXFA_FMToken(TOKdot);
       default:
-        if (IsWhitespaceCharacter(*m_cursor)) {
-          ++m_cursor;
+        if (IsWhitespaceCharacter(m_spInput[m_nCursor])) {
+          ++m_nCursor;
           break;
         }
-        if (!IsInitialIdentifierCharacter(*m_cursor)) {
+        if (!IsInitialIdentifierCharacter(m_spInput[m_nCursor])) {
           RaiseError();
           return CXFA_FMToken();
         }
@@ -305,51 +303,52 @@
 CXFA_FMToken CXFA_FMLexer::AdvanceForNumber() {
   // This will set end to the character after the end of the number.
   int32_t used_length = 0;
-  if (m_cursor)
-    FXSYS_wcstof(m_cursor, m_end - m_cursor, &used_length);
-
-  const wchar_t* end = m_cursor + used_length;
-  if (used_length == 0 || !end || FXSYS_iswalpha(*end)) {
+  if (m_nCursor < m_spInput.size()) {
+    FXSYS_wcstof(&m_spInput[m_nCursor], m_spInput.size() - m_nCursor,
+                 &used_length);
+  }
+  size_t end = m_nCursor + used_length;
+  if (used_length == 0 ||
+      (end < m_spInput.size() && FXSYS_iswalpha(m_spInput[end]))) {
     RaiseError();
     return CXFA_FMToken();
   }
-
   CXFA_FMToken token(TOKnumber);
   token.m_string =
-      WideStringView(m_cursor, static_cast<size_t>(end - m_cursor));
-  m_cursor = end;
+      WideStringView(m_spInput.subspan(m_nCursor, end - m_nCursor));
+  m_nCursor = end;
   return token;
 }
 
 CXFA_FMToken CXFA_FMLexer::AdvanceForString() {
   CXFA_FMToken token(TOKstring);
-
-  const wchar_t* start = m_cursor;
-  ++m_cursor;
-  while (!IsComplete() && *m_cursor) {
-    if (!IsFormCalcCharacter(*m_cursor))
+  size_t start = m_nCursor;
+  ++m_nCursor;
+  while (!IsComplete() && m_spInput[m_nCursor]) {
+    if (!IsFormCalcCharacter(m_spInput[m_nCursor]))
       break;
 
-    if (*m_cursor == '"') {
+    if (m_spInput[m_nCursor] == '"') {
       // Check for escaped "s, i.e. "".
-      ++m_cursor;
+      ++m_nCursor;
       // If the end of the input has been reached it was not escaped.
-      if (m_cursor >= m_end) {
+      if (m_nCursor >= m_spInput.size()) {
         token.m_string =
-            WideStringView(start, static_cast<size_t>(m_cursor - start));
+            WideStringView(m_spInput.subspan(start, m_nCursor - start));
         return token;
       }
       // If the next character is not a " then the end of the string has been
       // found.
-      if (*m_cursor != '"') {
-        if (!IsFormCalcCharacter(*m_cursor))
+      if (m_spInput[m_nCursor] != '"') {
+        if (!IsFormCalcCharacter(m_spInput[m_nCursor]))
           break;
 
-        token.m_string = WideStringView(start, (m_cursor - start));
+        token.m_string =
+            WideStringView(m_spInput.subspan(start, m_nCursor - start));
         return token;
       }
     }
-    ++m_cursor;
+    ++m_nCursor;
   }
 
   // Didn't find the end of the string.
@@ -358,41 +357,41 @@
 }
 
 CXFA_FMToken CXFA_FMLexer::AdvanceForIdentifier() {
-  const wchar_t* start = m_cursor;
-  ++m_cursor;
-  while (!IsComplete() && *m_cursor) {
-    if (!IsFormCalcCharacter(*m_cursor)) {
+  size_t start = m_nCursor;
+  ++m_nCursor;
+  while (!IsComplete() && m_spInput[m_nCursor]) {
+    if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
       RaiseError();
       return CXFA_FMToken();
     }
-    if (!IsIdentifierCharacter(*m_cursor))
+    if (!IsIdentifierCharacter(m_spInput[m_nCursor]))
       break;
 
-    ++m_cursor;
+    ++m_nCursor;
   }
 
   WideStringView str =
-      WideStringView(start, static_cast<size_t>(m_cursor - start));
+      WideStringView(m_spInput.subspan(start, m_nCursor - start));
   CXFA_FMToken token(TokenizeIdentifier(str));
   token.m_string = str;
   return token;
 }
 
 void CXFA_FMLexer::AdvanceForComment() {
-  m_cursor++;
-  while (!IsComplete() && *m_cursor) {
-    if (!IsFormCalcCharacter(*m_cursor)) {
+  ++m_nCursor;
+  while (!IsComplete() && m_spInput[m_nCursor]) {
+    if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
       RaiseError();
       return;
     }
-    if (*m_cursor == L'\r') {
-      ++m_cursor;
+    if (m_spInput[m_nCursor] == L'\r') {
+      ++m_nCursor;
       return;
     }
-    if (*m_cursor == L'\n') {
-      ++m_cursor;
+    if (m_spInput[m_nCursor] == L'\n') {
+      ++m_nCursor;
       return;
     }
-    ++m_cursor;
+    ++m_nCursor;
   }
 }
diff --git a/xfa/fxfa/fm2js/cxfa_fmlexer.h b/xfa/fxfa/fm2js/cxfa_fmlexer.h
index bc87898..2d9e5fc 100644
--- a/xfa/fxfa/fm2js/cxfa_fmlexer.h
+++ b/xfa/fxfa/fm2js/cxfa_fmlexer.h
@@ -106,7 +106,7 @@
   ~CXFA_FMLexer();
 
   CXFA_FMToken NextToken();
-  bool IsComplete() const { return m_cursor >= m_end; }
+  bool IsComplete() const { return m_nCursor >= m_spInput.size(); }
 
  private:
   CXFA_FMToken AdvanceForNumber();
@@ -114,11 +114,11 @@
   CXFA_FMToken AdvanceForIdentifier();
   void AdvanceForComment();
 
-  void RaiseError() { m_lexer_error = true; }
+  void RaiseError() { m_bLexerError = true; }
 
-  const wchar_t* m_cursor;
-  const wchar_t* const m_end;
-  bool m_lexer_error;
+  pdfium::span<const wchar_t> m_spInput;
+  size_t m_nCursor = 0;
+  bool m_bLexerError = false;
 };
 
 #endif  // XFA_FXFA_FM2JS_CXFA_FMLEXER_H_