From b4fd1197563aca30cf01bf3efaa5c015ba768e11 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Fri, 26 Jun 2015 23:01:28 -0700 Subject: [PATCH] Use libicucore's uregex to avoid Depends: libpcre. --- Cydia/MIMEAddress.mm | 4 +- CyteKit/PerlCompatibleRegEx.hpp | 115 ----------------------------- CyteKit/RegEx.hpp | 127 ++++++++++++++++++++++++++++++++ CyteKit/WebViewController.mm | 6 +- MobileCydia.mm | 44 +++++------ cydia.control | 2 +- makefile | 3 +- sysroot.sh | 1 - 8 files changed, 156 insertions(+), 146 deletions(-) delete mode 100644 CyteKit/PerlCompatibleRegEx.hpp create mode 100644 CyteKit/RegEx.hpp diff --git a/Cydia/MIMEAddress.mm b/Cydia/MIMEAddress.mm index 2a80ae77..aea37ca1 100644 --- a/Cydia/MIMEAddress.mm +++ b/Cydia/MIMEAddress.mm @@ -23,7 +23,7 @@ #include -#include "CyteKit/PerlCompatibleRegEx.hpp" +#include "CyteKit/RegEx.hpp" @implementation MIMEAddress @@ -63,7 +63,7 @@ const char *data = [string UTF8String]; size_t size = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - static Pcre address_r("^\"?(.*)\"? <([^>]*)>$"); + static RegEx address_r("\"?(.*)\"? <([^>]*)>"); if (address_r(data, size)) { name_ = address_r[1]; diff --git a/CyteKit/PerlCompatibleRegEx.hpp b/CyteKit/PerlCompatibleRegEx.hpp deleted file mode 100644 index 52136f6b..00000000 --- a/CyteKit/PerlCompatibleRegEx.hpp +++ /dev/null @@ -1,115 +0,0 @@ -/* Cydia - iPhone UIKit Front-End for Debian APT - * Copyright (C) 2008-2014 Jay Freeman (saurik) -*/ - -/* GNU General Public License, Version 3 {{{ */ -/* - * Cydia is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * Cydia 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Cydia. If not, see . -**/ -/* }}} */ - -#ifndef Cydia_PerlCompatibleRegEx_HPP -#define Cydia_PerlCompatibleRegEx_HPP - -#include - -#include "CyteKit/UCPlatform.h" -#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), - data_(NULL) - { - } - - Pcre(const char *regex, NSString *data = nil) : - code_(NULL), - study_(NULL), - data_(NULL) - { - this->operator =(regex); - - if (data != nil) - this->operator ()(data); - } - - 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_); - _assert(capture_ >= 0); - 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) { - if (pcre_exec(code_, study_, data, size, 0, 0, matches_, (capture_ + 1) * 3) >= 0) { - data_ = data; - return true; - } else { - data_ = NULL; - return false; - } - } - - operator bool() const { - return data_ != NULL; - } - - 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 diff --git a/CyteKit/RegEx.hpp b/CyteKit/RegEx.hpp new file mode 100644 index 00000000..5799946a --- /dev/null +++ b/CyteKit/RegEx.hpp @@ -0,0 +1,127 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2014 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see . +**/ +/* }}} */ + +#ifndef Cydia_RegEx_HPP +#define Cydia_RegEx_HPP + +#include + +#include "CyteKit/UCPlatform.h" +#include "CyteKit/stringWithUTF8Bytes.h" + +#define _rgxcall(code, args...) ({ \ + UErrorCode status(U_ZERO_ERROR); \ + auto _value(code(args, &status)); \ + if (U_FAILURE(status)) { \ + fprintf(stderr, "%d:%s\n", error.offset, u_errorName(status)); \ + _assert(false); \ + } \ +_value; }) + +#define _rgxcallv(code, args...) ({ \ + UErrorCode status(U_ZERO_ERROR); \ + code(args, &status); \ + if (U_FAILURE(status)) { \ + fprintf(stderr, "%d:%s\n", error.offset, u_errorName(status)); \ + _assert(false); \ + } \ +}) + +class RegEx { + private: + URegularExpression *regex_; + int capture_; + size_t size_; + + public: + RegEx() : + regex_(NULL), + size_(_not(size_t)) + { + } + + RegEx(const char *regex, NSString *data = nil) : + regex_(NULL), + size_(_not(size_t)) + { + this->operator =(regex); + + if (data != nil) + this->operator ()(data); + } + + void operator =(const char *regex) { + _assert(regex_ == NULL); + UParseError error; + regex_ = _rgxcall(uregex_openC, regex, 0, &error); + capture_ = _rgxcall(uregex_groupCount, regex_); + } + + ~RegEx() { + uregex_close(regex_); + } + + NSString *operator [](size_t match) const { + UParseError error; + size_t size(size_); + UChar data[size]; + size = _rgxcall(uregex_group, regex_, match, data, size); + return [[[NSString alloc] initWithBytes:data length:(size * sizeof(UChar)) encoding:NSUTF16LittleEndianStringEncoding] autorelease]; + } + + _finline bool operator ()(NSString *string) { + return operator ()(reinterpret_cast([string cStringUsingEncoding:NSUTF16LittleEndianStringEncoding]), [string length]); + } + + _finline bool operator ()(const char *data) { + return operator ()([NSString stringWithUTF8String:data]); + } + + bool operator ()(const UChar *data, size_t size) { + UParseError error; + _rgxcallv(uregex_setText, regex_, data, size); + + if (_rgxcall(uregex_matches, regex_, -1)) { + size_ = size; + return true; + } else { + size_ = _not(size_t); + return false; + } + } + + bool operator ()(const char *data, size_t size) { + return operator ()([[[NSString alloc] initWithBytes:data length:size encoding:NSUTF8StringEncoding] autorelease]); + } + + operator bool() const { + return size_ != _not(size_t); + } + + 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_RegEx_HPP diff --git a/CyteKit/WebViewController.mm b/CyteKit/WebViewController.mm index a7ff586f..daa0a571 100644 --- a/CyteKit/WebViewController.mm +++ b/CyteKit/WebViewController.mm @@ -8,7 +8,7 @@ #include "CyteKit/IndirectDelegate.h" #include "CyteKit/Localize.h" #include "CyteKit/WebViewController.h" -#include "CyteKit/PerlCompatibleRegEx.hpp" +#include "CyteKit/RegEx.hpp" #include "CyteKit/WebThreadLocked.hpp" //#include @@ -443,10 +443,10 @@ float CYScrollViewDecelerationRateNormal; // CyteWebViewDelegate {{{ - (void) webView:(WebView *)view addMessageToConsole:(NSDictionary *)message { #if LogMessages - static Pcre irritating("^(?" + static RegEx irritating("(?" ":" "The page at .* displayed insecure content from .*\\." "|" "Unsafe JavaScript attempt to access frame with URL .* from frame with URL .*\\. Domains, protocols and ports must match\\." - ")\\n$"); + ")\\n"); if (NSString *data = [message objectForKey:@"message"]) if (irritating(data)) diff --git a/MobileCydia.mm b/MobileCydia.mm index b95389ac..0625b35c 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -113,7 +113,7 @@ extern "C" { #include "Menes/Menes.h" #include "CyteKit/IndirectDelegate.h" -#include "CyteKit/PerlCompatibleRegEx.hpp" +#include "CyteKit/RegEx.hpp" #include "CyteKit/TableViewCell.h" #include "CyteKit/TabBarController.h" #include "CyteKit/WebScriptObject-Cyte.h" @@ -870,7 +870,7 @@ static _finline const char *StripVersion_(const char *version) { } NSString *LocalizeSection(NSString *section) { - static Pcre title_r("^(.*?) \\((.*)\\)$"); + static RegEx title_r("(.*?) \\((.*)\\)"); if (title_r(section)) { NSString *parent(title_r[1]); NSString *child(title_r[2]); @@ -888,15 +888,15 @@ NSString *Simplify(NSString *title) { const char *data = [title UTF8String]; size_t size = [title lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - static Pcre square_r("^\\[(.*)\\]$"); + static RegEx square_r("\\[(.*)\\]"); if (square_r(data, size)) return Simplify(square_r[1]); - static Pcre paren_r("^\\((.*)\\)$"); + static RegEx paren_r("\\((.*)\\)"); if (paren_r(data, size)) return Simplify(paren_r[1]); - static Pcre title_r("^(.*?) \\((.*)\\)$"); + static RegEx title_r("(.*?) \\((.*)\\)"); if (title_r(data, size)) return Simplify(title_r[1]); @@ -3200,7 +3200,7 @@ struct PackageNameOrdering : NSMutableArray *applications([NSMutableArray arrayWithCapacity:2]); - static Pcre application_r("^/Applications/(.*)\\.app/Info.plist$"); + static RegEx application_r("/Applications/(.*)\\.app/Info.plist"); if (NSArray *files = [self files]) for (NSString *file in files) if (application_r(file)) { @@ -3530,7 +3530,7 @@ class CydiaLogCleaner : std::istream is(&ib); std::string line; - static Pcre finish_r("^finish:([^:]*)$"); + static RegEx finish_r("finish:([^:]*)"); while (std::getline(is, line)) { NSAutoreleasePool *pool([[NSAutoreleasePool alloc] init]); @@ -3557,8 +3557,8 @@ class CydiaLogCleaner : std::istream is(&ib); std::string line; - static Pcre conffile_r("^status: [^ ]* : conffile-prompt : (.*?) *$"); - static Pcre pmstatus_r("^([^:]*):([^:]*):([^:]*):(.*)$"); + static RegEx conffile_r("status: [^ ]* : conffile-prompt : (.*?) *"); + static RegEx pmstatus_r("([^:]*):([^:]*):([^:]*):(.*)"); while (std::getline(is, line)) { NSAutoreleasePool *pool([[NSAutoreleasePool alloc] init]); @@ -3760,7 +3760,7 @@ class CydiaLogCleaner : lprintf("%c:[%s]\n", warning ? 'W' : 'E', error.c_str()); - static Pcre no_pubkey("^GPG error:.* NO_PUBKEY .*$"); + static RegEx no_pubkey("GPG error:.* NO_PUBKEY .*"); if (warning && no_pubkey(error.c_str())) continue; @@ -4223,7 +4223,7 @@ class CydiaLogCleaner : static _H Diversions_; @interface Diversion : NSObject { - Pcre pattern_; + RegEx pattern_; _H key_; _H format_; } @@ -5257,7 +5257,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { pkgDepCache::StateCache &state(cache[iterator]); - static Pcre special_r("^(firmware$|gsc\\.|cy\\+)"); + static RegEx special_r("(firmware|gsc\\..*|cy\\+.*)"); if (state.NewInstall()) [installs addObject:name]; @@ -8625,7 +8625,7 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi case 1: { NSString *href = [[alert textField] text]; - static Pcre href_r("^(http(s?)://|file:///)[^# ]*$"); + static RegEx href_r("(http(s?)://|file:///)[^# ]*"); if (!href_r(href)) { UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:Colon_, Error_, UCLocalize("INVALID_URL")] @@ -9780,7 +9780,7 @@ _end } - (void) setConfigurationData:(NSString *)data { - static Pcre conffile_r("^'(.*)' '(.*)' ([01]) ([01])$"); + static RegEx conffile_r("'(.*)' '(.*)' ([01]) ([01])"); if (!conffile_r(data)) { lprintf("E:invalid conffile\n"); @@ -10192,7 +10192,7 @@ int main(int argc, char *argv[]) { Idiom_ = IsWildcat_ ? @"ipad" : @"iphone"; - Pcre pattern("^([0-9]+\\.[0-9]+)"); + RegEx pattern("([0-9]+\\.[0-9]+).*"); if (pattern([device systemVersion])) Firmware_ = pattern[1]; @@ -10257,7 +10257,7 @@ int main(int argc, char *argv[]) { lang = NULL; if (lang != NULL) { - Pcre pattern("^([a-z][a-z])(?:-[A-Za-z]*)?(_[A-Z][A-Z])?$"); + RegEx pattern("([a-z][a-z])(?:-[A-Za-z]*)?(_[A-Z][A-Z])?"); lang = !pattern(lang) ? NULL : [pattern->*@"%1$@%2$@" UTF8String]; } @@ -10407,12 +10407,12 @@ int main(int argc, char *argv[]) { NSString *agent([NSString stringWithFormat:@"Cydia/%@ CyF/%.2f", Cydia_, kCFCoreFoundationVersionNumber]); - if (Pcre match = Pcre("^[0-9]+(\\.[0-9]+)+", Safari_)) - agent = [NSString stringWithFormat:@"Safari/%@ %@", match[0], agent]; - if (Pcre match = Pcre("^[0-9]+[A-Z][0-9]+[a-z]?", System_)) - agent = [NSString stringWithFormat:@"Mobile/%@ %@", match[0], agent]; - if (Pcre match = Pcre("^[0-9]+(\\.[0-9]+)+", Product_)) - agent = [NSString stringWithFormat:@"Version/%@ %@", match[0], agent]; + if (RegEx match = RegEx("([0-9]+(\\.[0-9]+)+).*", Safari_)) + agent = [NSString stringWithFormat:@"Safari/%@ %@", match[1], agent]; + if (RegEx match = RegEx("([0-9]+[A-Z][0-9]+[a-z]?).*", System_)) + agent = [NSString stringWithFormat:@"Mobile/%@ %@", match[1], agent]; + if (RegEx match = RegEx("([0-9]+(\\.[0-9]+)+).*", Product_)) + agent = [NSString stringWithFormat:@"Version/%@ %@", match[1], agent]; UserAgent_ = agent; /* }}} */ diff --git a/cydia.control b/cydia.control index 3688a8f1..ba88add9 100644 --- a/cydia.control +++ b/cydia.control @@ -5,7 +5,7 @@ Maintainer: Jay Freeman (saurik) Architecture: iphoneos-arm Version: Replaces: bigboss, bigbossbetarepo, com.sosiphone.addcydia, cydia-sources, ispazio.net, modmyifone, saurik, ste, yellowsn0w.com, zodttd -Depends: apr-lib, apt7-lib, apt7-key, cydia-lproj (>= 1.1.10), darwintools, debianutils, org.thebigboss.repo.icons, pcre, sed, shell-cmds, system-cmds, uikittools (>= 1.1.4) +Depends: apr-lib, apt7-lib, apt7-key, cydia-lproj (>= 1.1.10), darwintools, debianutils, org.thebigboss.repo.icons, sed, shell-cmds, system-cmds, uikittools (>= 1.1.4) Conflicts: bigboss, bigbossbetarepo, com.sosiphone.addcydia, cydia-sources, ispazio.net, modmyifone, ste, yellowsn0w.com, zodttd Pre-Depends: debianutils Provides: bigbossbetarepo, cydia-sources diff --git a/makefile b/makefile index c76e489e..4ca2d6ff 100644 --- a/makefile +++ b/makefile @@ -45,7 +45,6 @@ libs += -framework WebKit libs += -lapr-1 libs += -lapt-pkg libs += -licucore -libs += -lpcre uikit := uikit += -framework UIKit @@ -135,7 +134,7 @@ setnsfpn: setnsfpn.cpp @ldid -T0 -S $@ postinst: postinst.mm Sources.mm Sources.h CyteKit/stringWithUTF8Bytes.mm CyteKit/stringWithUTF8Bytes.h CyteKit/UCPlatform.h - $(cycc) -std=c++11 $(filter %.mm,$^) $(flags) $(link) -framework CoreFoundation -framework Foundation -framework UIKit -lpcre + $(cycc) -std=c++11 $(filter %.mm,$^) $(flags) $(link) -framework CoreFoundation -framework Foundation -framework UIKit @ldid -T0 -S $@ debs/cydia_$(version)_iphoneos-arm.deb: MobileCydia preinst postinst cfversion setnsfpn $(images) $(shell find MobileCydia.app) cydia.control Library/firmware.sh Library/move.sh Library/startup diff --git a/sysroot.sh b/sysroot.sh index 55b65cab..ec3ee2ce 100755 --- a/sysroot.sh +++ b/sysroot.sh @@ -67,7 +67,6 @@ urls[apr-lib]=http://apt.saurik.com/debs/apr-lib_1.3.3-2_iphoneos-arm.deb urls[apt7]=http://apt.saurik.com/debs/apt7_0.7.25.3-7_iphoneos-arm.deb urls[apt7-lib]=http://apt.saurik.com/debs/apt7-lib_0.7.25.3-12_iphoneos-arm.deb urls[coreutils]=http://apt.saurik.com/debs/coreutils_7.4-11_iphoneos-arm.deb -urls[pcre]=http://apt.saurik.com/debs/pcre_7.9-3_iphoneos-arm.deb if [[ 0 ]]; then wget -qO- "${repository}dists/${distribution}/${component}/binary-${architecture}/Packages.bz2" | bzcat | { -- 2.45.2