summaryrefslogtreecommitdiff
path: root/xfa/src/fdp/src/css/fde_csssyntax.h
blob: 6071b769106cb3d59ef94424ad74650df12bd446 (plain)
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