Source record parsing
authorArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:53:22 +0000 (16:53 +0000)
committerArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:53:22 +0000 (16:53 +0000)
Author: jgg
Date: 1999-04-04 01:17:29 GMT
Source record parsing

apt-pkg/deb/debsrcrecords.cc [new file with mode: 0644]
apt-pkg/deb/debsrcrecords.h [new file with mode: 0644]
apt-pkg/makefile
apt-pkg/srcrecords.cc [new file with mode: 0644]
apt-pkg/srcrecords.h [new file with mode: 0644]

diff --git a/apt-pkg/deb/debsrcrecords.cc b/apt-pkg/deb/debsrcrecords.cc
new file mode 100644 (file)
index 0000000..bfbb9e2
--- /dev/null
@@ -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 (file)
index 0000000..5d3b204
--- /dev/null
@@ -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
index e135c8e..12d5d71 100644 (file)
@@ -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 (file)
index 0000000..05be79a
--- /dev/null
@@ -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 (file)
index 0000000..bd39b93
--- /dev/null
@@ -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