text: // 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
  
  #ifndef CORE_FXCRT_CSS_CFX_CSSSYNTAXPARSER_H_
  #define CORE_FXCRT_CSS_CFX_CSSSYNTAXPARSER_H_
  
  #include <stack>
  
  #include "core/fxcrt/css/cfx_cssinputtextbuf.h"
  #include "core/fxcrt/css/cfx_cssoutputtextbuf.h"
  #include "core/fxcrt/widestring.h"
  
  class CFX_CSSSyntaxParser {
   public:
    enum class Status : uint8_t {
      kError,
      kEOS,
      kNone,
      kStyleRule,
      kSelector,
      kDeclOpen,
      kDeclClose,
      kPropertyName,
      kPropertyValue,
    };
  
    explicit CFX_CSSSyntaxParser(WideStringView str);
    ~CFX_CSSSyntaxParser();
  
    void SetParseOnlyDeclarations();
    Status DoSyntaxParse();
    WideStringView GetCurrentString() const;
  
   private:
    enum class Mode : uint8_t {
      kRuleSet,
      kComment,
      kSelector,
      kPropertyName,
      kPropertyValue,
    };
  
    void SaveMode(Mode eMode);
    bool RestoreMode();
  
    bool m_bHasError = false;
    Mode m_eMode = Mode::kRuleSet;
    CFX_CSSOutputTextBuf m_Output;
    CFX_CSSInputTextBuf m_Input;
    std::stack<Mode> m_ModeStack;
  };
  
  #endif  // CORE_FXCRT_CSS_CFX_CSSSYNTAXPARSER_H_
  