Browse Source

Source record parsing

Author: jgg
Date: 1999-04-04 01:17:29 GMT
Source record parsing
debian/1.8.y
Arch Librarian 18 years ago
parent
commit
11e7af8468
  1. 63
      apt-pkg/deb/debsrcrecords.cc
  2. 46
      apt-pkg/deb/debsrcrecords.h
  3. 11
      apt-pkg/makefile
  4. 139
      apt-pkg/srcrecords.cc
  5. 67
      apt-pkg/srcrecords.h

63
apt-pkg/deb/debsrcrecords.cc

@ -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;
}
/*}}}*/

46
apt-pkg/deb/debsrcrecords.h

@ -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

11
apt-pkg/makefile

@ -12,7 +12,7 @@ include ../buildlib/defaults.mak
# The library name
LIBRARY=apt-pkg
MAJOR=2.2
MINOR=0
MINOR=1
SLIBS=$(PTHREADLIB)
# Source code for the contributed non-core things
@ -24,10 +24,12 @@ SOURCE = contrib/mmap.cc contrib/error.cc contrib/strutl.cc \
SOURCE+= pkgcache.cc version.cc fileutl.cc pkgcachegen.cc depcache.cc \
orderlist.cc tagfile.cc sourcelist.cc packagemanager.cc \
pkgrecords.cc algorithms.cc acquire.cc acquire-item.cc \
acquire-worker.cc acquire-method.cc init.cc clean.cc templates.cc
acquire-worker.cc acquire-method.cc init.cc clean.cc templates.cc \
srcrecords.cc
# Source code for the debian specific components
SOURCE+= deb/deblistparser.cc deb/debrecords.cc deb/dpkgpm.cc deb/dpkginit.cc
SOURCE+= deb/deblistparser.cc deb/debrecords.cc deb/dpkgpm.cc deb/dpkginit.cc \
deb/debsrcrecords.cc
# Public apt-pkg header files
HEADERS = algorithms.h depcache.h mmap.h pkgcachegen.h cacheiterators.h \
@ -35,7 +37,8 @@ HEADERS = algorithms.h depcache.h mmap.h pkgcachegen.h cacheiterators.h \
packagemanager.h tagfile.h deblistparser.h init.h pkgcache.h \
version.h progress.h pkgrecords.h debrecords.h cmndline.h \
acquire.h acquire-worker.h acquire-item.h acquire-method.h md5.h \
dpkgpm.h dpkginit.h cdromutl.h strutl.h clean.h
dpkgpm.h dpkginit.h cdromutl.h strutl.h clean.h srcrecords.h \
debsrcrecords.h
HEADERS := $(addprefix apt-pkg/,$(HEADERS))

139
apt-pkg/srcrecords.cc

@ -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;
}
}
/*}}}*/

67
apt-pkg/srcrecords.h

@ -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…
Cancel
Save