From d460e03e946ea2f8fa22fb1a8aa3a12b28b0a56c Mon Sep 17 00:00:00 2001 From: Jay Freeman Date: Wed, 24 Feb 2010 10:01:00 +0000 Subject: Slightly decrease the memory used by the Name tables. git-svn-id: http://svn.telesphoreo.org/trunk@704 514c082c-b64e-11dc-b46d-3d985efe055d --- data/_apt7/tornado.diff | 719 ++++++++++++++++++++++++++++++++++++++++++++ data/_apt7/unique.diff | 118 ++++++++ data/_apt7/vindication.diff | 716 ------------------------------------------- 3 files changed, 837 insertions(+), 716 deletions(-) create mode 100644 data/_apt7/tornado.diff create mode 100644 data/_apt7/unique.diff delete mode 100644 data/_apt7/vindication.diff (limited to 'data') diff --git a/data/_apt7/tornado.diff b/data/_apt7/tornado.diff new file mode 100644 index 000000000..e276f3356 --- /dev/null +++ b/data/_apt7/tornado.diff @@ -0,0 +1,719 @@ +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 + #include + ++#include ++ + 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 + #include + ++#include ++ + using std::string; + using std::vector; + using std::ostream; +@@ -57,6 +59,7 @@ + bool ReadMessages(int Fd, vector &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));}; \ +@@ -77,6 +77,7 @@ + inline int name(const string& A,const char *B,const char *BEnd) {return func(A.c_str(),A.c_str()+A.length(),B,BEnd);}; + + #define APT_MKSTRCMP2(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 *AEnd,const char *B) {return func(A,AEnd,B,B+strlen(B));}; \ + inline int name(const string& A,const char *B) {return func(A.begin(),A.end(),B,B+strlen(B));}; \ + inline int name(const string& A,const string& B) {return func(A.begin(),A.end(),B.begin(),B.end());}; \ +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 + #include + #include ++ ++#include + /*}}}*/ + typedef vector::iterator FileIterator; + +@@ -103,26 +105,37 @@ + pkgCache::VerIterator *OutVer) + { + List.Owner = this; ++ debListParser *debian(dynamic_cast(&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 + #include + #include ++#include + + 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,59 @@ ++// -*- 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 ++ ++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 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 + #include + #include + diff --git a/data/_apt7/unique.diff b/data/_apt7/unique.diff new file mode 100644 index 000000000..6086369a0 --- /dev/null +++ b/data/_apt7/unique.diff @@ -0,0 +1,118 @@ +diff -ru 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 09:53:27.000000000 +0000 ++++ apt-0.7.25.3+iPhone/apt-pkg/deb/deblistparser.cc 2010-02-24 09:42:05.000000000 +0000 +@@ -45,7 +45,7 @@ + const char *Stop; + if (Section.Find(Tag,Start,Stop) == false) + return 0; +- return WriteString(Start,Stop - Start); ++ return WriteString(srkString(Start,Stop - Start)); + } + /*}}}*/ + // ListParser::UniqFindTagWrite - Find the tag and write a unq string /*{{{*/ +diff -ru 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 09:53:27.000000000 +0000 ++++ apt-0.7.25.3+iPhone/apt-pkg/pkgcachegen.cc 2010-02-24 09:51:06.000000000 +0000 +@@ -680,21 +680,38 @@ + unsigned long pkgCacheGenerator::WriteUniqString(const char *S, + unsigned int Size) + { ++ return WriteString(srkString(S, Size), srkSeriouslyUnique); ++} ++ ++unsigned long pkgCacheGenerator::WriteString(const srkString &S, ++ enum srkLevel level) ++{ ++ if (level == srkRunOfTheMillNormal) ++ return Map.WriteString(S.Start,S.Size); ++ + /* We use a very small transient hash table here, this speeds up generation + by a fair amount on slower machines */ +- pkgCache::StringItem *&Bucket = UniqHash[(S[0]*5 + S[1]) % _count(UniqHash)]; ++ pkgCache::StringItem *&Bucket(level == srkReasonablySpecial ? SpecHash[(S[0]*5 + S[1]) % _count(SpecHash)] : UniqHash[(S[0]*5 + S[1]) % _count(UniqHash)]); + if (Bucket != 0 && +- stringcmp(S,S+Size,Cache.StrP + Bucket->String) == 0) ++ stringcmp(S,Cache.StrP + Bucket->String) == 0) + return Bucket->String; + ++ pkgCache::StringItem *I; ++ map_ptrloc *Last; ++ ++ if (level != srkSeriouslyUnique) { ++ I = NULL; ++ Last = NULL; ++ } else { ++ + // Search for an insertion point +- pkgCache::StringItem *I = Cache.StringItemP + Cache.HeaderP->StringList; ++ I = Cache.StringItemP + Cache.HeaderP->StringList; + int Res = 1; +- map_ptrloc *Last = &Cache.HeaderP->StringList; ++ Last = &Cache.HeaderP->StringList; + for (; I != Cache.StringItemP; Last = &I->NextItem, + I = Cache.StringItemP + I->NextItem) + { +- Res = stringcmp(S,S+Size,Cache.StrP + I->String); ++ Res = stringcmp(S,Cache.StrP + I->String); + if (Res >= 0) + break; + } +@@ -705,6 +722,8 @@ + Bucket = I; + return I->String; + } ++ ++ } + + // Get a structure + unsigned long Item = Map.Allocate(sizeof(pkgCache::StringItem)); +@@ -714,8 +733,9 @@ + // Fill in the structure + pkgCache::StringItem *ItemP = Cache.StringItemP + Item; + ItemP->NextItem = I - Cache.StringItemP; +- *Last = Item; +- ItemP->String = Map.WriteString(S,Size); ++ if (Last != NULL) ++ *Last = Item; ++ ItemP->String = Map.WriteString(S.Start,S.Size); + if (ItemP->String == 0) + return 0; + +diff -ru 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 09:53:27.000000000 +0000 ++++ apt-0.7.25.3+iPhone/apt-pkg/pkgcachegen.h 2010-02-24 09:50:07.000000000 +0000 +@@ -32,13 +32,16 @@ + { + private: + +- pkgCache::StringItem *UniqHash[26]; ++ pkgCache::StringItem *UniqHash[24]; ++ pkgCache::StringItem *SpecHash[2]; + + public: + + class ListParser; + friend class ListParser; + ++ enum srkLevel { srkRunOfTheMillNormal, srkReasonablySpecial, srkSeriouslyUnique }; ++ + protected: + + DynamicMMap ⤅ +@@ -63,6 +66,7 @@ + + unsigned long WriteUniqString(const char *S,unsigned int Size); + inline unsigned long WriteUniqString(const string &S) {return WriteUniqString(S.c_str(),S.length());}; ++ unsigned long WriteString(const srkString &S, enum srkLevel level); + + void DropProgress() {Progress = 0;}; + bool SelectFile(const string &File,const string &Site,pkgIndexFile const &Index, +@@ -98,7 +102,7 @@ + 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);}; ++ inline unsigned long WriteString(const srkString &S) {return Owner->WriteString(S, srkReasonablySpecial);}; + bool NewDepends(pkgCache::VerIterator Ver,const string &Package, + const string &Version,unsigned int Op, + unsigned int Type); diff --git a/data/_apt7/vindication.diff b/data/_apt7/vindication.diff deleted file mode 100644 index c07591be7..000000000 --- a/data/_apt7/vindication.diff +++ /dev/null @@ -1,716 +0,0 @@ -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 - #include - -+#include -+ - 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 - #include - -+#include -+ - using std::string; - using std::vector; - using std::ostream; -@@ -57,6 +59,7 @@ - bool ReadMessages(int Fd, vector &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 - #include - #include -+ -+#include - /*}}}*/ - typedef vector::iterator FileIterator; - -@@ -103,26 +105,37 @@ - pkgCache::VerIterator *OutVer) - { - List.Owner = this; -+ debListParser *debian(dynamic_cast(&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 - #include - #include -+#include - - 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 -+ -+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 - #include - #include - -- cgit v1.2.3