summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArch Librarian <arch@canonical.com>2004-09-20 16:53:22 +0000
committerArch Librarian <arch@canonical.com>2004-09-20 16:53:22 +0000
commit11e7af846822e893604052db7822de016fb97417 (patch)
treeb2b2e51153079aa3e88de9b6e29a61b996f78dac
parent6c9079759285e073024f7e3193c990ede2a17cef (diff)
Source record parsing
Author: jgg Date: 1999-04-04 01:17:29 GMT Source record parsing
-rw-r--r--apt-pkg/deb/debsrcrecords.cc63
-rw-r--r--apt-pkg/deb/debsrcrecords.h46
-rw-r--r--apt-pkg/makefile11
-rw-r--r--apt-pkg/srcrecords.cc139
-rw-r--r--apt-pkg/srcrecords.h67
5 files changed, 322 insertions, 4 deletions
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 <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;
+}
+ /*}}}*/
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 <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
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 <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;
+ }
+}
+ /*}}}*/
+
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 <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