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