151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)/* 251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * Copyright (C) 2003 Lars Knoll (knoll@kde.org) 351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved. 451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * Copyright (C) 2009 - 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. 651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * 751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * This library is free software; you can redistribute it and/or 851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * modify it under the terms of the GNU Library General Public 951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * License as published by the Free Software Foundation; either 1051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * version 2 of the License, or (at your option) any later version. 1151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * 1251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * This library is distributed in the hope that it will be useful, 1351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 1451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * Library General Public License for more details. 1651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * 1751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * You should have received a copy of the GNU Library General Public License 1851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 1951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 2051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * Boston, MA 02110-1301, USA. 2151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) */ 2251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 2351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#ifndef CSSTokenizer_h 2451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#define CSSTokenizer_h 2551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 2651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "wtf/Noncopyable.h" 2751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "wtf/OwnPtr.h" 2851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "wtf/text/WTFString.h" 2951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 3051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace WebCore { 3151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 3251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)class CSSParser; 3351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)struct CSSParserLocation; 3451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)struct CSSParserString; 3551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 3651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)class CSSTokenizer { 3751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) WTF_MAKE_NONCOPYABLE(CSSTokenizer); 3851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)public: 3951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // FIXME: This should not be needed but there are still some ties between the 2 classes. 4051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) friend class CSSParser; 4151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) CSSTokenizer(CSSParser& parser) 4351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : m_parser(parser) 4451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_parsedTextPrefixLength(0) 4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_parsedTextSuffixLength(0) 4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_parsingMode(NormalMode) 4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_is8BitSource(false) 4851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_length(0) 4951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_token(0) 5051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_lineNumber(0) 5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_tokenStartLineNumber(0) 5251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_internal(true) 5351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) { 5451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_tokenStart.ptr8 = 0; 5551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 5651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 5751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void setupTokenizer(const char* prefix, unsigned prefixLength, const String&, const char* suffix, unsigned suffixLength); 5851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 5951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) CSSParserLocation currentLocation(); 6051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 6151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline int lex(void* yylval) { return (this->*m_lexFunc)(yylval); } 6251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 6351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline unsigned safeUserStringTokenOffset() 6451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) { 6551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return std::min(tokenStartOffset(), static_cast<unsigned>(m_length - 1 - m_parsedTextSuffixLength)) - m_parsedTextPrefixLength; 6651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 6751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 6851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool is8BitSource() const { return m_is8BitSource; } 6951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 7051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // FIXME: These 2 functions should be private so that we don't need the definitions below. 7151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 7251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline CharacterType* tokenStart(); 7351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 7451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline unsigned tokenStartOffset(); 7551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 7651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)private: 7751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) UChar*& currentCharacter16(); 7851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 7951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 8051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline CharacterType*& currentCharacter(); 8151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 8251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 8351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline CharacterType* dataStart(); 8451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 8551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 8651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void setTokenStart(CharacterType*); 8751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 8851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 8951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline bool isIdentifierStart(); 9051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 9151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 9251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline CSSParserLocation tokenLocation(); 9351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 9451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 9551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) unsigned parseEscape(CharacterType*&); 9651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename DestCharacterType> 9751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void UnicodeToChars(DestCharacterType*&, unsigned); 9851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename SrcCharacterType, typename DestCharacterType> 9951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline bool parseIdentifierInternal(SrcCharacterType*&, DestCharacterType*&, bool&); 10051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 10151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 10251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void parseIdentifier(CharacterType*&, CSSParserString&, bool&); 10351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 10451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename SrcCharacterType, typename DestCharacterType> 10551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline bool parseStringInternal(SrcCharacterType*&, DestCharacterType*&, UChar); 10651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 10751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 10851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void parseString(CharacterType*&, CSSParserString& resultString, UChar); 10951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 11051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 11151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline bool findURI(CharacterType*& start, CharacterType*& end, UChar& quote); 11251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 11351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename SrcCharacterType, typename DestCharacterType> 11451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline bool parseURIInternal(SrcCharacterType*&, DestCharacterType*&, UChar quote); 11551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 11651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 11751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void parseURI(CSSParserString&); 11851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 11951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline bool parseUnicodeRange(); 12051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 12151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool parseNthChild(); 12251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 12351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool parseNthChildExtra(); 12451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 12551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline bool detectFunctionTypeToken(int); 12651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 12751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void detectMediaQueryToken(int); 12851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 12951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void detectNumberToken(CharacterType*, int); 13051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 13151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void detectDashToken(int); 13251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 13351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void detectAtToken(int, bool); 13451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 13551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void detectSupportsToken(int); 13651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename CharacterType> 13751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) inline void detectCSSVariableDefinitionToken(int); 13851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 13951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) template <typename SourceCharacterType> 14051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) int realLex(void* yylval); 14151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 14251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) CSSParser& m_parser; 14351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 14451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) size_t m_parsedTextPrefixLength; 14551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) size_t m_parsedTextSuffixLength; 14651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 14751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) enum ParsingMode { 14851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) NormalMode, 14951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) MediaQueryMode, 15051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) SupportsMode, 15151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) NthChildMode 15251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) }; 15351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 15451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ParsingMode m_parsingMode; 15551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool m_is8BitSource; 15651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) OwnPtr<LChar[]> m_dataStart8; 15751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) OwnPtr<UChar[]> m_dataStart16; 15851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) LChar* m_currentCharacter8; 15951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) UChar* m_currentCharacter16; 16051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) union { 16151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) LChar* ptr8; 16251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) UChar* ptr16; 16351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } m_tokenStart; 16451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) unsigned m_length; 16551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) int m_token; 16651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) int m_lineNumber; 16751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) int m_tokenStartLineNumber; 16851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 16951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // FIXME: This boolean is misnamed. Also it would be nice if we could consolidate it 17051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // with the CSSParserMode logic to determine if internal properties are allowed. 17151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool m_internal; 17251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 17351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) int (CSSTokenizer::*m_lexFunc)(void*); 17451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}; 17551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 17651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline unsigned CSSTokenizer::tokenStartOffset() 17751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 17851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (is8BitSource()) 17951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_tokenStart.ptr8 - m_dataStart8.get(); 18051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_tokenStart.ptr16 - m_dataStart16.get(); 18151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 18251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 18351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)template <> 18451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline LChar* CSSTokenizer::tokenStart<LChar>() 18551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 18651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_tokenStart.ptr8; 18751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 18851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 18951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)template <> 19051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline UChar* CSSTokenizer::tokenStart<UChar>() 19151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 19251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_tokenStart.ptr16; 19351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 19451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 19551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace WebCore 19651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 19751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#endif // CSSTokenizer_h 198