
5 changed files with 322 additions and 4 deletions
@ -0,0 +1,63 @@ |
|||
// -*- mode: cpp; mode: fold -*-
|
|||
// Description /*{{{*/
|
|||
// $Id: debsrcrecords.cc,v 1.1 1999/04/04 01:17:29 jgg Exp $
|
|||
/* ######################################################################
|
|||
|
|||
Debian Source Package Records - Parser implementation for Debian style |
|||
source indexes |
|||
|
|||
##################################################################### */ |
|||
/*}}}*/ |
|||
// Include Files /*{{{*/
|
|||
#ifdef __GNUG__ |
|||
#pragma implementation "apt-pkg/debsrcrecords.h" |
|||
#endif |
|||
|
|||
#include <apt-pkg/debsrcrecords.h> |
|||
#include <apt-pkg/error.h> |
|||
/*}}}*/ |
|||
|
|||
// SrcRecordParser::Binaries - Return the binaries field /*{{{*/
|
|||
// ---------------------------------------------------------------------
|
|||
/* This member parses the binaries field into a pair of class arrays and
|
|||
returns a list of strings representing all of the components of the |
|||
binaries field. The returned array need not be freed and will be |
|||
reused by the next Binaries function call. */ |
|||
const char **debSrcRecordParser::Binaries() |
|||
{ |
|||
string Bins = Sect.FindS("Binary"); |
|||
char *Buf = Buffer; |
|||
unsigned int Bin = 0; |
|||
if (Bins.empty() == true) |
|||
return 0; |
|||
|
|||
// Strip any leading spaces
|
|||
string::const_iterator Start = Bins.begin(); |
|||
for (; Start != Bins.end() && isspace(*Start) != 0; Start++); |
|||
|
|||
string::const_iterator Pos = Start; |
|||
while (Pos != Bins.end()) |
|||
{ |
|||
// Skip to the next ','
|
|||
for (; Pos != Bins.end() && *Pos != ','; Pos++); |
|||
|
|||
// Back remove spaces
|
|||
string::const_iterator End = Pos; |
|||
for (; End > Start && (End[-1] == ',' || isspace(End[-1]) != 0); End--); |
|||
|
|||
// Stash the string
|
|||
memcpy(Buf,Start,End-Start); |
|||
StaticBinList[Bin] = Buf; |
|||
Bin++; |
|||
Buf += End-Start; |
|||
*Buf++ = 0; |
|||
|
|||
// Advance pos
|
|||
for (; Pos != Bins.end() && (*Pos == ',' || isspace(*Pos) != 0); Pos++); |
|||
Start = Pos; |
|||
} |
|||
|
|||
StaticBinList[Bin] = 0; |
|||
return StaticBinList; |
|||
} |
|||
/*}}}*/ |
@ -0,0 +1,46 @@ |
|||
// -*- mode: cpp; mode: fold -*-
|
|||
// Description /*{{{*/
|
|||
// $Id: debsrcrecords.h,v 1.1 1999/04/04 01:17:29 jgg Exp $
|
|||
/* ######################################################################
|
|||
|
|||
Debian Source Package Records - Parser implementation for Debian style |
|||
source indexes |
|||
|
|||
##################################################################### */ |
|||
/*}}}*/ |
|||
#ifndef PKGLIB_DEBSRCRECORDS_H |
|||
#define PKGLIB_DEBSRCRECORDS_H |
|||
|
|||
#ifdef __GNUG__ |
|||
#pragma interface "apt-pkg/debsrcrecords.h" |
|||
#endif |
|||
|
|||
#include <apt-pkg/srcrecords.h> |
|||
#include <apt-pkg/tagfile.h> |
|||
|
|||
class debSrcRecordParser : public pkgSrcRecords::Parser |
|||
{ |
|||
pkgTagFile Tags; |
|||
pkgTagSection Sect; |
|||
char Buffer[10000]; |
|||
const char *StaticBinList[400]; |
|||
unsigned long iOffset; |
|||
|
|||
public: |
|||
|
|||
virtual bool Restart() {return Tags.Jump(Sect,0);}; |
|||
virtual bool Step() {iOffset = Tags.Offset(); return Tags.Step(Sect);}; |
|||
virtual bool Jump(unsigned long Off) {iOffset = Off; return Tags.Jump(Sect,Off);}; |
|||
|
|||
virtual string Package() {return Sect.FindS("Package");}; |
|||
virtual string Version() {return Sect.FindS("Version");}; |
|||
virtual string Maintainer() {return Sect.FindS("Maintainer");}; |
|||
virtual string Section() {return Sect.FindS("Section");}; |
|||
virtual const char **Binaries(); |
|||
virtual unsigned long Offset() {return iOffset;}; |
|||
|
|||
debSrcRecordParser(FileFd *File) : Parser(File), |
|||
Tags(*File,sizeof(Buffer)) {}; |
|||
}; |
|||
|
|||
#endif |
@ -0,0 +1,139 @@ |
|||
// -*- mode: cpp; mode: fold -*-
|
|||
// Description /*{{{*/
|
|||
// $Id: srcrecords.cc,v 1.1 1999/04/04 01:17:29 jgg Exp $
|
|||
/* ######################################################################
|
|||
|
|||
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 /*{{{*/
|
|||
#ifdef __GNUG__ |
|||
#pragma implementation "apt-pkg/srcrecords.h" |
|||
#endif |
|||
|
|||
#include <apt-pkg/srcrecords.h> |
|||
#include <apt-pkg/error.h> |
|||
#include <apt-pkg/configuration.h> |
|||
#include <apt-pkg/strutl.h> |
|||
#include <apt-pkg/debsrcrecords.h> |
|||
/*}}}*/ |
|||
|
|||
// SrcRecords::pkgSrcRecords - Constructor /*{{{*/
|
|||
// ---------------------------------------------------------------------
|
|||
/* Open all the source index files */ |
|||
pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : Files(0), Current(0) |
|||
{ |
|||
pkgSourceList::const_iterator I = List.begin(); |
|||
|
|||
// Count how many items we will need
|
|||
unsigned int Count = 0; |
|||
for (; I != List.end(); I++) |
|||
if (I->Type == pkgSourceList::Item::DebSrc) |
|||
Count++; |
|||
|
|||
// Doesnt work without any source index files
|
|||
if (Count == 0) |
|||
{ |
|||
_error->Error("Sorry, you must put some 'source' uris" |
|||
" in your sources.list"); |
|||
return; |
|||
} |
|||
|
|||
Files = new Parser *[Count+1]; |
|||
memset(Files,0,sizeof(*Files)*(Count+1)); |
|||
|
|||
// Create the parser objects
|
|||
Count = 0; |
|||
string Dir = _config->FindDir("Dir::State::lists"); |
|||
for (I = List.begin(); I != List.end(); I++) |
|||
{ |
|||
if (I->Type != pkgSourceList::Item::DebSrc) |
|||
continue; |
|||
|
|||
// Open the file
|
|||
FileFd *FD = new FileFd(Dir + URItoFileName(I->PackagesURI()), |
|||
FileFd::ReadOnly); |
|||
if (_error->PendingError() == true) |
|||
{ |
|||
delete FD; |
|||
return; |
|||
} |
|||
|
|||
Files[Count] = new debSrcRecordParser(FD); |
|||
Count++; |
|||
} |
|||
|
|||
Restart(); |
|||
} |
|||
/*}}}*/ |
|||
// SrcRecords::~pkgSrcRecords - Destructor /*{{{*/
|
|||
// ---------------------------------------------------------------------
|
|||
/* */ |
|||
pkgSrcRecords::~pkgSrcRecords() |
|||
{ |
|||
if (Files == 0) |
|||
return; |
|||
|
|||
// Blow away all the parser objects
|
|||
for (unsigned int Count = 0; Files[Count] != 0; Count++) |
|||
delete Files[Count]; |
|||
} |
|||
/*}}}*/ |
|||
// SrcRecords::Restart - Restart the search /*{{{*/
|
|||
// ---------------------------------------------------------------------
|
|||
/* Return all of the parsers to their starting position */ |
|||
bool pkgSrcRecords::Restart() |
|||
{ |
|||
Current = Files; |
|||
for (Parser **I = Files; *I != 0; I++) |
|||
if ((*I)->Restart() == false) |
|||
return false; |
|||
return true; |
|||
} |
|||
/*}}}*/ |
|||
// 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) |
|||
{ |
|||
if (*Current == 0) |
|||
return 0; |
|||
|
|||
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; |
|||
|
|||
// 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; |
|||
} |
|||
} |
|||
/*}}}*/ |
|||
|
@ -0,0 +1,67 @@ |
|||
// -*- mode: cpp; mode: fold -*-
|
|||
// Description /*{{{*/
|
|||
// $Id: srcrecords.h,v 1.1 1999/04/04 01:17:29 jgg Exp $
|
|||
/* ######################################################################
|
|||
|
|||
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. |
|||
|
|||
##################################################################### */ |
|||
/*}}}*/ |
|||
#ifndef PKGLIB_SRCRECORDS_H |
|||
#define PKGLIB_SRCRECORDS_H |
|||
|
|||
#ifdef __GNUG__ |
|||
#pragma interface "apt-pkg/srcrecords.h" |
|||
#endif |
|||
|
|||
#include <apt-pkg/fileutl.h> |
|||
#include <apt-pkg/sourcelist.h> |
|||
|
|||
class pkgSrcRecords |
|||
{ |
|||
public: |
|||
|
|||
class Parser |
|||
{ |
|||
FileFd *File; |
|||
|
|||
public: |
|||
|
|||
virtual bool Restart() = 0; |
|||
virtual bool Step() = 0; |
|||
virtual bool Jump(unsigned long Off) = 0; |
|||
virtual unsigned long Offset() = 0; |
|||
|
|||
virtual string Package() = 0; |
|||
virtual string Version() = 0; |
|||
virtual string Maintainer() = 0; |
|||
virtual string Section() = 0; |
|||
virtual const char **Binaries() = 0; |
|||
|
|||
Parser(FileFd *File) : File(File) {}; |
|||
virtual ~Parser() {delete File;}; |
|||
}; |
|||
|
|||
private: |
|||
|
|||
// The list of files and the current parser pointer
|
|||
Parser **Files; |
|||
Parser **Current; |
|||
|
|||
public: |
|||
|
|||
// Reset the search
|
|||
bool Restart(); |
|||
|
|||
// Locate a package by name
|
|||
Parser *Find(const char *Package,bool SrcOnly = false); |
|||
|
|||
pkgSrcRecords(pkgSourceList &List); |
|||
~pkgSrcRecords(); |
|||
}; |
|||
|
|||
|
|||
#endif |
Loading…
Reference in new issue