]> git.saurik.com Git - apt.git/commitdiff
* apt-pkg/tagfile.cc,h:
authorMichael Vogt <michael.vogt@ubuntu.com>
Sun, 1 Oct 2006 22:58:53 +0000 (00:58 +0200)
committerMichael Vogt <michael.vogt@ubuntu.com>
Sun, 1 Oct 2006 22:58:53 +0000 (00:58 +0200)
  - make the internal buffer grow dynamically if required

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

index 040562fffbb0d5f7ba062edbb068953a58bfe5ea..223618cd19083be23fbfa45b31d14a6ca692c150 100644 (file)
@@ -59,19 +59,52 @@ pkgTagFile::~pkgTagFile()
    delete [] Buffer;
 }
                                                                        /*}}}*/
    delete [] Buffer;
 }
                                                                        /*}}}*/
+// TagFile::Resize - Resize the internal buffer                                /*{{{*/
+// ---------------------------------------------------------------------
+/* Resize the internal buffer (double it in size). Fail if a maximum size
+ * size is reached.
+ */
+bool pkgTagFile::Resize()
+{
+   char *tmp;
+   unsigned long EndSize = End - Start;
+
+   // fail is the buffer grows too big
+   if(Size > 1024*1024+1)
+      return false;
+
+   // get new buffer and use it
+   tmp = new char[2*Size];
+   memcpy(tmp, Buffer, Size);
+   Size = Size*2;
+   delete [] Buffer;
+   Buffer = tmp;
+
+   // update the start/end pointers to the new buffer
+   Start = Buffer;
+   End = Start + EndSize;
+   return true;
+}
+
 // TagFile::Step - Advance to the next section                         /*{{{*/
 // ---------------------------------------------------------------------
 // TagFile::Step - Advance to the next section                         /*{{{*/
 // ---------------------------------------------------------------------
-/* If the Section Scanner fails we refill the buffer and try again. */
+/* If the Section Scanner fails we refill the buffer and try again. 
+ * If that fails too, double the buffer size and try again until a
+ * maximum buffer is reached.
+ */
 bool pkgTagFile::Step(pkgTagSection &Tag)
 {
 bool pkgTagFile::Step(pkgTagSection &Tag)
 {
-   if (Tag.Scan(Start,End - Start) == false)
+   while (Tag.Scan(Start,End - Start) == false)
    {
       if (Fill() == false)
         return false;
       
    {
       if (Fill() == false)
         return false;
       
-      if (Tag.Scan(Start,End - Start) == false)
+      if(Tag.Scan(Start,End - Start))
+        break;
+
+      if (Resize() == false)
         return _error->Error(_("Unable to parse package file %s (1)"),
         return _error->Error(_("Unable to parse package file %s (1)"),
-                             Fd.Name().c_str());
+                                Fd.Name().c_str());
    }
    Start += Tag.size();
    iOffset += Tag.size();
    }
    Start += Tag.size();
    iOffset += Tag.size();
index 35ffebda8ffbb218c84672f326f9ede1388d85e1..70381ad13acef4d14505e6fc417450ad5681b31a 100644 (file)
@@ -75,16 +75,17 @@ class pkgTagFile
    bool Done;
    unsigned long iOffset;
    unsigned long Size;
    bool Done;
    unsigned long iOffset;
    unsigned long Size;
-   
+
    bool Fill();
    bool Fill();
-   
+   bool Resize();
+
    public:
 
    bool Step(pkgTagSection &Section);
    inline unsigned long Offset() {return iOffset;};
    bool Jump(pkgTagSection &Tag,unsigned long Offset);
 
    public:
 
    bool Step(pkgTagSection &Section);
    inline unsigned long Offset() {return iOffset;};
    bool Jump(pkgTagSection &Tag,unsigned long Offset);
 
-   pkgTagFile(FileFd *F,unsigned long Size = 128*1024);
+   pkgTagFile(FileFd *F,unsigned long Size = 32*1024);
    ~pkgTagFile();
 };
 
    ~pkgTagFile();
 };
 
index 77c7cf698b450f800a46d4f6703976acced22e4b..6b842898cd312aeacbc8971755fe94fbb0ce2aab 100644 (file)
@@ -13,8 +13,8 @@ apt (0.6.46.1) unstable; urgency=low
     * fi.po: Updated to 514t. Closes: #390149
     * eu.po: Updated to 514t. Closes: #389725
     * vi.po: Updated to 514t. Closes: #388555
     * fi.po: Updated to 514t. Closes: #390149
     * eu.po: Updated to 514t. Closes: #389725
     * vi.po: Updated to 514t. Closes: #388555
-  * use a bigger buffer in tagfile for now, this needs to 
-    become much more dynamic (closes: #388708)
+  * make the internal buffer in pkgTagFile grow dynamically
+    (closes: #388708)
   
  --
 
   
  --