1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
/* ######################################################################
Source Package Records - Allows access to source package records
Parses and allows access to the list of source records and searching by
source name on that list.
##################################################################### */
/*}}}*/
// Include Files /*{{{*/
#include <config.h>
#include <apt-pkg/debsrcrecords.h>
#include <apt-pkg/error.h>
#include <apt-pkg/indexfile.h>
#include <apt-pkg/macros.h>
#include <apt-pkg/metaindex.h>
#include <apt-pkg/sourcelist.h>
#include <apt-pkg/srcrecords.h>
#include <cstring>
#include <string>
#include <vector>
#include <apti18n.h>
/*}}}*/
// SrcRecords::pkgSrcRecords - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* Open all the source index files */
pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : d(NULL), Files(0)
{
for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); ++I)
{
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);
}
}
// Doesn't work without any source index files
if (Files.empty() == true)
{
_error->Error(_("You must put some 'deb-src' URIs"
" in your sources.list"));
return;
}
Restart();
}
/*}}}*/
// SrcRecords::~pkgSrcRecords - Destructor /*{{{*/
// ---------------------------------------------------------------------
/* */
pkgSrcRecords::~pkgSrcRecords()
{
// Blow away all the parser objects
for(std::vector<Parser*>::iterator I = Files.begin(); I != Files.end(); ++I)
delete *I;
}
/*}}}*/
// SrcRecords::Restart - Restart the search /*{{{*/
// ---------------------------------------------------------------------
/* Return all of the parsers to their starting position */
bool pkgSrcRecords::Restart()
{
Current = Files.begin();
for (std::vector<Parser*>::iterator I = Files.begin();
I != Files.end(); ++I)
if ((*I)->Offset() != 0)
(*I)->Restart();
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 */
pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool const &SrcOnly)
{
while (true)
{
if(Step() == 0)
return 0;
// Source name hit
if ((*Current)->Package() == Package)
return *Current;
if (SrcOnly == true)
continue;
// Check for a binary hit
const char **I = (*Current)->Binaries();
for (; I != 0 && *I != 0; ++I)
if (strcmp(Package,*I) == 0)
return *Current;
}
}
/*}}}*/
// Parser::BuildDepType - Convert a build dep to a string /*{{{*/
// ---------------------------------------------------------------------
/* */
const char *pkgSrcRecords::Parser::BuildDepType(unsigned char const &Type)
{
const char *fields[] = {"Build-Depends",
"Build-Depends-Indep",
"Build-Conflicts",
"Build-Conflicts-Indep",
"Build-Depends-Arch",
"Build-Conflicts-Arch"};
if (unlikely(Type >= sizeof(fields)/sizeof(fields[0])))
return "";
return fields[Type];
}
/*}}}*/
pkgSrcRecords::Parser::Parser(const pkgIndexFile *Index) : d(NULL), iIndex(Index) {}
pkgSrcRecords::Parser::~Parser() {}
|