/* * Copyright (C) 2008 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef Escapes_h #define Escapes_h #include #if ENABLE(WREC) #include namespace JSC { namespace WREC { class CharacterClass; class Escape { public: enum Type { PatternCharacter, CharacterClass, Backreference, WordBoundaryAssertion, Error, }; Escape(Type type) : m_type(type) { } Type type() const { return m_type; } private: Type m_type; protected: // Used by subclasses to store data. union { int i; const WREC::CharacterClass* c; } m_u; bool m_invert; }; class PatternCharacterEscape : public Escape { public: static const PatternCharacterEscape& cast(const Escape& escape) { ASSERT(escape.type() == PatternCharacter); return static_cast(escape); } PatternCharacterEscape(int character) : Escape(PatternCharacter) { m_u.i = character; } operator Escape() const { return *this; } int character() const { return m_u.i; } }; class CharacterClassEscape : public Escape { public: static const CharacterClassEscape& cast(const Escape& escape) { ASSERT(escape.type() == CharacterClass); return static_cast(escape); } CharacterClassEscape(const WREC::CharacterClass& characterClass, bool invert) : Escape(CharacterClass) { m_u.c = &characterClass; m_invert = invert; } operator Escape() { return *this; } const WREC::CharacterClass& characterClass() const { return *m_u.c; } bool invert() const { return m_invert; } }; class BackreferenceEscape : public Escape { public: static const BackreferenceEscape& cast(const Escape& escape) { ASSERT(escape.type() == Backreference); return static_cast(escape); } BackreferenceEscape(int subpatternId) : Escape(Backreference) { m_u.i = subpatternId; } operator Escape() const { return *this; } int subpatternId() const { return m_u.i; } }; class WordBoundaryAssertionEscape : public Escape { public: static const WordBoundaryAssertionEscape& cast(const Escape& escape) { ASSERT(escape.type() == WordBoundaryAssertion); return static_cast(escape); } WordBoundaryAssertionEscape(bool invert) : Escape(WordBoundaryAssertion) { m_invert = invert; } operator Escape() const { return *this; } bool invert() const { return m_invert; } }; } } // namespace JSC::WREC #endif // ENABLE(WREC) #endif // Escapes_h