// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "xfa/fxfa/fm2js/cxfa_fmlexer.h"

#include <algorithm>

#include "core/fxcrt/fx_extension.h"
#include "third_party/icu/source/common/unicode/uchar.h"

namespace {

bool IsFormCalcCharacter(wchar_t c) {
  return (c >= 0x09 && c <= 0x0D) || (c >= 0x20 && c <= 0xd7FF) ||
         (c >= 0xE000 && c <= 0xFFFD);
}

bool IsIdentifierCharacter(wchar_t c) {
  return u_isalnum(c) || c == 0x005F ||  // '_'
         c == 0x0024;                    // '$'
}

bool IsInitialIdentifierCharacter(wchar_t c) {
  return u_isalpha(c) || c == 0x005F ||  // '_'
         c == 0x0024 ||                  // '$'
         c == 0x0021;                    // '!'
}

bool IsWhitespaceCharacter(wchar_t c) {
  return c == 0x0009 ||  // Horizontal tab
         c == 0x000B ||  // Vertical tab
         c == 0x000C ||  // Form feed
         c == 0x0020;    // Space
}

const XFA_FMKeyword keyWords[] = {
    {TOKdo, "do"},
    {TOKkseq, "eq"},
    {TOKksge, "ge"},
    {TOKksgt, "gt"},
    {TOKif, "if"},
    {TOKin, "in"},
    {TOKksle, "le"},
    {TOKkslt, "lt"},
    {TOKksne, "ne"},
    {TOKksor, "or"},
    {TOKnull, "null"},
    {TOKbreak, "break"},
    {TOKksand, "and"},
    {TOKend, "end"},
    {TOKeof, "eof"},
    {TOKfor, "for"},
    {TOKnan, "nan"},
    {TOKksnot, "not"},
    {TOKvar, "var"},
    {TOKthen, "then"},
    {TOKelse, "else"},
    {TOKexit, "exit"},
    {TOKdownto, "downto"},
    {TOKreturn, "return"},
    {TOKinfinity, "infinity"},
    {TOKendwhile, "endwhile"},
    {TOKforeach, "foreach"},
    {TOKendfunc, "endfunc"},
    {TOKelseif, "elseif"},
    {TOKwhile, "while"},
    {TOKendfor, "endfor"},
    {TOKthrow, "throw"},
    {TOKstep, "step"},
    {TOKupto, "upto"},
    {TOKcontinue, "continue"},
    {TOKfunc, "func"},
    {TOKendif, "endif"},
};

#ifndef NDEBUG
const char* const tokenStrings[] = {
    "TOKand",        "TOKlparen",     "TOKrparen",   "TOKmul",
    "TOKplus",       "TOKcomma",      "TOKminus",    "TOKdot",
    "TOKdiv",        "TOKlt",         "TOKassign",   "TOKgt",
    "TOKlbracket",   "TOKrbracket",   "TOKor",       "TOKdotscream",
    "TOKdotstar",    "TOKdotdot",     "TOKle",       "TOKne",
    "TOKeq",         "TOKge",         "TOKdo",       "TOKkseq",
    "TOKksge",       "TOKksgt",       "TOKif",       "TOKin",
    "TOKksle",       "TOKkslt",       "TOKksne",     "TOKksor",
    "TOKnull",       "TOKbreak",      "TOKksand",    "TOKend",
    "TOKeof",        "TOKfor",        "TOKnan",      "TOKksnot",
    "TOKvar",        "TOKthen",       "TOKelse",     "TOKexit",
    "TOKdownto",     "TOKreturn",     "TOKinfinity", "TOKendwhile",
    "TOKforeach",    "TOKendfunc",    "TOKelseif",   "TOKwhile",
    "TOKendfor",     "TOKthrow",      "TOKstep",     "TOKupto",
    "TOKcontinue",   "TOKfunc",       "TOKendif",    "TOKstar",
    "TOKidentifier", "TOKunderscore", "TOKdollar",   "TOKexclamation",
    "TOKcall",       "TOKstring",     "TOKnumber",   "TOKreserver",
};
#endif  // NDEBUG

XFA_FM_TOKEN TokenizeIdentifier(WideStringView str) {
  const XFA_FMKeyword* result =
      std::find_if(std::begin(keyWords), std::end(keyWords),
                   [str](const XFA_FMKeyword& iter) {
                     return str.EqualsASCII(iter.m_keyword);
                   });
  if (result != std::end(keyWords) && str.EqualsASCII(result->m_keyword))
    return result->m_type;
  return TOKidentifier;
}

}  // namespace

CXFA_FMToken::CXFA_FMToken(XFA_FM_TOKEN token) : m_type(token) {}

CXFA_FMToken::CXFA_FMToken() : CXFA_FMToken(TOKreserver) {}

CXFA_FMToken::CXFA_FMToken(const CXFA_FMToken&) = default;

CXFA_FMToken::~CXFA_FMToken() = default;

#ifndef NDEBUG
WideString CXFA_FMToken::ToDebugString() const {
  WideString str = WideString::FromASCII("type = ");
  str += WideString::FromASCII(tokenStrings[m_type]);
  str += WideString::FromASCII(", string = ");
  str += m_string;
  return str;
}
#endif  // NDEBUG

CXFA_FMLexer::CXFA_FMLexer(WideStringView wsFormCalc)
    : m_spInput(wsFormCalc.span()) {}

CXFA_FMLexer::~CXFA_FMLexer() = default;

CXFA_FMToken CXFA_FMLexer::NextToken() {
  if (m_bLexerError)
    return CXFA_FMToken();

  while (!IsComplete() && m_spInput[m_nCursor]) {
    if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
      RaiseError();
      return CXFA_FMToken();
    }

    switch (m_spInput[m_nCursor]) {
      case '\n':
        ++m_nCursor;
        break;
      case '\r':
        ++m_nCursor;
        break;
      case ';':
        AdvanceForComment();
        break;
      case '"':
        return AdvanceForString();
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
        return AdvanceForNumber();
      case '=':
        ++m_nCursor;
        if (m_nCursor >= m_spInput.size())
          return CXFA_FMToken(TOKassign);

        if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
          RaiseError();
          return CXFA_FMToken();
        }
        if (m_spInput[m_nCursor] == '=') {
          ++m_nCursor;
          return CXFA_FMToken(TOKeq);
        }
        return CXFA_FMToken(TOKassign);
      case '<':
        ++m_nCursor;
        if (m_nCursor >= m_spInput.size())
          return CXFA_FMToken(TOKlt);

        if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
          RaiseError();
          return CXFA_FMToken();
        }
        if (m_spInput[m_nCursor] == '=') {
          ++m_nCursor;
          return CXFA_FMToken(TOKle);
        }
        if (m_spInput[m_nCursor] == '>') {
          ++m_nCursor;
          return CXFA_FMToken(TOKne);
        }
        return CXFA_FMToken(TOKlt);
      case '>':
        ++m_nCursor;
        if (m_nCursor >= m_spInput.size())
          return CXFA_FMToken(TOKgt);

        if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
          RaiseError();
          return CXFA_FMToken();
        }
        if (m_spInput[m_nCursor] == '=') {
          ++m_nCursor;
          return CXFA_FMToken(TOKge);
        }
        return CXFA_FMToken(TOKgt);
      case ',':
        ++m_nCursor;
        return CXFA_FMToken(TOKcomma);
      case '(':
        ++m_nCursor;
        return CXFA_FMToken(TOKlparen);
      case ')':
        ++m_nCursor;
        return CXFA_FMToken(TOKrparen);
      case '[':
        ++m_nCursor;
        return CXFA_FMToken(TOKlbracket);
      case ']':
        ++m_nCursor;
        return CXFA_FMToken(TOKrbracket);
      case '&':
        ++m_nCursor;
        return CXFA_FMToken(TOKand);
      case '|':
        ++m_nCursor;
        return CXFA_FMToken(TOKor);
      case '+':
        ++m_nCursor;
        return CXFA_FMToken(TOKplus);
      case '-':
        ++m_nCursor;
        return CXFA_FMToken(TOKminus);
      case '*':
        ++m_nCursor;
        return CXFA_FMToken(TOKmul);
      case '/': {
        ++m_nCursor;
        if (m_nCursor >= m_spInput.size())
          return CXFA_FMToken(TOKdiv);

        if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
          RaiseError();
          return CXFA_FMToken();
        }
        if (m_spInput[m_nCursor] != '/')
          return CXFA_FMToken(TOKdiv);

        AdvanceForComment();
        break;
      }
      case '.':
        ++m_nCursor;
        if (m_nCursor >= m_spInput.size())
          return CXFA_FMToken(TOKdot);

        if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
          RaiseError();
          return CXFA_FMToken();
        }

        if (m_spInput[m_nCursor] == '.') {
          ++m_nCursor;
          return CXFA_FMToken(TOKdotdot);
        }
        if (m_spInput[m_nCursor] == '*') {
          ++m_nCursor;
          return CXFA_FMToken(TOKdotstar);
        }
        if (m_spInput[m_nCursor] == '#') {
          ++m_nCursor;
          return CXFA_FMToken(TOKdotscream);
        }
        if (FXSYS_IsDecimalDigit(m_spInput[m_nCursor])) {
          --m_nCursor;
          return AdvanceForNumber();
        }
        return CXFA_FMToken(TOKdot);
      default:
        if (IsWhitespaceCharacter(m_spInput[m_nCursor])) {
          ++m_nCursor;
          break;
        }
        if (!IsInitialIdentifierCharacter(m_spInput[m_nCursor])) {
          RaiseError();
          return CXFA_FMToken();
        }
        return AdvanceForIdentifier();
    }
  }
  return CXFA_FMToken(TOKeof);
}

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_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_spInput.subspan(m_nCursor, end - m_nCursor));
  m_nCursor = end;
  return token;
}

CXFA_FMToken CXFA_FMLexer::AdvanceForString() {
  CXFA_FMToken token(TOKstring);
  size_t start = m_nCursor;
  ++m_nCursor;
  while (!IsComplete() && m_spInput[m_nCursor]) {
    if (!IsFormCalcCharacter(m_spInput[m_nCursor]))
      break;

    if (m_spInput[m_nCursor] == '"') {
      // Check for escaped "s, i.e. "".
      ++m_nCursor;
      // If the end of the input has been reached it was not escaped.
      if (m_nCursor >= m_spInput.size()) {
        token.m_string =
            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_spInput[m_nCursor] != '"') {
        if (!IsFormCalcCharacter(m_spInput[m_nCursor]))
          break;

        token.m_string =
            WideStringView(m_spInput.subspan(start, m_nCursor - start));
        return token;
      }
    }
    ++m_nCursor;
  }

  // Didn't find the end of the string.
  RaiseError();
  return CXFA_FMToken();
}

CXFA_FMToken CXFA_FMLexer::AdvanceForIdentifier() {
  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_spInput[m_nCursor]))
      break;

    ++m_nCursor;
  }

  WideStringView str =
      WideStringView(m_spInput.subspan(start, m_nCursor - start));
  CXFA_FMToken token(TokenizeIdentifier(str));
  token.m_string = str;
  return token;
}

void CXFA_FMLexer::AdvanceForComment() {
  ++m_nCursor;
  while (!IsComplete() && m_spInput[m_nCursor]) {
    if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
      RaiseError();
      return;
    }
    if (m_spInput[m_nCursor] == L'\r') {
      ++m_nCursor;
      return;
    }
    if (m_spInput[m_nCursor] == L'\n') {
      ++m_nCursor;
      return;
    }
    ++m_nCursor;
  }
}
