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_