1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
// 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 _FDE_CSSSYNTAX
#define _FDE_CSSSYNTAX
class CFDE_CSSTextBuf : public CFX_Target
{
public:
CFDE_CSSTextBuf();
~CFDE_CSSTextBuf();
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 IFDE_CSSSyntaxParser, public CFX_Target
{
public:
CFDE_CSSSyntaxParser();
~CFDE_CSSSyntaxParser();
virtual void Release()
{
FDE_Delete this;
}
virtual FX_BOOL Init(IFX_Stream *pStream, int32_t iCSSPlaneSize, int32_t iTextDataSize = 32, FX_BOOL bOnlyDeclaration = FALSE);
virtual FX_BOOL Init(const FX_WCHAR* pBuffer, int32_t iBufferSize, int32_t iTextDatSize = 32, FX_BOOL bOnlyDeclaration = FALSE);
virtual FDE_CSSSYNTAXSTATUS DoSyntaxParse();
virtual 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;
FX_DWORD m_dwCheck;
FDE_CSSSYNTAXMODE m_eMode;
FDE_CSSSYNTAXSTATUS m_eStatus;
CFX_StackTemplate<FDE_CSSSYNTAXMODE> m_ModeStack;
};
#endif
|