diff options
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/pkgcache.cc | 5 | ||||
-rw-r--r-- | apt-pkg/pkgcache.h | 4 | ||||
-rw-r--r-- | apt-pkg/pkgcachegen.cc | 25 | ||||
-rw-r--r-- | apt-pkg/tagfile.cc | 60 | ||||
-rw-r--r-- | apt-pkg/tagfile.h | 4 |
5 files changed, 63 insertions, 35 deletions
diff --git a/apt-pkg/pkgcache.cc b/apt-pkg/pkgcache.cc index 8b0e85ea3..3e01e771d 100644 --- a/apt-pkg/pkgcache.cc +++ b/apt-pkg/pkgcache.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: pkgcache.cc,v 1.19 1998/12/04 22:56:52 jgg Exp $ +// $Id: pkgcache.cc,v 1.20 1998/12/07 07:26:19 jgg Exp $ /* ###################################################################### Package Cache - Accessor code for the cache @@ -159,7 +159,8 @@ pkgCache::PkgIterator pkgCache::FindPkg(string Name) Package *Pkg = PkgP + HeaderP->HashTable[Hash(Name)]; for (; Pkg != PkgP; Pkg = PkgP + Pkg->NextPackage) { - if (Pkg->Name != 0 && StrP + Pkg->Name == Name) + if (Pkg->Name != 0 && StrP[Pkg->Name] == Name[0] && + StrP + Pkg->Name == Name) return PkgIterator(*this,Pkg); } return PkgIterator(*this,0); diff --git a/apt-pkg/pkgcache.h b/apt-pkg/pkgcache.h index 037f8f055..a7d1e9424 100644 --- a/apt-pkg/pkgcache.h +++ b/apt-pkg/pkgcache.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: pkgcache.h,v 1.10 1998/11/12 03:28:29 jgg Exp $ +// $Id: pkgcache.h,v 1.11 1998/12/07 07:26:20 jgg Exp $ /* ###################################################################### Cache - Structure definitions for the cache file @@ -163,7 +163,7 @@ struct pkgCache::Header DynamicMMap::Pool Pools[7]; // Rapid package name lookup - __apt_ptrloc HashTable[512]; + __apt_ptrloc HashTable[2048]; bool CheckSizes(Header &Against) const; Header(); diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index bbf245b00..ccb6bedd4 100644 --- a/apt-pkg/pkgcachegen.cc +++ b/apt-pkg/pkgcachegen.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: pkgcachegen.cc,v 1.23 1998/11/13 04:23:33 jgg Exp $ +// $Id: pkgcachegen.cc,v 1.24 1998/12/07 07:26:21 jgg Exp $ /* ###################################################################### Package Cache Generator - Generator for the cache structure. @@ -253,19 +253,28 @@ bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver, if ((Dep->Version = WriteString(Version)) == 0) return false; } - + // Link it to the package Dep->Package = Pkg.Index(); Dep->NextRevDepends = Pkg->RevDepends; Pkg->RevDepends = Dep.Index(); - // Link it to the version (at the end of the list) - __apt_ptrloc *Last = &Ver->DependsList; - for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++) - Last = &D->NextDepends; - Dep->NextDepends = *Last; - *Last = Dep.Index(); + /* Link it to the version (at the end of the list) + Caching the old end point speeds up generation substantially */ + static pkgCache::VerIterator OldVer(Cache); + static __apt_ptrloc *OldLast; + if (OldVer != Ver) + { + OldLast = &Ver->DependsList; + for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++) + OldLast = &D->NextDepends; + OldVer = Ver; + } + Dep->NextDepends = *OldLast; + *OldLast = Dep.Index(); + OldLast = &Dep->NextDepends; + return true; } /*}}}*/ diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc index 9a7c9734d..68ab7856e 100644 --- a/apt-pkg/tagfile.cc +++ b/apt-pkg/tagfile.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: tagfile.cc,v 1.16 1998/11/28 03:54:29 jgg Exp $ +// $Id: tagfile.cc,v 1.17 1998/12/07 07:26:22 jgg Exp $ /* ###################################################################### Fast scanner for RFC-822 type header information @@ -115,38 +115,42 @@ bool pkgTagFile::Jump(pkgTagSection &Tag,unsigned long Offset) // TagSection::Scan - Scan for the end of the header information /*{{{*/ // --------------------------------------------------------------------- /* This looks for the first double new line in the data stream. It also - indexes the tags in the section. */ + indexes the tags in the section. This very simple hash function for the + first 3 letters gives very good performance on the debian package files */ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength) { const char *End = Start + MaxLength; Stop = Section = Start; + memset(AlphaIndexes,0,sizeof(AlphaIndexes)); TagCount = 0; - Indexes[TagCount++] = Stop - Section; - Stop++; - for (; Stop < End; Stop++) + while (TagCount < sizeof(Indexes)/sizeof(Indexes[0])) { - if (Stop[-1] != '\n') - continue; + if (isspace(Stop[0]) == 0) + { + Indexes[TagCount++] = Stop - Section; + unsigned char A = tolower(Stop[0]) - 'a'; + unsigned char B = tolower(Stop[1]) - 'a'; + unsigned char C = tolower(Stop[3]) - 'a'; + AlphaIndexes[((A + C/3)%26) + 26*((B + C/2)%26)] = TagCount; + } - // Skip line feeds - for (; Stop[0] == '\r' && Stop < End; Stop++); + Stop = (const char *)memchr(Stop,'\n',End - Stop); - if (Stop[0] == '\n') + if (Stop == 0) + return false; + for (; Stop[1] == '\r' && Stop < End; Stop++); + + if (Stop[1] == '\n') { - // Extra one at the end to simplify find Indexes[TagCount] = Stop - Section; for (; (Stop[0] == '\n' || Stop[0] == '\r') && Stop < End; Stop++); return true; } - if (isspace(Stop[0]) == 0) - Indexes[TagCount++] = Stop - Section; - - // Just in case. - if (TagCount > sizeof(Indexes)/sizeof(Indexes[0])) - TagCount = sizeof(Indexes)/sizeof(Indexes[0]); - } + Stop++; + } + return false; } /*}}}*/ @@ -157,13 +161,24 @@ bool pkgTagSection::Find(const char *Tag,const char *&Start, const char *&End) { unsigned int Length = strlen(Tag); - for (unsigned int I = 0; I != TagCount; I++) + unsigned char A = tolower(Tag[0]) - 'a'; + unsigned char B = tolower(Tag[1]) - 'a'; + unsigned char C = tolower(Tag[3]) - 'a'; + unsigned int I = AlphaIndexes[((A + C/3)%26) + 26*((B + C/2)%26)]; + if (I == 0) + return false; + I--; + + for (unsigned int Counter = 0; Counter != TagCount; Counter++, + I = (I+1)%TagCount) { - if (strncasecmp(Tag,Section + Indexes[I],Length) != 0) + const char *St; + St = Section + Indexes[I]; + if (strncasecmp(Tag,St,Length) != 0) continue; // Make sure the colon is in the right place - const char *C = Section + Length + Indexes[I]; + const char *C = St + Length; for (; isspace(*C) != 0; C++); if (*C != ':') continue; @@ -173,9 +188,10 @@ bool pkgTagSection::Find(const char *Tag,const char *&Start, End = Section + Indexes[I+1]; for (; (isspace(*Start) != 0 || *Start == ':') && Start < End; Start++); for (; isspace(End[-1]) != 0 && End > Start; End--); - + return true; } + Start = End = 0; return false; } diff --git a/apt-pkg/tagfile.h b/apt-pkg/tagfile.h index a18888198..83dd73d2a 100644 --- a/apt-pkg/tagfile.h +++ b/apt-pkg/tagfile.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: tagfile.h,v 1.11 1998/11/28 03:54:31 jgg Exp $ +// $Id: tagfile.h,v 1.12 1998/12/07 07:26:23 jgg Exp $ /* ###################################################################### Fast scanner for RFC-822 type header information @@ -34,6 +34,8 @@ class pkgTagSection // We have a limit of 256 tags per section. unsigned short Indexes[256]; + unsigned short AlphaIndexes[26 + 26*26]; + unsigned int TagCount; public: |