]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/srcrecords.cc
fileutl: empty file support: Avoid fstat() on -1 fd and check result
[apt.git] / apt-pkg / srcrecords.cc
index b9df32e9213942c9463a11a2e1be835f8f408a4f..53d7e604d35e9ea4e21c2f88576266dae3a83acf 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: srcrecords.cc,v 1.4 2001/02/20 07:03:17 jgg Exp $
+// $Id: srcrecords.cc,v 1.7.2.2 2003/12/26 16:27:34 mdz Exp $
 /* ######################################################################
    
    Source Package Records - Allows access to source package records
 /* ######################################################################
    
    Source Package Records - Allows access to source package records
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
-#ifdef __GNUG__
-#pragma implementation "apt-pkg/srcrecords.h"
-#endif 
+#include<config.h>
 
 #include <apt-pkg/srcrecords.h>
 
 #include <apt-pkg/srcrecords.h>
+#include <apt-pkg/debsrcrecords.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/sourcelist.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/sourcelist.h>
-#include <apt-pkg/strutl.h>
-    
-#include <apti18n.h>    
+#include <apt-pkg/metaindex.h>
+#include <apt-pkg/indexfile.h>
+#include <apt-pkg/macros.h>
+
+#include <string.h>
+#include <string>
+#include <vector>
+
+#include <apti18n.h>
                                                                        /*}}}*/
 
 // SrcRecords::pkgSrcRecords - Constructor                             /*{{{*/
 // ---------------------------------------------------------------------
 /* Open all the source index files */
                                                                        /*}}}*/
 
 // SrcRecords::pkgSrcRecords - Constructor                             /*{{{*/
 // ---------------------------------------------------------------------
 /* Open all the source index files */
-pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : Files(0), Current(0)
+pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : d(NULL), Files(0)
 {
 {
-   Files = new Parser *[List.end() - List.begin() + 1];
-         
-   unsigned int Count = 0;
-   pkgSourceList::const_iterator I = List.begin();
-   for (; I != List.end(); I++)
+   for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); ++I)
    {
    {
-      Files[Count] = (*I)->CreateSrcParser();
-      if (_error->PendingError() == true)
-        return;
-      if (Files[Count] != 0)
-        Count++;
+      std::vector<pkgIndexFile *> *Indexes = (*I)->GetIndexFiles();
+      for (std::vector<pkgIndexFile *>::const_iterator J = Indexes->begin();
+          J != Indexes->end(); ++J)
+      {
+        _error->PushToStack();
+        Parser* P = (*J)->CreateSrcParser();
+        bool const newError = _error->PendingError();
+        _error->MergeWithStack();
+        if (newError)
+           return;
+        if (P != 0)
+           Files.push_back(P);
+      }
    }
    }
-   Files[Count] = 0;
    
    
-   // Doesnt work without any source index files
-   if (Count == 0)
+   // Doesn't work without any source index files
+   if (Files.empty() == true)
    {
    {
-      _error->Error(_("Sorry, you must put some 'source' URIs"
+      _error->Error(_("You must put some 'source' URIs"
                    " in your sources.list"));
       return;
    }   
                    " in your sources.list"));
       return;
    }   
@@ -58,13 +66,9 @@ pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : Files(0), Current(0)
 /* */
 pkgSrcRecords::~pkgSrcRecords()
 {
 /* */
 pkgSrcRecords::~pkgSrcRecords()
 {
-   if (Files == 0)
-      return;
-
    // Blow away all the parser objects
    // Blow away all the parser objects
-   for (unsigned int Count = 0; Files[Count] != 0; Count++)
-      delete Files[Count];
-   delete [] Files;
+   for(std::vector<Parser*>::iterator I = Files.begin(); I != Files.end(); ++I)
+      delete *I;
 }
                                                                        /*}}}*/
 // SrcRecords::Restart - Restart the search                            /*{{{*/
 }
                                                                        /*}}}*/
 // SrcRecords::Restart - Restart the search                            /*{{{*/
@@ -72,38 +76,45 @@ pkgSrcRecords::~pkgSrcRecords()
 /* Return all of the parsers to their starting position */
 bool pkgSrcRecords::Restart()
 {
 /* Return all of the parsers to their starting position */
 bool pkgSrcRecords::Restart()
 {
-   Current = Files;
-   for (Parser **I = Files; *I != 0; I++)
-      (*I)->Restart();
-   
+   Current = Files.begin();
+   for (std::vector<Parser*>::iterator I = Files.begin();
+        I != Files.end(); ++I)
+      if ((*I)->Offset() != 0)
+        (*I)->Restart();
+
    return true;
 }
                                                                        /*}}}*/
    return true;
 }
                                                                        /*}}}*/
+// SrcRecords::Step - Step to the next Source Record                   /*{{{*/
+// ---------------------------------------------------------------------
+/* Step to the next source package record */
+const pkgSrcRecords::Parser* pkgSrcRecords::Step()
+{
+   if (Current == Files.end())
+      return 0;
+
+   // Step to the next record, possibly switching files
+   while ((*Current)->Step() == false)
+   {
+      ++Current;
+      if (Current == Files.end())
+         return 0;
+   }
+
+   return *Current;
+}
+                                                                       /*}}}*/
 // SrcRecords::Find - Find the first source package with the given name        /*{{{*/
 // ---------------------------------------------------------------------
 /* This searches on both source package names and output binary names and
    returns the first found. A 'cursor' like system is used to allow this
    function to be called multiple times to get successive entries */
 // SrcRecords::Find - Find the first source package with the given name        /*{{{*/
 // ---------------------------------------------------------------------
 /* This searches on both source package names and output binary names and
    returns the first found. A 'cursor' like system is used to allow this
    function to be called multiple times to get successive entries */
-pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool SrcOnly)
+pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool const &SrcOnly)
 {
 {
-   if (*Current == 0)
-      return 0;
-   
    while (true)
    {
    while (true)
    {
-      // Step to the next record, possibly switching files
-      while ((*Current)->Step() == false)
-      {
-        if (_error->PendingError() == true)
-           return 0;
-        Current++;
-        if (*Current == 0)
-           return 0;
-      }
-      
-      // IO error somehow
-      if (_error->PendingError() == true)
-        return 0;
+      if(Step() == 0)
+         return 0;
 
       // Source name hit
       if ((*Current)->Package() == Package)
 
       // Source name hit
       if ((*Current)->Package() == Package)
@@ -114,7 +125,7 @@ pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool SrcOnly)
       
       // Check for a binary hit
       const char **I = (*Current)->Binaries();
       
       // Check for a binary hit
       const char **I = (*Current)->Binaries();
-      for (; I != 0 && *I != 0; I++)
+      for (; I != 0 && *I != 0; ++I)
         if (strcmp(Package,*I) == 0)
            return *Current;
    }
         if (strcmp(Package,*I) == 0)
            return *Current;
    }
@@ -123,17 +134,48 @@ pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool SrcOnly)
 // Parser::BuildDepType - Convert a build dep to a string              /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 // Parser::BuildDepType - Convert a build dep to a string              /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-const char *pkgSrcRecords::Parser::BuildDepType(unsigned char Type)
+const char *pkgSrcRecords::Parser::BuildDepType(unsigned char const &Type)
 {
 {
-   const char *fields[] = {"Build-Depends", 
-                           "Build-Depends-Indep",
+   const char *fields[] = {"Build-Depends",
+                          "Build-Depends-Indep",
                           "Build-Conflicts",
                           "Build-Conflicts-Indep"};
                           "Build-Conflicts",
                           "Build-Conflicts-Indep"};
-   if (Type < 4) 
-      return fields[Type]; 
-   else 
+   if (unlikely(Type >= sizeof(fields)/sizeof(fields[0])))
       return "";
       return "";
+   return fields[Type];
+}
+                                                                       /*}}}*/
+bool pkgSrcRecords::Parser::Files2(std::vector<pkgSrcRecords::File2> &F2)/*{{{*/
+{
+   debSrcRecordParser * const deb = dynamic_cast<debSrcRecordParser*>(this);
+   if (deb != NULL)
+      return deb->Files2(F2);
+
+   std::vector<pkgSrcRecords::File> F;
+   if (Files(F) == false)
+      return false;
+   for (std::vector<pkgSrcRecords::File>::const_iterator f = F.begin(); f != F.end(); ++f)
+   {
+      pkgSrcRecords::File2 f2;
+#if __GNUC__ >= 4
+       #pragma GCC diagnostic push
+       #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+      f2.MD5Hash = f->MD5Hash;
+      f2.Size = f->Size;
+      f2.Hashes.push_back(HashString("MD5Sum", f->MD5Hash));
+      f2.FileSize = f->Size;
+#if __GNUC__ >= 4
+       #pragma GCC diagnostic pop
+#endif
+      f2.Path = f->Path;
+      f2.Type = f->Type;
+      F2.push_back(f2);
+   }
+   return true;
 }
                                                                        /*}}}*/
 
 
 }
                                                                        /*}}}*/
 
 
+pkgSrcRecords::Parser::Parser(const pkgIndexFile *Index) : d(NULL), iIndex(Index) {}
+pkgSrcRecords::Parser::~Parser() {}