* apt-pkg/tagfile.{cc,h}:
authorMichael Vogt <michael.vogt@ubuntu.com>
Wed, 26 Apr 2006 10:47:41 +0000 (12:47 +0200)
committerMichael Vogt <michael.vogt@ubuntu.com>
Wed, 26 Apr 2006 10:47:41 +0000 (12:47 +0200)
  - use mmap for the tagfile code (closes: #350025)

1  2 
apt-pkg/tagfile.cc
apt-pkg/tagfile.h
debian/changelog

@@@ -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                                /*{{{*/
  /* 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;
        Stop++;
     }
  
++   if ((Stop+1 >= End) && (End[-1] == '\n' || End[-1] == '\r'))
++   {
++       Indexes[TagCount] = (End - 1) - Section;
++       return true;
++   }
++
     return false;
  }
                                                                        /*}}}*/
@@@ -25,6 -25,6 +25,7 @@@
  #endif 
  
  #include <apt-pkg/fileutl.h>
++#include <apt-pkg/mmap.h>
  #include <stdio.h>
      
  class pkgTagSection
  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);
@@@ -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 <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: