// 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 "core/fxcrt/css/cfx_cssvaluelistparser.h"

#include "core/fxcrt/fx_extension.h"

CFX_CSSValueListParser::CFX_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 CFX_CSSValueListParser::NextValue(CFX_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 = CFX_CSSPrimitiveType::Unknown;
  pStart = m_pCur;
  iLength = 0;
  wchar_t wch = *m_pCur;
  if (wch == '#') {
    iLength = SkipTo(' ', false, false);
    if (iLength == 4 || iLength == 7)
      eType = CFX_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 = CFX_CSSPrimitiveType::Number;
  } else if (wch == '\"' || wch == '\'') {
    pStart++;
    m_pCur++;
    iLength = SkipTo(wch, false, false);
    m_pCur++;
    eType = CFX_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 = CFX_CSSPrimitiveType::RGB;
    }
  } else {
    iLength = SkipTo(m_Separator, true, true);
    eType = CFX_CSSPrimitiveType::String;
  }
  return m_pCur <= m_pEnd && iLength > 0;
}

int32_t CFX_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;
}
