OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2003 Lars Knoll (knoll@kde.org) | |
3 * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. | |
4 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> | |
5 * Copyright (C) 2009 - 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserve
d. | |
6 * | |
7 * This library is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Library General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2 of the License, or (at your option) any later version. | |
11 * | |
12 * This library is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Library General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Library General Public License | |
18 * along with this library; see the file COPYING.LIB. If not, write to | |
19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
20 * Boston, MA 02110-1301, USA. | |
21 */ | |
22 | |
23 #ifndef CSSTokenizer_h | |
24 #define CSSTokenizer_h | |
25 | |
26 #include "wtf/Noncopyable.h" | |
27 #include "wtf/OwnPtr.h" | |
28 #include "wtf/text/WTFString.h" | |
29 | |
30 namespace blink { | |
31 | |
32 class BisonCSSParser; | |
33 struct CSSParserLocation; | |
34 struct CSSParserString; | |
35 | |
36 class CSSTokenizer { | |
37 WTF_MAKE_NONCOPYABLE(CSSTokenizer); | |
38 public: | |
39 // FIXME: This should not be needed but there are still some ties between th
e 2 classes. | |
40 friend class BisonCSSParser; | |
41 | |
42 CSSTokenizer(BisonCSSParser& parser) | |
43 : m_parser(parser) | |
44 , m_parsedTextPrefixLength(0) | |
45 , m_parsedTextSuffixLength(0) | |
46 , m_parsingMode(NormalMode) | |
47 , m_is8BitSource(false) | |
48 , m_length(0) | |
49 , m_token(0) | |
50 , m_lineNumber(0) | |
51 , m_tokenStartLineNumber(0) | |
52 , m_internal(true) | |
53 { | |
54 m_tokenStart.ptr8 = 0; | |
55 } | |
56 | |
57 void setupTokenizer(const char* prefix, unsigned prefixLength, const String&
, const char* suffix, unsigned suffixLength); | |
58 | |
59 CSSParserLocation currentLocation(); | |
60 | |
61 inline int lex(void* yylval) { return (this->*m_lexFunc)(yylval); } | |
62 | |
63 inline unsigned safeUserStringTokenOffset() | |
64 { | |
65 return std::min(tokenStartOffset(), static_cast<unsigned>(m_length - 1 -
m_parsedTextSuffixLength)) - m_parsedTextPrefixLength; | |
66 } | |
67 | |
68 bool is8BitSource() const { return m_is8BitSource; } | |
69 | |
70 // FIXME: These 2 functions should be private so that we don't need the defi
nitions below. | |
71 template <typename CharacterType> | |
72 inline CharacterType* tokenStart(); | |
73 | |
74 inline unsigned tokenStartOffset(); | |
75 | |
76 private: | |
77 UChar* allocateStringBuffer16(size_t len); | |
78 | |
79 template <typename CharacterType> | |
80 inline CharacterType*& currentCharacter(); | |
81 | |
82 template <typename CharacterType> | |
83 inline CharacterType* dataStart(); | |
84 | |
85 template <typename CharacterType> | |
86 inline void setTokenStart(CharacterType*); | |
87 | |
88 template <typename CharacterType> | |
89 inline bool isIdentifierStart(); | |
90 | |
91 template <typename CharacterType> | |
92 inline CSSParserLocation tokenLocation(); | |
93 | |
94 template <typename CharacterType> | |
95 static unsigned parseEscape(CharacterType*&); | |
96 template <typename DestCharacterType> | |
97 static inline void UnicodeToChars(DestCharacterType*&, unsigned); | |
98 | |
99 template <typename SrcCharacterType, typename DestCharacterType> | |
100 static inline bool parseIdentifierInternal(SrcCharacterType*&, DestCharacter
Type*&, bool&); | |
101 template <typename SrcCharacterType> | |
102 static size_t peekMaxIdentifierLen(SrcCharacterType*); | |
103 template <typename CharacterType> | |
104 inline void parseIdentifier(CharacterType*&, CSSParserString&, bool&); | |
105 | |
106 template <typename SrcCharacterType> | |
107 static size_t peekMaxStringLen(SrcCharacterType*, UChar quote); | |
108 template <typename SrcCharacterType, typename DestCharacterType> | |
109 static inline bool parseStringInternal(SrcCharacterType*&, DestCharacterType
*&, UChar); | |
110 template <typename CharacterType> | |
111 inline void parseString(CharacterType*&, CSSParserString& resultString, UCha
r); | |
112 | |
113 template <typename CharacterType> | |
114 inline bool findURI(CharacterType*& start, CharacterType*& end, UChar& quote
); | |
115 template <typename SrcCharacterType> | |
116 static size_t peekMaxURILen(SrcCharacterType*, UChar quote); | |
117 template <typename SrcCharacterType, typename DestCharacterType> | |
118 static inline bool parseURIInternal(SrcCharacterType*&, DestCharacterType*&,
UChar quote); | |
119 template <typename CharacterType> | |
120 inline void parseURI(CSSParserString&); | |
121 | |
122 template <typename CharacterType> | |
123 inline bool parseUnicodeRange(); | |
124 template <typename CharacterType> | |
125 bool parseNthChild(); | |
126 template <typename CharacterType> | |
127 bool parseNthChildExtra(); | |
128 template <typename CharacterType> | |
129 inline bool detectFunctionTypeToken(int); | |
130 template <typename CharacterType> | |
131 inline void detectMediaQueryToken(int); | |
132 template <typename CharacterType> | |
133 inline void detectNumberToken(CharacterType*, int); | |
134 template <typename CharacterType> | |
135 inline void detectDashToken(int); | |
136 template <typename CharacterType> | |
137 inline void detectAtToken(int, bool); | |
138 template <typename CharacterType> | |
139 inline void detectSupportsToken(int); | |
140 | |
141 template <typename SourceCharacterType> | |
142 int realLex(void* yylval); | |
143 | |
144 BisonCSSParser& m_parser; | |
145 | |
146 size_t m_parsedTextPrefixLength; | |
147 size_t m_parsedTextSuffixLength; | |
148 | |
149 enum ParsingMode { | |
150 NormalMode, | |
151 MediaQueryMode, | |
152 SupportsMode, | |
153 NthChildMode | |
154 }; | |
155 | |
156 ParsingMode m_parsingMode; | |
157 bool m_is8BitSource; | |
158 OwnPtr<LChar[]> m_dataStart8; | |
159 OwnPtr<UChar[]> m_dataStart16; | |
160 LChar* m_currentCharacter8; | |
161 UChar* m_currentCharacter16; | |
162 | |
163 // During parsing of an ASCII stylesheet we might locate escape | |
164 // sequences that expand into UTF-16 code points. Strings, | |
165 // identifiers and URIs containing such escape sequences are | |
166 // stored in m_cssStrings16 so that we don't have to store the | |
167 // whole stylesheet as UTF-16. | |
168 Vector<OwnPtr<UChar[]> > m_cssStrings16; | |
169 union { | |
170 LChar* ptr8; | |
171 UChar* ptr16; | |
172 } m_tokenStart; | |
173 unsigned m_length; | |
174 int m_token; | |
175 int m_lineNumber; | |
176 int m_tokenStartLineNumber; | |
177 | |
178 // FIXME: This boolean is misnamed. Also it would be nice if we could consol
idate it | |
179 // with the CSSParserMode logic to determine if internal properties are allo
wed. | |
180 bool m_internal; | |
181 | |
182 int (CSSTokenizer::*m_lexFunc)(void*); | |
183 }; | |
184 | |
185 inline unsigned CSSTokenizer::tokenStartOffset() | |
186 { | |
187 if (is8BitSource()) | |
188 return m_tokenStart.ptr8 - m_dataStart8.get(); | |
189 return m_tokenStart.ptr16 - m_dataStart16.get(); | |
190 } | |
191 | |
192 template <> | |
193 inline LChar* CSSTokenizer::tokenStart<LChar>() | |
194 { | |
195 return m_tokenStart.ptr8; | |
196 } | |
197 | |
198 template <> | |
199 inline UChar* CSSTokenizer::tokenStart<UChar>() | |
200 { | |
201 return m_tokenStart.ptr16; | |
202 } | |
203 | |
204 } // namespace blink | |
205 | |
206 #endif // CSSTokenizer_h | |
OLD | NEW |