1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifndef _FDE_CSSSYNTAX 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FDE_CSSSYNTAX 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CFDE_CSSTextBuf : public CFX_Target { 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFDE_CSSTextBuf(); 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ~CFDE_CSSTextBuf(); 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL AttachBuffer(const FX_WCHAR* pBuffer, int32_t iBufLen); 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL EstimateSize(int32_t iAllocSize); 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t LoadFromStream(IFX_Stream* pTxtStream, 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iStreamOffset, 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iMaxChars, 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL& bEOS); 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL AppendChar(FX_WCHAR wch) { 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_iDatLen >= m_iBufLen && !ExpandBuf(m_iBufLen * 2)) { 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (m_pBuffer[m_iDatLen++] = wch), TRUE; 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void Clear() { m_iDatPos = m_iDatLen = 0; } 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void Reset(); 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t TrimEnd() { 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (m_iDatLen > 0 && m_pBuffer[m_iDatLen - 1] <= ' ') { 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann --m_iDatLen; 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppendChar(0); 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return --m_iDatLen; 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void Subtract(int32_t iStart, int32_t iLength); 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL IsEOF() const { return m_iDatPos >= m_iDatLen; } 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_WCHAR GetAt(int32_t index) const { return m_pBuffer[index]; } 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_WCHAR GetChar() const { return m_pBuffer[m_iDatPos]; } 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_WCHAR GetNextChar() const { 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (m_iDatPos + 1 >= m_iDatLen) ? 0 : m_pBuffer[m_iDatPos + 1]; 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void MoveNext() { m_iDatPos++; } 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t GetLength() const { return m_iDatLen; } 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* GetBuffer() const { return m_pBuffer; } 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann protected: 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL ExpandBuf(int32_t iDesiredSize); 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL m_bExtBuf; 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_WCHAR* m_pBuffer; 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t m_iBufLen; 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t m_iDatLen; 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t m_iDatPos; 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}; 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FDE_CSSSYNTAXCHECK_AllowCharset 1 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FDE_CSSSYNTAXCHECK_AllowImport 2 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannenum FDE_CSSSYNTAXMODE { 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_RuleSet, 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_Comment, 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_AtRule, 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_UnknownRule, 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_Charset, 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_Import, 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_MediaRule, 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_URI, 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_MediaType, 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_Selector, 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_PropertyName, 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE_PropertyValue, 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}; 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CFDE_CSSSyntaxParser : public IFDE_CSSSyntaxParser, public CFX_Target { 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFDE_CSSSyntaxParser(); 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ~CFDE_CSSSyntaxParser(); 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual void Release() { delete this; } 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_BOOL Init(IFX_Stream* pStream, 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iCSSPlaneSize, 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iTextDataSize = 32, 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bOnlyDeclaration = FALSE); 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FX_BOOL Init(const FX_WCHAR* pBuffer, 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iBufferSize, 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iTextDatSize = 32, 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bOnlyDeclaration = FALSE); 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual FDE_CSSSYNTAXSTATUS DoSyntaxParse(); 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual const FX_WCHAR* GetCurrentString(int32_t& iLength) const; 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann protected: 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void Reset(FX_BOOL bOnlyDeclaration); 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void SwitchMode(FDE_CSSSYNTAXMODE eMode); 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t SwitchToComment(); 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL RestoreMode(); 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL AppendChar(FX_WCHAR wch); 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t SaveTextData(); 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL IsCharsetEnabled() const { 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (m_dwCheck & FDE_CSSSYNTAXCHECK_AllowCharset) != 0; 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void DisableCharset() { m_dwCheck = FDE_CSSSYNTAXCHECK_AllowImport; } 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL IsImportEnabled() const; 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void DisableImport() { m_dwCheck = 0; } 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann IFX_Stream* m_pStream; 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t m_iStreamPos; 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t m_iPlaneSize; 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFDE_CSSTextBuf m_TextData; 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFDE_CSSTextBuf m_TextPlane; 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t m_iTextDatLen; 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD m_dwCheck; 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXMODE m_eMode; 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDE_CSSSYNTAXSTATUS m_eStatus; 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_StackTemplate<FDE_CSSSYNTAXMODE> m_ModeStack; 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}; 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 111