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 /*{{{*/
/* */
pkgTagFile::~pkgTagFile()
{
-- delete [] Buffer;
++ delete Map;
}
/*}}}*/
// TagFile::Step - Advance to the next section /*{{{*/
/* 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;
}
/*}}}*/
// 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());
Stop = Section = Start;
memset(AlphaIndexes,0,sizeof(AlphaIndexes));
-- if (Stop == 0)
++ if (Stop == 0 || MaxLength == 0)
return false;
TagCount = 0;
Stop++;
}
++ if ((Stop+1 >= End) && (End[-1] == '\n' || End[-1] == '\r'))
++ {
++ Indexes[TagCount] = (End - 1) - Section;
++ return true;
++ }
++
return false;
}
/*}}}*/
- 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 <michael.vogt@ubuntu.com> 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: