| // 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 |
| |
| #ifndef XFA_FDE_CSS_FDE_CSSSYNTAX_H_ |
| #define XFA_FDE_CSS_FDE_CSSSYNTAX_H_ |
| |
| #include "xfa/fde/css/fde_css.h" |
| #include "xfa/fgas/crt/fgas_memory.h" |
| #include "xfa/fgas/crt/fgas_stream.h" |
| |
| class CFDE_CSSTextBuf : public CFX_Target { |
| public: |
| CFDE_CSSTextBuf(); |
| ~CFDE_CSSTextBuf() override; |
| |
| FX_BOOL AttachBuffer(const FX_WCHAR* pBuffer, int32_t iBufLen); |
| FX_BOOL EstimateSize(int32_t iAllocSize); |
| int32_t LoadFromStream(IFX_Stream* pTxtStream, |
| int32_t iStreamOffset, |
| int32_t iMaxChars, |
| FX_BOOL& bEOS); |
| FX_BOOL AppendChar(FX_WCHAR wch) { |
| if (m_iDatLen >= m_iBufLen && !ExpandBuf(m_iBufLen * 2)) { |
| return FALSE; |
| } |
| return (m_pBuffer[m_iDatLen++] = wch), TRUE; |
| } |
| void Clear() { m_iDatPos = m_iDatLen = 0; } |
| void Reset(); |
| int32_t TrimEnd() { |
| while (m_iDatLen > 0 && m_pBuffer[m_iDatLen - 1] <= ' ') { |
| --m_iDatLen; |
| } |
| AppendChar(0); |
| return --m_iDatLen; |
| } |
| void Subtract(int32_t iStart, int32_t iLength); |
| FX_BOOL IsEOF() const { return m_iDatPos >= m_iDatLen; } |
| FX_WCHAR GetAt(int32_t index) const { return m_pBuffer[index]; } |
| FX_WCHAR GetChar() const { return m_pBuffer[m_iDatPos]; } |
| FX_WCHAR GetNextChar() const { |
| return (m_iDatPos + 1 >= m_iDatLen) ? 0 : m_pBuffer[m_iDatPos + 1]; |
| } |
| void MoveNext() { m_iDatPos++; } |
| int32_t GetLength() const { return m_iDatLen; } |
| const FX_WCHAR* GetBuffer() const { return m_pBuffer; } |
| |
| protected: |
| FX_BOOL ExpandBuf(int32_t iDesiredSize); |
| FX_BOOL m_bExtBuf; |
| FX_WCHAR* m_pBuffer; |
| int32_t m_iBufLen; |
| int32_t m_iDatLen; |
| int32_t m_iDatPos; |
| }; |
| |
| #define FDE_CSSSYNTAXCHECK_AllowCharset 1 |
| #define FDE_CSSSYNTAXCHECK_AllowImport 2 |
| |
| enum FDE_CSSSYNTAXMODE { |
| FDE_CSSSYNTAXMODE_RuleSet, |
| FDE_CSSSYNTAXMODE_Comment, |
| FDE_CSSSYNTAXMODE_AtRule, |
| FDE_CSSSYNTAXMODE_UnknownRule, |
| FDE_CSSSYNTAXMODE_Charset, |
| FDE_CSSSYNTAXMODE_Import, |
| FDE_CSSSYNTAXMODE_MediaRule, |
| FDE_CSSSYNTAXMODE_URI, |
| FDE_CSSSYNTAXMODE_MediaType, |
| FDE_CSSSYNTAXMODE_Selector, |
| FDE_CSSSYNTAXMODE_PropertyName, |
| FDE_CSSSYNTAXMODE_PropertyValue, |
| }; |
| |
| class CFDE_CSSSyntaxParser : public CFX_Target { |
| public: |
| CFDE_CSSSyntaxParser(); |
| ~CFDE_CSSSyntaxParser() override; |
| |
| FX_BOOL Init(IFX_Stream* pStream, |
| int32_t iCSSPlaneSize, |
| int32_t iTextDataSize = 32, |
| FX_BOOL bOnlyDeclaration = FALSE); |
| FX_BOOL Init(const FX_WCHAR* pBuffer, |
| int32_t iBufferSize, |
| int32_t iTextDatSize = 32, |
| FX_BOOL bOnlyDeclaration = FALSE); |
| FDE_CSSSYNTAXSTATUS DoSyntaxParse(); |
| const FX_WCHAR* GetCurrentString(int32_t& iLength) const; |
| |
| protected: |
| void Reset(FX_BOOL bOnlyDeclaration); |
| void SwitchMode(FDE_CSSSYNTAXMODE eMode); |
| int32_t SwitchToComment(); |
| |
| FX_BOOL RestoreMode(); |
| FX_BOOL AppendChar(FX_WCHAR wch); |
| int32_t SaveTextData(); |
| FX_BOOL IsCharsetEnabled() const { |
| return (m_dwCheck & FDE_CSSSYNTAXCHECK_AllowCharset) != 0; |
| } |
| void DisableCharset() { m_dwCheck = FDE_CSSSYNTAXCHECK_AllowImport; } |
| FX_BOOL IsImportEnabled() const; |
| void DisableImport() { m_dwCheck = 0; } |
| |
| IFX_Stream* m_pStream; |
| int32_t m_iStreamPos; |
| int32_t m_iPlaneSize; |
| CFDE_CSSTextBuf m_TextData; |
| CFDE_CSSTextBuf m_TextPlane; |
| int32_t m_iTextDatLen; |
| uint32_t m_dwCheck; |
| FDE_CSSSYNTAXMODE m_eMode; |
| FDE_CSSSYNTAXSTATUS m_eStatus; |
| CFX_StackTemplate<FDE_CSSSYNTAXMODE> m_ModeStack; |
| }; |
| |
| #endif // XFA_FDE_CSS_FDE_CSSSYNTAX_H_ |