summaryrefslogtreecommitdiff
path: root/data/_apt7/vindication.diff
diff options
context:
space:
mode:
authorJay Freeman <saurik@saurik.com>2010-02-24 09:18:51 +0000
committerJay Freeman <saurik@saurik.com>2010-02-24 09:18:51 +0000
commitbdd8443ab5d3268058b29e8eff96466854461fe2 (patch)
treef23d09a1e67f9eb3e87429ede58f015e3d32ee30 /data/_apt7/vindication.diff
parent22455069ed7b4f5195d8b691d15fb50acffcbb81 (diff)
I hate std::string: the concept is great, the implementation is shit.
git-svn-id: http://svn.telesphoreo.org/trunk@703 514c082c-b64e-11dc-b46d-3d985efe055d
Diffstat (limited to 'data/_apt7/vindication.diff')
-rw-r--r--data/_apt7/vindication.diff716
1 files changed, 716 insertions, 0 deletions
diff --git a/data/_apt7/vindication.diff b/data/_apt7/vindication.diff
new file mode 100644
index 000000000..c07591be7
--- /dev/null
+++ b/data/_apt7/vindication.diff
@@ -0,0 +1,716 @@
+diff -Nru apt-0.7.25.3/apt-pkg/contrib/md5.cc apt-0.7.25.3+iPhone/apt-pkg/contrib/md5.cc
+--- apt-0.7.25.3/apt-pkg/contrib/md5.cc 2010-02-01 19:44:40.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/contrib/md5.cc 2010-02-24 08:11:38.000000000 +0000
+@@ -173,6 +173,12 @@
+ memset(Sum,0,sizeof(Sum));
+ Set(Str);
+ }
++
++MD5SumValue::MD5SumValue(const srkString &Str)
++{
++ memset(Sum, 0, sizeof(Sum));
++ Set(Str);
++}
+ /*}}}*/
+ // MD5SumValue::MD5SumValue - Default constructor /*{{{*/
+ // ---------------------------------------------------------------------
+@@ -189,6 +195,11 @@
+ {
+ return Hex2Num(Str,Sum,sizeof(Sum));
+ }
++
++bool MD5SumValue::Set(const srkString &Str)
++{
++ return Hex2Num(Str,Sum,sizeof(Sum));
++}
+ /*}}}*/
+ // MD5SumValue::Value - Convert the number into a string /*{{{*/
+ // ---------------------------------------------------------------------
+diff -Nru apt-0.7.25.3/apt-pkg/contrib/md5.h apt-0.7.25.3+iPhone/apt-pkg/contrib/md5.h
+--- apt-0.7.25.3/apt-pkg/contrib/md5.h 2010-02-01 19:44:40.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/contrib/md5.h 2010-02-24 08:09:10.000000000 +0000
+@@ -29,6 +29,8 @@
+ #include <algorithm>
+ #include <stdint.h>
+
++#include <apt-pkg/srkstring.h>
++
+ using std::string;
+ using std::min;
+
+@@ -48,10 +50,12 @@
+ {for (int I = 0; I != sizeof(Sum); I++) S[I] = Sum[I];};
+ inline operator string() const {return Value();};
+ bool Set(string Str);
++ bool Set(const srkString &Str);
+ inline void Set(unsigned char S[16])
+ {for (int I = 0; I != sizeof(Sum); I++) Sum[I] = S[I];};
+
+ MD5SumValue(string Str);
++ MD5SumValue(const srkString &Str);
+ MD5SumValue();
+ };
+
+diff -Nru apt-0.7.25.3/apt-pkg/contrib/strutl.cc apt-0.7.25.3+iPhone/apt-pkg/contrib/strutl.cc
+--- apt-0.7.25.3/apt-pkg/contrib/strutl.cc 2010-02-01 19:44:40.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/contrib/strutl.cc 2010-02-24 08:13:39.000000000 +0000
+@@ -943,12 +943,17 @@
+ /* The length of the buffer must be exactly 1/2 the length of the string. */
+ bool Hex2Num(const string &Str,unsigned char *Num,unsigned int Length)
+ {
++ return Hex2Num(srkString(Str), Num, Length);
++}
++
++bool Hex2Num(const srkString &Str,unsigned char *Num,unsigned int Length)
++{
+ if (Str.length() != Length*2)
+ return false;
+
+ // Convert each digit. We store it in the same order as the string
+ int J = 0;
+- for (string::const_iterator I = Str.begin(); I != Str.end();J++, I += 2)
++ for (srkString::const_iterator I = Str.begin(); I != Str.end();J++, I += 2)
+ {
+ if (isxdigit(*I) == 0 || isxdigit(I[1]) == 0)
+ return false;
+diff -Nru apt-0.7.25.3/apt-pkg/contrib/strutl.h apt-0.7.25.3+iPhone/apt-pkg/contrib/strutl.h
+--- apt-0.7.25.3/apt-pkg/contrib/strutl.h 2010-02-01 19:44:40.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/contrib/strutl.h 2010-02-24 08:10:45.000000000 +0000
+@@ -25,6 +25,8 @@
+ #include <iostream>
+ #include <time.h>
+
++#include <apt-pkg/srkstring.h>
++
+ using std::string;
+ using std::vector;
+ using std::ostream;
+@@ -57,6 +59,7 @@
+ bool ReadMessages(int Fd, vector<string> &List);
+ bool StrToNum(const char *Str,unsigned long &Res,unsigned Len,unsigned Base = 0);
+ bool Hex2Num(const string &Str,unsigned char *Num,unsigned int Length);
++bool Hex2Num(const srkString &Str,unsigned char *Num,unsigned int Length);
+ bool TokSplitString(char Tok,char *Input,char **List,
+ unsigned long ListMax);
+ void ioprintf(ostream &out,const char *format,...) APT_FORMAT2;
+@@ -66,6 +69,7 @@
+ int tolower_ascii(int c);
+
+ #define APT_MKSTRCMP(name,func) \
++inline int name(const srkString &A,const char *B) {return func(A.Start,A.Start+A.Size,B,B+strlen(B));}; \
+ inline int name(const char *A,const char *B) {return func(A,A+strlen(A),B,B+strlen(B));}; \
+ inline int name(const char *A,const char *AEnd,const char *B) {return func(A,AEnd,B,B+strlen(B));}; \
+ inline int name(const string& A,const char *B) {return func(A.c_str(),A.c_str()+A.length(),B,B+strlen(B));}; \
+diff -Nru apt-0.7.25.3/apt-pkg/deb/deblistparser.cc apt-0.7.25.3+iPhone/apt-pkg/deb/deblistparser.cc
+--- apt-0.7.25.3/apt-pkg/deb/deblistparser.cc 2010-02-24 08:53:52.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/deb/deblistparser.cc 2010-02-24 08:51:50.000000000 +0000
+@@ -106,7 +106,7 @@
+ const char *Stop;
+ if (Section.Find("Priority",Start,Stop) == true)
+ {
+- if (GrabWord(string(Start,Stop-Start),PrioList,Ver->Priority) == false)
++ if (GrabWord(srkString(Start,Stop-Start),PrioList,Ver->Priority) == false)
+ Ver->Priority = pkgCache::State::Extra;
+ }
+
+@@ -144,10 +144,19 @@
+ only describe package properties */
+ string debListParser::Description()
+ {
+- if (DescriptionLanguage().empty())
+- return Section.FindS("Description");
+- else
+- return Section.FindS(("Description-" + pkgIndexFile::LanguageCode()).c_str());
++ srkString description;
++ Description(description);
++ return description;
++}
++
++void debListParser::Description(srkString &Str) {
++ const char *Start, *Stop;
++ if (!Section.Find("Description", Start, Stop))
++ if (!Section.Find(("Description-" + pkgIndexFile::LanguageCode()).c_str(), Start, Stop)) {
++ Start = NULL;
++ Stop = NULL;
++ }
++ Str.assign(Start, Stop);
+ }
+ /*}}}*/
+ // ListParser::DescriptionLanguage - Return the description lang string /*{{{*/
+@@ -157,7 +166,8 @@
+ assumed to describe original description. */
+ string debListParser::DescriptionLanguage()
+ {
+- return Section.FindS("Description").empty() ? pkgIndexFile::LanguageCode() : "";
++ const char *Start, *Stop;
++ return Section.Find("Description", Start, Stop) ? std::string() : pkgIndexFile::LanguageCode();
+ }
+ /*}}}*/
+ // ListParser::Description - Return the description_md5 MD5SumValue /*{{{*/
+@@ -168,15 +178,18 @@
+ */
+ MD5SumValue debListParser::Description_md5()
+ {
+- string value = Section.FindS("Description-md5");
+-
+- if (value.empty())
++ const char *Start;
++ const char *Stop;
++ if (!Section.Find("Description-md5", Start, Stop))
+ {
+ MD5Summation md5;
+- md5.Add((Description() + "\n").c_str());
++ srkString description;
++ Description(description);
++ md5.Add((const unsigned char *) description.Start, description.Size);
++ md5.Add("\n");
+ return md5.Result();
+ } else
+- return MD5SumValue(value);
++ return MD5SumValue(srkString(Start, Stop));
+ }
+ /*}}}*/
+ // ListParser::UsePackage - Update a package structure /*{{{*/
+@@ -286,7 +299,7 @@
+ {"deinstall",pkgCache::State::DeInstall},
+ {"purge",pkgCache::State::Purge},
+ {}};
+- if (GrabWord(string(Start,I-Start),WantList,Pkg->SelectedState) == false)
++ if (GrabWord(srkString(Start,I-Start),WantList,Pkg->SelectedState) == false)
+ return _error->Error("Malformed 1st word in the Status line");
+
+ // Isloate the next word
+@@ -302,7 +315,7 @@
+ {"hold",pkgCache::State::HoldInst},
+ {"hold-reinstreq",pkgCache::State::HoldReInstReq},
+ {}};
+- if (GrabWord(string(Start,I-Start),FlagList,Pkg->InstState) == false)
++ if (GrabWord(srkString(Start,I-Start),FlagList,Pkg->InstState) == false)
+ return _error->Error("Malformed 2nd word in the Status line");
+
+ // Isloate the last word
+@@ -324,7 +337,7 @@
+ {"post-inst-failed",pkgCache::State::HalfConfigured},
+ {"removal-failed",pkgCache::State::HalfInstalled},
+ {}};
+- if (GrabWord(string(Start,I-Start),StatusList,Pkg->CurrentState) == false)
++ if (GrabWord(srkString(Start,I-Start),StatusList,Pkg->CurrentState) == false)
+ return _error->Error("Malformed 3rd word in the Status line");
+
+ /* A Status line marks the package as indicating the current
+@@ -410,6 +423,17 @@
+ string &Package,string &Ver,
+ unsigned int &Op, bool ParseArchFlags)
+ {
++ srkString cPackage, cVer;
++ const char *Value = ParseDepends(Start, Stop, cPackage, cVer, Op, ParseArchFlags);
++ Package = cPackage;
++ Ver = cVer;
++ return Value;
++}
++
++const char *debListParser::ParseDepends(const char *Start,const char *Stop,
++ srkString &Package,srkString &Ver,
++ unsigned int &Op, bool ParseArchFlags)
++{
+ // Strip off leading space
+ for (;Start != Stop && isspace(*Start) != 0; Start++);
+
+@@ -509,7 +533,7 @@
+ Found = !Found;
+
+ if (Found == false)
+- Package = ""; /* not for this arch */
++ Package.clear(); /* not for this arch */
+ }
+
+ // Skip whitespace
+@@ -541,8 +565,8 @@
+ if (Section.Find(Tag,Start,Stop) == false)
+ return true;
+
+- string Package;
+- string Version;
++ srkString Package;
++ srkString Version;
+ unsigned int Op;
+
+ while (1)
+@@ -569,8 +593,8 @@
+ if (Section.Find("Provides",Start,Stop) == false)
+ return true;
+
+- string Package;
+- string Version;
++ srkString Package;
++ srkString Version;
+ unsigned int Op;
+
+ while (1)
+@@ -579,7 +603,7 @@
+ if (Start == 0)
+ return _error->Error("Problem parsing Provides line");
+ if (Op != pkgCache::Dep::NoOp) {
+- _error->Warning("Ignoring Provides line with DepCompareOp for package %s", Package.c_str());
++ _error->Warning("Ignoring Provides line with DepCompareOp for package %s", std::string(Package).c_str());
+ } else {
+ if (NewProvides(Ver,Package,Version) == false)
+ return false;
+@@ -637,9 +661,14 @@
+ /* Looks for a word in a list of words - for ParseStatus */
+ bool debListParser::GrabWord(string Word,WordList *List,unsigned char &Out)
+ {
++ return GrabWord(srkString(Word), List, Out);
++}
++
++bool debListParser::GrabWord(const srkString &Word,WordList *List,unsigned char &Out)
++{
+ for (unsigned int C = 0; List[C].Str != 0; C++)
+ {
+- if (strcasecmp(Word.c_str(),List[C].Str) == 0)
++ if (strncasecmp(Word.Start,List[C].Str,Word.Size) == 0)
+ {
+ Out = List[C].Val;
+ return true;
+diff -Nru apt-0.7.25.3/apt-pkg/deb/deblistparser.h apt-0.7.25.3+iPhone/apt-pkg/deb/deblistparser.h
+--- apt-0.7.25.3/apt-pkg/deb/deblistparser.h 2010-02-24 08:53:52.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/deb/deblistparser.h 2010-02-24 08:43:20.000000000 +0000
+@@ -41,9 +41,22 @@
+ bool ParseProvides(pkgCache::VerIterator Ver);
+ bool ParseTag(pkgCache::PkgIterator Pkg);
+ static bool GrabWord(string Word,WordList *List,unsigned char &Out);
++ static bool GrabWord(const srkString &Word,WordList *List,unsigned char &Out);
+
+ public:
+
++ srkString Find(const char *Tag) {
++ srkString S;
++ const char *Stop;
++ if (Section.Find(Tag, S.Start, Stop))
++ S.Size = Stop - S.Start;
++ else {
++ S.Start = NULL;
++ S.Size = 0;
++ }
++ return S;
++ }
++
+ static unsigned char GetPrio(string Str);
+
+ // These all operate against the current section
+@@ -51,6 +64,7 @@
+ virtual string Version();
+ virtual bool NewVersion(pkgCache::VerIterator Ver);
+ virtual string Description();
++ void Description(srkString &Str);
+ virtual string DescriptionLanguage();
+ virtual MD5SumValue Description_md5();
+ virtual unsigned short VersionHash();
+@@ -67,6 +81,9 @@
+ static const char *ParseDepends(const char *Start,const char *Stop,
+ string &Package,string &Ver,unsigned int &Op,
+ bool ParseArchFlags = false);
++ static const char *ParseDepends(const char *Start,const char *Stop,
++ srkString &Package,srkString &Ver,unsigned int &Op,
++ bool ParseArchFlags = false);
+ static const char *ConvertRelation(const char *I,unsigned int &Op);
+
+ debListParser(FileFd *File);
+diff -Nru apt-0.7.25.3/apt-pkg/makefile apt-0.7.25.3+iPhone/apt-pkg/makefile
+--- apt-0.7.25.3/apt-pkg/makefile 2010-02-24 08:53:52.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/makefile 2010-02-24 07:57:37.000000000 +0000
+@@ -42,7 +42,7 @@
+ acquire.h acquire-worker.h acquire-item.h acquire-method.h \
+ clean.h srcrecords.h cachefile.h versionmatch.h policy.h \
+ pkgsystem.h indexfile.h metaindex.h indexrecords.h vendor.h \
+- vendorlist.h cdrom.h indexcopy.h aptconfiguration.h
++ vendorlist.h cdrom.h indexcopy.h aptconfiguration.h srkstring.h
+
+ # Source code for the debian specific components
+ # In theory the deb headers do not need to be exported..
+diff -Nru apt-0.7.25.3/apt-pkg/pkgcache.cc apt-0.7.25.3+iPhone/apt-pkg/pkgcache.cc
+--- apt-0.7.25.3/apt-pkg/pkgcache.cc 2010-02-24 08:53:52.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/pkgcache.cc 2010-02-24 08:51:28.000000000 +0000
+@@ -176,12 +176,25 @@
+ return Hash % _count(HeaderP->HashTable);
+ }
+
++unsigned long pkgCache::sHash(const srkString &Str) const
++{
++ unsigned long Hash = 0;
++ for (const char *I = Str.Start, *E = I + Str.Size; I != E; I++)
++ Hash = 5*Hash + tolower_ascii(*I);
++ return Hash % _count(HeaderP->HashTable);
++}
++
+ /*}}}*/
+ // Cache::FindPkg - Locate a package by name /*{{{*/
+ // ---------------------------------------------------------------------
+ /* Returns 0 on error, pointer to the package otherwise */
+ pkgCache::PkgIterator pkgCache::FindPkg(const string &Name)
+ {
++ return FindPkg(srkString(Name));
++}
++
++pkgCache::PkgIterator pkgCache::FindPkg(const srkString &Name)
++{
+ // Look at the hash bucket
+ Package *Pkg = PkgP + HeaderP->HashTable[Hash(Name)];
+ for (; Pkg != PkgP; Pkg = PkgP + Pkg->NextPackage)
+diff -Nru apt-0.7.25.3/apt-pkg/pkgcachegen.cc apt-0.7.25.3+iPhone/apt-pkg/pkgcachegen.cc
+--- apt-0.7.25.3/apt-pkg/pkgcachegen.cc 2010-02-24 08:53:52.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/pkgcachegen.cc 2010-02-24 08:50:06.000000000 +0000
+@@ -33,6 +33,8 @@
+ #include <unistd.h>
+ #include <errno.h>
+ #include <stdio.h>
++
++#include <apt-pkg/deblistparser.h>
+ /*}}}*/
+ typedef vector<pkgIndexFile *>::iterator FileIterator;
+
+@@ -103,26 +105,37 @@
+ pkgCache::VerIterator *OutVer)
+ {
+ List.Owner = this;
++ debListParser *debian(dynamic_cast<debListParser *>(&List));
+
+ unsigned int Counter = 0;
+ while (List.Step() == true)
+ {
+ // Get a pointer to the package structure
+- string PackageName = List.Package();
++ srkString PackageName;
++ if (debian != NULL)
++ PackageName = debian->Find("Package");
++ else
++ PackageName = List.Package();
+ if (PackageName.empty() == true)
+ return false;
+
+ pkgCache::PkgIterator Pkg;
+ if (NewPackage(Pkg,PackageName) == false)
+- return _error->Error(_("Error occurred while processing %s (NewPackage)"),PackageName.c_str());
++ return _error->Error(_("Error occurred while processing %s (NewPackage)"),std::string(PackageName).c_str());
+ Counter++;
+ if (Counter % 100 == 0 && Progress != 0)
+ Progress->Progress(List.Offset());
+
++ string language(List.DescriptionLanguage());
++
+ /* Get a pointer to the version structure. We know the list is sorted
+ so we use that fact in the search. Insertion of new versions is
+ done with correct sorting */
+- string Version = List.Version();
++ srkString Version;
++ if (debian != NULL)
++ Version = debian->Find("Version");
++ else
++ Version = List.Version();
+ if (Version.empty() == true)
+ {
+ // we first process the package, then the descriptions
+@@ -130,7 +143,7 @@
+ // of MMap space)
+ if (List.UsePackage(Pkg,pkgCache::VerIterator(Cache)) == false)
+ return _error->Error(_("Error occurred while processing %s (UsePackage1)"),
+- PackageName.c_str());
++ std::string(PackageName).c_str());
+
+ // Find the right version to write the description
+ MD5SumValue CurMd5 = List.Description_md5();
+@@ -147,7 +160,7 @@
+ // md5 && language
+ for ( ; Desc.end() == false; Desc++)
+ if (MD5SumValue(Desc.md5()) == CurMd5 &&
+- Desc.LanguageCode() == List.DescriptionLanguage())
++ Desc.LanguageCode() == language)
+ duplicate=true;
+ if(duplicate)
+ continue;
+@@ -159,11 +172,11 @@
+ if (MD5SumValue(Desc.md5()) == CurMd5)
+ {
+ // Add new description
+- *LastDesc = NewDescription(Desc, List.DescriptionLanguage(), CurMd5, *LastDesc);
++ *LastDesc = NewDescription(Desc, language, CurMd5, *LastDesc);
+ Desc->ParentPkg = Pkg.Index();
+
+ if ((*LastDesc == 0 && _error->PendingError()) || NewFileDesc(Desc,List) == false)
+- return _error->Error(_("Error occurred while processing %s (NewFileDesc1)"),PackageName.c_str());
++ return _error->Error(_("Error occurred while processing %s (NewFileDesc1)"),std::string(PackageName).c_str());
+ break;
+ }
+ }
+@@ -189,11 +202,11 @@
+ {
+ if (List.UsePackage(Pkg,Ver) == false)
+ return _error->Error(_("Error occurred while processing %s (UsePackage2)"),
+- PackageName.c_str());
++ std::string(PackageName).c_str());
+
+ if (NewFileVer(Ver,List) == false)
+ return _error->Error(_("Error occurred while processing %s (NewFileVer1)"),
+- PackageName.c_str());
++ std::string(PackageName).c_str());
+
+ // Read only a single record and return
+ if (OutVer != 0)
+@@ -224,15 +237,15 @@
+
+ if ((*LastVer == 0 && _error->PendingError()) || List.NewVersion(Ver) == false)
+ return _error->Error(_("Error occurred while processing %s (NewVersion1)"),
+- PackageName.c_str());
++ std::string(PackageName).c_str());
+
+ if (List.UsePackage(Pkg,Ver) == false)
+ return _error->Error(_("Error occurred while processing %s (UsePackage3)"),
+- PackageName.c_str());
++ std::string(PackageName).c_str());
+
+ if (NewFileVer(Ver,List) == false)
+ return _error->Error(_("Error occurred while processing %s (NewVersion2)"),
+- PackageName.c_str());
++ std::string(PackageName).c_str());
+
+ // Read only a single record and return
+ if (OutVer != 0)
+@@ -251,11 +264,11 @@
+ for (; Desc.end() == false; LastDesc = &Desc->NextDesc, Desc++);
+
+ // Add new description
+- *LastDesc = NewDescription(Desc, List.DescriptionLanguage(), List.Description_md5(), *LastDesc);
++ *LastDesc = NewDescription(Desc, language, List.Description_md5(), *LastDesc);
+ Desc->ParentPkg = Pkg.Index();
+
+ if ((*LastDesc == 0 && _error->PendingError()) || NewFileDesc(Desc,List) == false)
+- return _error->Error(_("Error occurred while processing %s (NewFileDesc2)"),PackageName.c_str());
++ return _error->Error(_("Error occurred while processing %s (NewFileDesc2)"),std::string(PackageName).c_str());
+ }
+
+ FoundFileDeps |= List.HasFileDeps();
+@@ -328,6 +341,11 @@
+ /* This creates a new package structure and adds it to the hash table */
+ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const string &Name)
+ {
++ return NewPackage(Pkg, srkString(Name));
++}
++
++bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const srkString &Name)
++{
+ Pkg = Cache.FindPkg(Name);
+ if (Pkg.end() == false)
+ return true;
+@@ -345,7 +363,7 @@
+ Cache.HeaderP->HashTable[Hash] = Package;
+
+ // Set the name and the ID
+- Pkg->Name = Map.WriteString(Name);
++ Pkg->Name = Map.WriteString(Name.Start,Name.Size);
+ if (Pkg->Name == 0)
+ return false;
+ Pkg->ID = Cache.HeaderP->PackageCount++;
+@@ -393,6 +411,13 @@
+ const string &VerStr,
+ unsigned long Next)
+ {
++ return NewVersion(Ver, srkString(VerStr), Next);
++}
++
++unsigned long pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver,
++ const srkString &VerStr,
++ unsigned long Next)
++{
+ // Get a structure
+ unsigned long Version = Map.Allocate(sizeof(pkgCache::Version));
+ if (Version == 0)
+@@ -402,7 +427,7 @@
+ Ver = pkgCache::VerIterator(Cache,Cache.VerP + Version);
+ Ver->NextVer = Next;
+ Ver->ID = Cache.HeaderP->VersionCount++;
+- Ver->VerStr = Map.WriteString(VerStr);
++ Ver->VerStr = Map.WriteString(VerStr.Start, VerStr.Size);
+ if (Ver->VerStr == 0)
+ return 0;
+
+@@ -478,6 +503,15 @@
+ unsigned int Op,
+ unsigned int Type)
+ {
++ return NewDepends(Ver, srkString(PackageName), srkString(Version), Op, Type);
++}
++
++bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver,
++ const srkString &PackageName,
++ const srkString &Version,
++ unsigned int Op,
++ unsigned int Type)
++{
+ pkgCache &Cache = Owner->Cache;
+
+ // Get a structure
+@@ -541,6 +575,13 @@
+ const string &PackageName,
+ const string &Version)
+ {
++ return NewProvides(Ver, srkString(PackageName), srkString(Version));
++}
++
++bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator Ver,
++ const srkString &PackageName,
++ const srkString &Version)
++{
+ pkgCache &Cache = Owner->Cache;
+
+ // We do not add self referencing provides
+diff -Nru apt-0.7.25.3/apt-pkg/pkgcachegen.h apt-0.7.25.3+iPhone/apt-pkg/pkgcachegen.h
+--- apt-0.7.25.3/apt-pkg/pkgcachegen.h 2010-02-24 08:53:52.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/pkgcachegen.h 2010-02-24 08:49:18.000000000 +0000
+@@ -52,9 +52,11 @@
+ bool FoundFileDeps;
+
+ bool NewPackage(pkgCache::PkgIterator &Pkg,const string &PkgName);
++ bool NewPackage(pkgCache::PkgIterator &Pkg,const srkString &PkgName);
+ bool NewFileVer(pkgCache::VerIterator &Ver,ListParser &List);
+ bool NewFileDesc(pkgCache::DescIterator &Desc,ListParser &List);
+ unsigned long NewVersion(pkgCache::VerIterator &Ver,const string &VerStr,unsigned long Next);
++ unsigned long NewVersion(pkgCache::VerIterator &Ver,const srkString &VerStr,unsigned long Next);
+ map_ptrloc NewDescription(pkgCache::DescIterator &Desc,const string &Lang,const MD5SumValue &md5sum,map_ptrloc Next);
+
+ public:
+@@ -96,11 +98,17 @@
+ inline unsigned long WriteUniqString(const char *S,unsigned int Size) {return Owner->WriteUniqString(S,Size);};
+ inline unsigned long WriteString(const string &S) {return Owner->Map.WriteString(S);};
+ inline unsigned long WriteString(const char *S,unsigned int Size) {return Owner->Map.WriteString(S,Size);};
++ inline unsigned long WriteString(const srkString &S) {return Owner->Map.WriteString(S.Start,S.Size);};
+ bool NewDepends(pkgCache::VerIterator Ver,const string &Package,
+ const string &Version,unsigned int Op,
+ unsigned int Type);
++ bool NewDepends(pkgCache::VerIterator Ver,const srkString &Package,
++ const srkString &Version,unsigned int Op,
++ unsigned int Type);
+ bool NewProvides(pkgCache::VerIterator Ver,const string &Package,
+ const string &Version);
++ bool NewProvides(pkgCache::VerIterator Ver,const srkString &Package,
++ const srkString &Version);
+ bool NewTag(pkgCache::PkgIterator Pkg,const char *NameStart,unsigned int NameSize);
+
+ public:
+diff -Nru apt-0.7.25.3/apt-pkg/pkgcache.h apt-0.7.25.3+iPhone/apt-pkg/pkgcache.h
+--- apt-0.7.25.3/apt-pkg/pkgcache.h 2010-02-24 08:53:52.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/pkgcache.h 2010-02-24 07:57:37.000000000 +0000
+@@ -23,9 +23,10 @@
+ #include <string>
+ #include <time.h>
+ #include <apt-pkg/mmap.h>
++#include <apt-pkg/srkstring.h>
+
+ using std::string;
+-
++
+ class pkgVersioningSystem;
+ class pkgCache /*{{{*/
+ {
+@@ -102,6 +103,7 @@
+
+ unsigned long sHash(const string &S) const;
+ unsigned long sHash(const char *S) const;
++ unsigned long sHash(const srkString &S) const;
+
+ public:
+
+@@ -127,12 +129,14 @@
+ // String hashing function (512 range)
+ inline unsigned long Hash(const string &S) const {return sHash(S);};
+ inline unsigned long Hash(const char *S) const {return sHash(S);};
++ inline unsigned long Hash(const srkString &S) const {return sHash(S);};
+
+ // Usefull transformation things
+ const char *Priority(unsigned char Priority);
+
+ // Accessors
+ PkgIterator FindPkg(const string &Name);
++ PkgIterator FindPkg(const srkString &Name);
+ Header &Head() {return *HeaderP;};
+ inline PkgIterator PkgBegin();
+ inline PkgIterator PkgEnd();
+diff -Nru apt-0.7.25.3/apt-pkg/srkstring.h apt-0.7.25.3+iPhone/apt-pkg/srkstring.h
+--- apt-0.7.25.3/apt-pkg/srkstring.h 1970-01-01 00:00:00.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/srkstring.h 2010-02-24 08:37:27.000000000 +0000
+@@ -0,0 +1,64 @@
++// -*- mode: cpp; mode: fold -*-
++// Description /*{{{*/
++// $Id: pkgcache.h,v 1.25 2001/07/01 22:28:24 jgg Exp $
++/* ######################################################################
++
++ Cache - Structure definitions for the cache file
++
++ Please see doc/apt-pkg/cache.sgml for a more detailed description of
++ this format. Also be sure to keep that file up-to-date!!
++
++ Clients should always use the CacheIterators classes for access to the
++ cache. They provide a simple STL-like method for traversing the links
++ of the datastructure.
++
++ See pkgcachegen.h for information about generating cache structures.
++
++ ##################################################################### */
++ /*}}}*/
++#ifndef PKGLIB_PKGSTRING_H
++#define PKGLIB_PKGSTRING_H
++
++#include <string>
++
++class srkString
++{
++ public:
++ const char *Start;
++ size_t Size;
++
++ srkString() : Start(NULL), Size(0) {}
++
++ srkString(const char *Start, size_t Size) : Start(Start), Size(Size) {}
++ srkString(const char *Start, const char *Stop) : Start(Start), Size(Stop - Start) {}
++ srkString(const std::string &string) : Start(string.c_str()), Size(string.size()) {}
++
++ bool empty() const { return Size == 0; }
++ void clear() { Start = NULL; Size = 0; }
++
++ void assign(const char *nStart, const char *nStop) { Start = nStart; Size = nStop - nStart; }
++ void assign(const char *nStart, size_t nSize) { Start = nStart; Size = nSize; }
++
++ size_t length() const { return Size; }
++ size_t size() const { return Size; }
++
++ typedef const char *const_iterator;
++ const char *begin() const { return Start; }
++ const char *end() const { return Start + Size; }
++
++ char operator [](size_t index) const { return Start[index]; }
++
++ operator std::string() { std::string Str; Str.assign(Start, Size); return Str; }
++};
++
++int stringcasecmp(const char *lhsb, const char *lhse, const char *rhs);
++inline int stringcasecmp(const srkString &lhs, const char *rhs) {
++ return stringcasecmp(lhs.Start, lhs.Start + lhs.Size, rhs);
++}
++
++int stringcmp(const std::string &lhs, const char *rhsb, const char *rhse);
++inline bool operator ==(const std::string &lhs, const srkString &rhs) {
++ return stringcmp(lhs, rhs.begin(), rhs.end()) == 0;
++}
++
++#endif
+diff -Nru apt-0.7.25.3/apt-pkg/version.h apt-0.7.25.3+iPhone/apt-pkg/version.h
+--- apt-0.7.25.3/apt-pkg/version.h 2010-02-01 19:44:40.000000000 +0000
++++ apt-0.7.25.3+iPhone/apt-pkg/version.h 2010-02-24 07:57:37.000000000 +0000
+@@ -20,7 +20,7 @@
+ #ifndef PKGLIB_VERSION_H
+ #define PKGLIB_VERSION_H
+
+-
++#include <apt-pkg/srkstring.h>
+ #include <apt-pkg/strutl.h>
+ #include <string>
+