From: Michael Vogt Date: Wed, 26 Apr 2006 10:47:41 +0000 (+0200) Subject: * apt-pkg/tagfile.{cc,h}: X-Git-Tag: 0.7.21~330^2 X-Git-Url: https://git.saurik.com/apt.git/commitdiff_plain/432b168ce4ec7a7c2caef44c0c8470c7197d58b3 * apt-pkg/tagfile.{cc,h}: - use mmap for the tagfile code (closes: #350025) --- 432b168ce4ec7a7c2caef44c0c8470c7197d58b3 diff --cc apt-pkg/tagfile.cc index cae0fa819,cae0fa819..dc1ba3f9e --- a/apt-pkg/tagfile.cc +++ b/apt-pkg/tagfile.cc @@@ -35,20 -35,20 +35,20 @@@ pkgTagFile::pkgTagFile(FileFd *pFd,unsi Fd(*pFd), Size(Size) { -- if (Fd.IsOpen() == false) ++ if (Fd.IsOpen() == false || Fd.Size() == 0) { Buffer = 0; Start = End = Buffer = 0; -- Done = true; iOffset = 0; ++ Map = NULL; return; } -- Buffer = new char[Size]; -- Start = End = Buffer; -- Done = false; ++ Map = new MMap (Fd, MMap::Public | MMap::ReadOnly); ++ Buffer = (char *) Map->Data (); ++ Start = Buffer; ++ End = Buffer + Map->Size (); iOffset = 0; -- Fill(); } /*}}}*/ // TagFile::~pkgTagFile - Destructor /*{{{*/ @@@ -56,7 -56,7 +56,7 @@@ /* */ pkgTagFile::~pkgTagFile() { -- delete [] Buffer; ++ delete Map; } /*}}}*/ // TagFile::Step - Advance to the next section /*{{{*/ @@@ -64,63 -64,63 +64,18 @@@ /* If the Section Scanner fails we refill the buffer and try again. */ bool pkgTagFile::Step(pkgTagSection &Tag) { ++ if (Start == End) ++ return false; ++ if (Tag.Scan(Start,End - Start) == false) { -- if (Fill() == false) -- return false; -- -- if (Tag.Scan(Start,End - Start) == false) -- return _error->Error(_("Unable to parse package file %s (1)"), -- Fd.Name().c_str()); ++ return _error->Error(_("Unable to parse package file %s (1)"), ++ Fd.Name().c_str()); } Start += Tag.size(); iOffset += Tag.size(); Tag.Trim(); -- return true; --} -- /*}}}*/ --// TagFile::Fill - Top up the buffer /*{{{*/ --// --------------------------------------------------------------------- --/* This takes the bit at the end of the buffer and puts it at the start -- then fills the rest from the file */ --bool pkgTagFile::Fill() --{ -- unsigned long EndSize = End - Start; -- unsigned long Actual = 0; -- -- memmove(Buffer,Start,EndSize); -- Start = Buffer; -- End = Buffer + EndSize; -- -- if (Done == false) -- { -- // See if only a bit of the file is left -- if (Fd.Read(End,Size - (End - Buffer),&Actual) == false) -- return false; -- if (Actual != Size - (End - Buffer)) -- Done = true; -- End += Actual; -- } -- -- if (Done == true) -- { -- if (EndSize <= 3 && Actual == 0) -- return false; -- if (Size - (End - Buffer) < 4) -- return true; -- -- // Append a double new line if one does not exist -- unsigned int LineCount = 0; -- for (const char *E = End - 1; E - End < 6 && (*E == '\n' || *E == '\r'); E--) -- if (*E == '\n') -- LineCount++; -- for (; LineCount < 2; LineCount++) -- *End++ = '\n'; -- -- return true; -- } -- return true; } /*}}}*/ @@@ -141,20 -141,20 +96,7 @@@ bool pkgTagFile::Jump(pkgTagSection &Ta // Reposition and reload.. iOffset = Offset; -- Done = false; -- if (Fd.Seek(Offset) == false) -- return false; -- End = Start = Buffer; -- -- if (Fill() == false) -- return false; -- -- if (Tag.Scan(Start,End - Start) == true) -- return true; -- -- // This appends a double new line (for the real eof handling) -- if (Fill() == false) -- return false; ++ Start = Buffer + iOffset; if (Tag.Scan(Start,End - Start) == false) return _error->Error(_("Unable to parse package file %s (2)"),Fd.Name().c_str()); @@@ -181,7 -181,7 +123,7 @@@ bool pkgTagSection::Scan(const char *St Stop = Section = Start; memset(AlphaIndexes,0,sizeof(AlphaIndexes)); -- if (Stop == 0) ++ if (Stop == 0 || MaxLength == 0) return false; TagCount = 0; @@@ -212,6 -212,6 +154,12 @@@ Stop++; } ++ if ((Stop+1 >= End) && (End[-1] == '\n' || End[-1] == '\r')) ++ { ++ Indexes[TagCount] = (End - 1) - Section; ++ return true; ++ } ++ return false; } /*}}}*/ diff --cc apt-pkg/tagfile.h index 8c948754d,8c948754d..5cff2681c --- a/apt-pkg/tagfile.h +++ b/apt-pkg/tagfile.h @@@ -25,6 -25,6 +25,7 @@@ #endif #include ++#include #include class pkgTagSection @@@ -69,15 -69,15 +70,13 @@@ class pkgTagFile { FileFd &Fd; ++ MMap *Map; char *Buffer; char *Start; char *End; -- bool Done; unsigned long iOffset; unsigned long Size; -- bool Fill(); -- public: bool Step(pkgTagSection &Section); diff --cc debian/changelog index 07cebb23c,64c743a7f..c439f0df5 --- a/debian/changelog +++ b/debian/changelog @@@ -1,15 -1,3 +1,18 @@@ - apt (0.6.43.4) unstable; urgency=low ++apt (0.6.44) unstable; urgency=low + + * apt-pkg/acquire.cc: don't show ETA if it is 0 or absurdely large + * apt-pkg/deb/dpkgpm.cc: + - wording fixes (thanks to Matt Zimmerman) + - fix error in dpkg interaction (closes: #364513, + thanks to Martin Dickopp) ++ * apt-pkg/tagfile.{cc,h}: ++ - use MMap to read the entries (thanks to Zephaniah E. Hull for the ++ patch) Closes: #350025 + * Merge from http://www.perrier.eu.org/debian/packages/d-i/level4/apt-main: + * bg.po: Added, complete to 512t. Closes: #360262 + + -- Michael Vogt Tue, 25 Apr 2006 09:34:20 +0200 + apt (0.6.43.3) unstable; urgency=low * Merge bubulle@debian.org--2005/apt--main--0 up to patch-186: