// Copyright 2017 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/fde/css/cfde_cssvaluelistparser.h"

#include "core/fxcrt/fx_extension.h"

CFDE_CSSValueListParser::CFDE_CSSValueListParser(const wchar_t* psz,
                                                 int32_t iLen,
                                                 wchar_t separator)
    : m_Separator(separator), m_pCur(psz), m_pEnd(psz + iLen) {
  ASSERT(psz && iLen > 0);
}

bool CFDE_CSSValueListParser::NextValue(FDE_CSSPrimitiveType& eType,
                                        const wchar_t*& pStart,
                                        int32_t& iLength) {
  while (m_pCur < m_pEnd && (*m_pCur <= ' ' || *m_pCur == m_Separator))
    ++m_pCur;

  if (m_pCur >= m_pEnd)
    return false;

  eType = FDE_CSSPrimitiveType::Unknown;
  pStart = m_pCur;
  iLength = 0;
  wchar_t wch = *m_pCur;
  if (wch == '#') {
    iLength = SkipTo(' ', false, false);
    if (iLength == 4 || iLength == 7)
      eType = FDE_CSSPrimitiveType::RGB;
  } else if (std::iswdigit(wch) || wch == '.' || wch == '-' || wch == '+') {
    while (m_pCur < m_pEnd && (*m_pCur > ' ' && *m_pCur != m_Separator))
      ++m_pCur;

    iLength = m_pCur - pStart;
    eType = FDE_CSSPrimitiveType::Number;
  } else if (wch == '\"' || wch == '\'') {
    pStart++;
    m_pCur++;
    iLength = SkipTo(wch, false, false);
    m_pCur++;
    eType = FDE_CSSPrimitiveType::String;
  } else if (m_pEnd - m_pCur > 5 && m_pCur[3] == '(') {
    if (FXSYS_wcsnicmp(L"rgb", m_pCur, 3) == 0) {
      iLength = SkipTo(')', false, false) + 1;
      m_pCur++;
      eType = FDE_CSSPrimitiveType::RGB;
    }
  } else {
    iLength = SkipTo(m_Separator, true, true);
    eType = FDE_CSSPrimitiveType::String;
  }
  return m_pCur <= m_pEnd && iLength > 0;
}

int32_t CFDE_CSSValueListParser::SkipTo(wchar_t wch,
                                        bool breakOnSpace,
                                        bool matchBrackets) {
  const wchar_t* pStart = m_pCur;
  int32_t bracketCount = 0;
  while (m_pCur < m_pEnd && *m_pCur != wch) {
    if (breakOnSpace && *m_pCur <= ' ')
      break;
    if (!matchBrackets) {
      m_pCur++;
      continue;
    }

    if (*m_pCur == '(')
      bracketCount++;
    else if (*m_pCur == ')')
      bracketCount--;

    m_pCur++;
  }

  while (bracketCount > 0 && m_pCur < m_pEnd) {
    if (*m_pCur == ')')
      bracketCount--;
    m_pCur++;
  }
  return m_pCur - pStart;
}
