/* Cydia - iPhone UIKit Front-End for Debian APT * Copyright (C) 2008-2011 Jay Freeman (saurik) */ /* Modified BSD License {{{ */ /* * 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. * 3. The name of the author may not be used to endorse * or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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 Cydia_PerlCompatibleRegEx_HPP #define Cydia_PerlCompatibleRegEx_HPP #include #include "CyteKit/stringWithUTF8Bytes.h" class Pcre { private: pcre *code_; pcre_extra *study_; int capture_; int *matches_; const char *data_; public: Pcre() : code_(NULL), study_(NULL) { } Pcre(const char *regex) : code_(NULL), study_(NULL) { this->operator =(regex); } void operator =(const char *regex) { _assert(code_ == NULL); const char *error; int offset; code_ = pcre_compile(regex, 0, &error, &offset, NULL); if (code_ == NULL) { fprintf(stderr, "%d:%s\n", offset, error); _assert(false); } pcre_fullinfo(code_, study_, PCRE_INFO_CAPTURECOUNT, &capture_); matches_ = new int[(capture_ + 1) * 3]; } ~Pcre() { pcre_free(code_); delete matches_; } NSString *operator [](size_t match) const { return [NSString stringWithUTF8Bytes:(data_ + matches_[match * 2]) length:(matches_[match * 2 + 1] - matches_[match * 2])]; } _finline bool operator ()(NSString *data) { // XXX: length is for characters, not for bytes return operator ()([data UTF8String], [data length]); } _finline bool operator ()(const char *data) { return operator ()(data, strlen(data)); } bool operator ()(const char *data, size_t size) { data_ = data; return pcre_exec(code_, study_, data, size, 0, 0, matches_, (capture_ + 1) * 3) >= 0; } NSString *operator ->*(NSString *format) const { id values[capture_]; for (int i(0); i != capture_; ++i) values[i] = this->operator [](i + 1); return [[[NSString alloc] initWithFormat:format arguments:reinterpret_cast(values)] autorelease]; } }; #endif//Cydia_PerlCompatibleRegEx_HPP