From 11e7af846822e893604052db7822de016fb97417 Mon Sep 17 00:00:00 2001 From: Arch Librarian Date: Mon, 20 Sep 2004 16:53:22 +0000 Subject: Source record parsing Author: jgg Date: 1999-04-04 01:17:29 GMT Source record parsing --- apt-pkg/deb/debsrcrecords.cc | 63 ++++++++++++++++++++ apt-pkg/deb/debsrcrecords.h | 46 ++++++++++++++ apt-pkg/makefile | 11 ++-- apt-pkg/srcrecords.cc | 139 +++++++++++++++++++++++++++++++++++++++++++ apt-pkg/srcrecords.h | 67 +++++++++++++++++++++ 5 files changed, 322 insertions(+), 4 deletions(-) create mode 100644 apt-pkg/deb/debsrcrecords.cc create mode 100644 apt-pkg/deb/debsrcrecords.h create mode 100644 apt-pkg/srcrecords.cc create mode 100644 apt-pkg/srcrecords.h diff --git a/apt-pkg/deb/debsrcrecords.cc b/apt-pkg/deb/debsrcrecords.cc new file mode 100644 index 000000000..bfbb9e202 --- /dev/null +++ b/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 +#include + /*}}}*/ + +// 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; +} + /*}}}*/ diff --git a/apt-pkg/deb/debsrcrecords.h b/apt-pkg/deb/debsrcrecords.h new file mode 100644 index 000000000..5d3b20488 --- /dev/null +++ b/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 +#include + +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 diff --git a/apt-pkg/makefile b/apt-pkg/makefile index e135c8ee9..12d5d7115 100644 --- a/apt-pkg/makefile +++ b/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)) diff --git a/apt-pkg/srcrecords.cc b/apt-pkg/srcrecords.cc new file mode 100644 index 000000000..05be79a5a --- /dev/null +++ b/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 +#include +#include +#include +#include + /*}}}*/ + +// 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; + } +} + /*}}}*/ + diff --git a/apt-pkg/srcrecords.h b/apt-pkg/srcrecords.h new file mode 100644 index 000000000..bd39b93bb --- /dev/null +++ b/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 +#include + +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 -- cgit v1.2.3