X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/0e72dd523557b84a3b37988d23d99eae1d79a657..864a3375f7bf0b3772f4f2ae212b802f6cab5ff9:/apt-pkg/srcrecords.cc?ds=sidebyside diff --git a/apt-pkg/srcrecords.cc b/apt-pkg/srcrecords.cc index f8133802e..775cf2e5f 100644 --- a/apt-pkg/srcrecords.cc +++ b/apt-pkg/srcrecords.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: srcrecords.cc,v 1.5 2001/02/23 06:41:55 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 @@ -11,41 +11,45 @@ ##################################################################### */ /*}}}*/ // Include Files /*{{{*/ -#ifdef __GNUG__ -#pragma implementation "apt-pkg/srcrecords.h" -#endif +#include #include #include #include -#include - -#include +#include +#include +#include + +#include +#include +#include + +#include /*}}}*/ // 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), Current(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 *Indexes = (*I)->GetIndexFiles(); + for (std::vector::const_iterator J = Indexes->begin(); + J != Indexes->end(); ++J) + { + Parser* P = (*J)->CreateSrcParser(); + if (_error->PendingError() == true) + return; + if (P != 0) + Files.push_back(P); + } } - Files[Count] = 0; // Doesn't work without any source index files - if (Count == 0) + 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; } @@ -58,13 +62,9 @@ pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : Files(0), Current(0) /* */ pkgSrcRecords::~pkgSrcRecords() { - if (Files == 0) - return; - // Blow away all the parser objects - for (unsigned int Count = 0; Files[Count] != 0; Count++) - delete Files[Count]; - delete [] Files; + for(std::vector::iterator I = Files.begin(); I != Files.end(); ++I) + delete *I; } /*}}}*/ // SrcRecords::Restart - Restart the search /*{{{*/ @@ -72,10 +72,12 @@ pkgSrcRecords::~pkgSrcRecords() /* 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::iterator I = Files.begin(); + I != Files.end(); ++I) + if ((*I)->Offset() != 0) + (*I)->Restart(); + return true; } /*}}}*/ @@ -84,9 +86,9 @@ bool pkgSrcRecords::Restart() /* 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) + if (Current == Files.end()) return 0; while (true) @@ -96,8 +98,8 @@ pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool SrcOnly) { if (_error->PendingError() == true) return 0; - Current++; - if (*Current == 0) + ++Current; + if (Current == Files.end()) return 0; } @@ -114,7 +116,7 @@ pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool SrcOnly) // 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; } @@ -123,16 +125,15 @@ pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool SrcOnly) // 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"}; - if (Type < 4) - return fields[Type]; - else + if (unlikely(Type >= sizeof(fields)/sizeof(fields[0]))) return ""; + return fields[Type]; } /*}}}*/