summaryrefslogtreecommitdiff
path: root/CyteKit/PerlCompatibleRegEx.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'CyteKit/PerlCompatibleRegEx.hpp')
-rw-r--r--CyteKit/PerlCompatibleRegEx.hpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/CyteKit/PerlCompatibleRegEx.hpp b/CyteKit/PerlCompatibleRegEx.hpp
new file mode 100644
index 0000000..3bd5e76
--- /dev/null
+++ b/CyteKit/PerlCompatibleRegEx.hpp
@@ -0,0 +1,117 @@
+/* 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 <pcre.h>
+
+#include "CyteKit/NSString-Cyte.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<va_list>(values)] autorelease];
+ }
+};
+
+#endif//Cydia_PerlCompatibleRegEx_HPP