|  | /* | 
|  | *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org) | 
|  | *  Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. | 
|  | *  Copyright (C) 2009 Torch Mobile, Inc. | 
|  | * | 
|  | *  This library is free software; you can redistribute it and/or | 
|  | *  modify it under the terms of the GNU Lesser General Public | 
|  | *  License as published by the Free Software Foundation; either | 
|  | *  version 2 of the License, or (at your option) any later version. | 
|  | * | 
|  | *  This library is distributed in the hope that it will be useful, | 
|  | *  but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | *  Lesser General Public License for more details. | 
|  | * | 
|  | *  You should have received a copy of the GNU Lesser General Public | 
|  | *  License along with this library; if not, write to the Free Software | 
|  | *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA | 
|  | * | 
|  | */ | 
|  |  | 
|  | #ifndef RegExp_h | 
|  | #define RegExp_h | 
|  |  | 
|  | #include "UString.h" | 
|  | #include "ExecutableAllocator.h" | 
|  | #include <wtf/Forward.h> | 
|  | #include <wtf/RefCounted.h> | 
|  | #include "yarr/RegexJIT.h" | 
|  | #include "yarr/RegexInterpreter.h" | 
|  |  | 
|  | struct JSRegExp; | 
|  |  | 
|  | namespace JSC { | 
|  |  | 
|  | class JSGlobalData; | 
|  |  | 
|  | class RegExp : public RefCounted<RegExp> { | 
|  | public: | 
|  | static PassRefPtr<RegExp> create(JSGlobalData* globalData, const UString& pattern); | 
|  | static PassRefPtr<RegExp> create(JSGlobalData* globalData, const UString& pattern, const UString& flags); | 
|  | #if !ENABLE(YARR) | 
|  | ~RegExp(); | 
|  | #endif | 
|  |  | 
|  | bool global() const { return m_flagBits & Global; } | 
|  | bool ignoreCase() const { return m_flagBits & IgnoreCase; } | 
|  | bool multiline() const { return m_flagBits & Multiline; } | 
|  |  | 
|  | const UString& pattern() const { return m_pattern; } | 
|  |  | 
|  | bool isValid() const { return !m_constructionError; } | 
|  | const char* errorMessage() const { return m_constructionError; } | 
|  |  | 
|  | int match(const UString&, int startOffset, Vector<int, 32>* ovector = 0); | 
|  | unsigned numSubpatterns() const { return m_numSubpatterns; } | 
|  |  | 
|  | private: | 
|  | RegExp(JSGlobalData* globalData, const UString& pattern); | 
|  | RegExp(JSGlobalData* globalData, const UString& pattern, const UString& flags); | 
|  |  | 
|  | void compile(JSGlobalData*); | 
|  |  | 
|  | enum FlagBits { Global = 1, IgnoreCase = 2, Multiline = 4 }; | 
|  |  | 
|  | UString m_pattern; // FIXME: Just decompile m_regExp instead of storing this. | 
|  | int m_flagBits; | 
|  | const char* m_constructionError; | 
|  | unsigned m_numSubpatterns; | 
|  |  | 
|  | #if ENABLE(YARR_JIT) | 
|  | Yarr::RegexCodeBlock m_regExpJITCode; | 
|  | #elif ENABLE(YARR) | 
|  | OwnPtr<Yarr::BytecodePattern> m_regExpBytecode; | 
|  | #else | 
|  | JSRegExp* m_regExp; | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | } // namespace JSC | 
|  |  | 
|  | #endif // RegExp_h |