removing the massive sort time overhead.
By breaking all the pathnames into components and storing them
- separately a space savings is realized by not duplicating the string
+ separately a space saving is realized by not duplicating the string
over and over again. Ultimately this saving is sacrificed to storage of
the tree structure itself but the tree structure yields a speed gain
in the sorting and processing. Ultimately it takes about 5 seconds to
##################################################################### */
/*}}}*/
// Include Files /*{{{*/
-#include "contents.h"
+#include <config.h>
-#include <apti18n.h>
-#include <apt-pkg/extracttar.h>
+#include <apt-pkg/debfile.h>
+#include <apt-pkg/dirstream.h>
#include <apt-pkg/error.h>
+#include <apt-pkg/fileutl.h>
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <malloc.h>
+
+#include "contents.h"
+
+#include <apti18n.h>
/*}}}*/
// GenContents::~GenContents - Free allocated memory /*{{{*/
if (Owner->NodeLeft == 0)
{
Owner->NodeLeft = 10000;
- Owner->NodePool = (Node *)malloc(Amount*Owner->NodeLeft);
+ Owner->NodePool = static_cast<Node *>(malloc(Amount*Owner->NodeLeft));
BigBlock *Block = new BigBlock;
Block->Block = Owner->NodePool;
Block->Next = Owner->BlockList;
// The final component if it does not have a trailing /
if (I - Start >= 1)
- Root = Grab(Root,Start,Package);
+ Grab(Root,Start,Package);
}
/*}}}*/
// GenContents::WriteSpace - Write a given number of white space chars /*{{{*/
// ---------------------------------------------------------------------
/* We mod 8 it and write tabs where possible. */
-void GenContents::WriteSpace(FILE *Out,unsigned int Current,unsigned int Target)
+void GenContents::WriteSpace(std::string &out, size_t Current, size_t Target)
{
if (Target <= Current)
Target = Current + 1;
-
+
/* Now we write tabs so long as the next tab stop would not pass
the target */
for (; (Current/8 + 1)*8 < Target; Current = (Current/8 + 1)*8)
- fputc('\t',Out);
+ out.append("\t");
// Fill the last bit with spaces
for (; Current < Target; Current++)
- fputc(' ',Out);
+ out.append(" ");
}
/*}}}*/
// GenContents::Print - Display the tree /*{{{*/
calls itself and runs over each section of the tree printing out
the pathname and the hit packages. We use Buf to build the pathname
summed over all the directory parents of this node. */
-void GenContents::Print(FILE *Out)
+void GenContents::Print(FileFd &Out)
{
char Buffer[1024];
Buffer[0] = 0;
DoPrint(Out,&Root,Buffer);
}
-void GenContents::DoPrint(FILE *Out,GenContents::Node *Top, char *Buf)
+void GenContents::DoPrint(FileFd &Out,GenContents::Node *Top, char *Buf)
{
if (Top == 0)
return;
if (Top->Path != 0)
{
strcat(Buf,Top->Path);
-
+
// Do not show the item if it is a directory with dups
if (Top->Path[strlen(Top->Path)-1] != '/' /*|| Top->Dups == 0*/)
{
- fputs(Buf,Out);
- WriteSpace(Out,strlen(Buf),60);
+ std::string out = Buf;
+ WriteSpace(out, out.length(), 60);
for (Node *I = Top; I != 0; I = I->Dups)
{
if (I != Top)
- fputc(',',Out);
- fputs(I->Package,Out);
+ out.append(",");
+ out.append(I->Package);
}
- fputc('\n',Out);
- }
- }
-
+ out.append("\n");
+ Out.Write(out.c_str(), out.length());
+ }
+ }
+
// Go along the directory link
DoPrint(Out,Top->DirDown,Buf);
*OldEnd = 0;
-
+
// Go right
DoPrint(Out,Top->BTreeRight,Buf);
}
/*}}}*/
-
+// ContentsExtract Constructor /*{{{*/
+ContentsExtract::ContentsExtract()
+ : Data(0), MaxSize(0), CurSize(0)
+{
+}
+ /*}}}*/
+// ContentsExtract Destructor /*{{{*/
+ContentsExtract::~ContentsExtract()
+{
+ free(Data);
+}
+ /*}}}*/
// ContentsExtract::Read - Read the archive /*{{{*/
// ---------------------------------------------------------------------
/* */
bool ContentsExtract::Read(debDebFile &Deb)
{
Reset();
-
- // Get the archive member and positition the file
- const ARArchive::Member *Member = Deb.GotoMember("data.tar.gz");
- const char *Compressor = "gzip";
- if (Member == 0) {
- Member = Deb.GotoMember("data.tar.bz2");
- Compressor = "bzip2";
- }
- if (Member == 0) {
- _error->Error(_("Internal error, could not locate member %s"),"data.tar.gz");
- return false;
- }
-
- // Extract it.
- ExtractTar Tar(Deb.GetFile(),Member->Size,Compressor);
- if (Tar.Go(*this) == false)
- return false;
- return true;
+ return Deb.ExtractArchive(*this);
}
/*}}}*/
// ContentsExtract::DoItem - Extract an item /*{{{*/
// ---------------------------------------------------------------------
/* This just tacks the name onto the end of our memory buffer */
-bool ContentsExtract::DoItem(Item &Itm,int &Fd)
+bool ContentsExtract::DoItem(Item &Itm, int &/*Fd*/)
{
unsigned long Len = strlen(Itm.Name);
// ContentsExtract::TakeContents - Load the contents data /*{{{*/
// ---------------------------------------------------------------------
/* */
-bool ContentsExtract::TakeContents(const void *NewData,unsigned long Length)
+bool ContentsExtract::TakeContents(const void *NewData,unsigned long long Length)
{
if (Length == 0)
{
// ContentsExtract::Add - Read the contents data into the sorter /*{{{*/
// ---------------------------------------------------------------------
/* */
-void ContentsExtract::Add(GenContents &Contents,string Package)
+void ContentsExtract::Add(GenContents &Contents,std::string const &Package)
{
const char *Start = Data;
char *Pkg = Contents.Mystrdup(Package.c_str());