]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/pkgcachegen.cc
Compile of apt-cache
[apt.git] / apt-pkg / pkgcachegen.cc
index d3d5d1547af24d216e0db5e53ce85367becdd76b..e0f8f3a197c6ffbbae51193da2f283170656c749 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: pkgcachegen.cc,v 1.3 1998/07/04 22:32:13 jgg Exp $
+// $Id: pkgcachegen.cc,v 1.9 1998/07/12 23:58:34 jgg Exp $
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
-#include <pkglib/pkgcachegen.h>
-#include <pkglib/error.h>
-#include <pkglib/version.h>
+#ifdef __GNUG__
+#pragma implementation "apt-pkg/pkgcachegen.h"
+#endif
+
+#include <apt-pkg/pkgcachegen.h>
+#include <apt-pkg/error.h>
+#include <apt-pkg/version.h>
+#include <strutl.h>
 
 #include <sys/stat.h>
 #include <unistd.h>
@@ -62,14 +67,12 @@ bool pkgCacheGenerator::MergeList(ListParser &List)
    while (List.Step() == true)
    {
       // Get a pointer to the package structure
-      string Package = List.Package();
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(Package);
+      string PackageName = List.Package();
+      pkgCache::PkgIterator Pkg;
+      Cache.FindPkg(PackageName);
       if (Pkg.end() == true)
       {
-        if (NewPackage(Pkg,Package) == false)
-           return false;
-
-        if (List.NewPackage(Pkg) == false)
+        if (NewPackage(Pkg,PackageName) == false)
            return false;
       }
       
@@ -86,7 +89,7 @@ bool pkgCacheGenerator::MergeList(ListParser &List)
 
       pkgCache::VerIterator Ver = Pkg.VersionList();
       unsigned long *Last = &Pkg->VersionList;
-      int Res;
+      int Res = 1;
       for (; Ver.end() == false; Last = &Ver->NextVer, Ver++)
       {
         Res = pkgVersionCompare(Version.begin(),Version.end(),Ver.VerStr(),
@@ -156,6 +159,18 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,string Name)
 bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver,
                                   ListParser &List)
 {
+   // Get a structure
+   unsigned long VerFile = Map.Allocate(sizeof(pkgCache::VerFile));
+   if (VerFile == 0)
+      return 0;
+   
+   pkgCache::VerFileIterator VF(Cache,Cache.VerFileP + VerFile);
+   VF->File = CurrentFile - Cache.PkgFileP;
+   VF->NextFile = Ver->FileList;
+   Ver->FileList = VF.Index();
+   VF->Offset = List.Offset();
+   VF->Size = List.Size();
+      
    return true;
 }
                                                                        /*}}}*/
@@ -173,7 +188,6 @@ unsigned long pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver,
    
    // Fill it in
    Ver = pkgCache::VerIterator(Cache,Cache.VerP + Version);
-   Ver->File = CurrentFile - Cache.PkgFileP;
    Ver->NextVer = Next;
    Ver->ID = Cache.HeaderP->VersionCount++;
    Ver->VerStr = Map.WriteString(VerStr);
@@ -183,6 +197,98 @@ unsigned long pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver,
    return Version;
 }
                                                                        /*}}}*/
+// ListParser::NewDepends - Create a dependency element                        /*{{{*/
+// ---------------------------------------------------------------------
+/* This creates a dependency element in the tree. It is linked to the
+   version and to the package that it is pointing to. */
+bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver,
+                                              string PackageName,
+                                              string Version,
+                                              unsigned int Op,
+                                              unsigned int Type)
+{
+   pkgCache &Cache = Owner->Cache;
+   
+   // Get a structure
+   unsigned long Dependency = Owner->Map.Allocate(sizeof(pkgCache::Dependency));
+   if (Dependency == 0)
+      return false;
+   
+   // Fill it in
+   pkgCache::DepIterator Dep(Cache,Cache.DepP + Dependency);
+   Dep->ParentVer = Ver.Index();
+   Dep->Type = Type;
+   Dep->CompareOp = Op;
+   Dep->ID = Cache.HeaderP->DependsCount++;
+   
+   // Locate the target package
+   pkgCache::PkgIterator Pkg = Cache.FindPkg(PackageName);
+   if (Pkg.end() == true)
+      if (Owner->NewPackage(Pkg,PackageName) == false)
+        return false;
+   
+   // Probe the reverse dependency list for a version string that matches
+   if (Version.empty() == false)
+   {
+      for (pkgCache::DepIterator I = Pkg.RevDependsList(); I.end() == false; I++)
+        if (I->Version != 0 && I.TargetVer() == Version)
+           Dep->Version = I->Version;
+      if (Dep->Version == 0)
+        if ((Dep->Version = WriteString(Version)) == 0)
+           return false;
+   }
+   
+   // Link it to the package
+   Dep->Package = Pkg.Index();
+   Dep->NextRevDepends = Pkg->RevDepends;
+   Pkg->RevDepends = Dep.Index();
+   
+   // Link it to the version (at the end of the list)
+   unsigned long *Last = &Ver->DependsList;
+   for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++)
+      Last = &D->NextDepends;
+   Dep->NextDepends = *Last;
+   *Last = Dep.Index();
+   
+   return true;
+}
+                                                                       /*}}}*/
+// ListParser::NewProvides - Create a Provides element                 /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator Ver,
+                                              string PackageName,
+                                               string Version)
+{
+   pkgCache &Cache = Owner->Cache;
+   
+   // Get a structure
+   unsigned long Provides = Owner->Map.Allocate(sizeof(pkgCache::Provides));
+   if (Provides == 0)
+      return false;
+   
+   // Fill it in
+   pkgCache::PrvIterator Prv(Cache,Cache.ProvideP + Provides,Cache.PkgP);
+   Prv->Version = Ver.Index();
+   Prv->NextPkgProv = Ver->ProvidesList;
+   Ver->ProvidesList = Prv.Index();
+   if (Version.empty() == false && (Prv->Version = WriteString(Version)) == 0)
+      return false;
+   
+   // Locate the target package
+   pkgCache::PkgIterator Pkg = Cache.FindPkg(PackageName);
+   if (Pkg.end() == true)
+      if (Owner->NewPackage(Pkg,PackageName) == false)
+        return false;
+   
+   // Link it to the package
+   Prv->ParentPkg = Pkg.Index();
+   Prv->NextProvides = Pkg->ProvidesList;
+   Pkg->ProvidesList = Prv.Index();
+   
+   return true;
+}
+                                                                       /*}}}*/
 // CacheGenerator::SelectFile - Select the current file being parsed   /*{{{*/
 // ---------------------------------------------------------------------
 /* This is used to select which file is to be associated with all newly
@@ -224,9 +330,7 @@ unsigned long pkgCacheGenerator::WriteUniqString(const char *S,
    for (; I != Cache.StringItemP; Last = &I->NextItem, 
         I = Cache.StringItemP + I->NextItem)
    {
-      Res = strncmp(Cache.StrP + I->String,S,Size);
-      if (Res == 0 && *(Cache.StrP + I->String + Size) != 0)
-        Res = 1;
+      Res = stringcmp(S,S+Size,Cache.StrP + I->String);
       if (Res >= 0)
         break;
    }