// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: pkgcachegen.cc,v 1.4 1998/07/05 05:33:56 jgg Exp $
+// $Id: pkgcachegen.cc,v 1.11 1998/07/19 04:22:02 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>
while (List.Step() == true)
{
// Get a pointer to the package structure
- string Package = List.Package();
- pkgCache::PkgIterator Pkg = Cache.FindPkg(Package);
- if (Pkg.end() == true)
- {
- if (NewPackage(Pkg,Package) == false)
- return false;
- }
+ string PackageName = List.Package();
+ pkgCache::PkgIterator Pkg;
+ if (NewPackage(Pkg,PackageName) == false)
+ return false;
/* Get a pointer to the version structure. We know the list is sorted
so we use that fact in the search. Insertion of new versions is
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(),
/* This creates a new package structure and adds it to the hash table */
bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,string Name)
{
+ Pkg = Cache.FindPkg(Name);
+ if (Pkg.end() == false)
+ return true;
+
// Get a structure
unsigned long Package = Map.Allocate(sizeof(pkgCache::Package));
if (Package == 0)
Ver->FileList = VF.Index();
VF->Offset = List.Offset();
VF->Size = List.Size();
-
+ if (Cache.HeaderP->MaxVerFileSize < VF->Size)
+ Cache.HeaderP->MaxVerFileSize = VF->Size;
return true;
}
/*}}}*/
/* 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 Package,string Version,
+ string PackageName,
+ string Version,
unsigned int Op,
unsigned int Type)
{
Dep->ID = Cache.HeaderP->DependsCount++;
// Locate the target package
- pkgCache::PkgIterator Pkg = Cache.FindPkg(Package);
- if (Pkg.end() == true)
- if (Owner->NewPackage(Pkg,Package) == false)
- return false;
+ pkgCache::PkgIterator Pkg;
+ if (Owner->NewPackage(Pkg,PackageName) == false)
+ return false;
// Probe the reverse dependency list for a version string that matches
if (Version.empty() == false)
// ---------------------------------------------------------------------
/* */
bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator Ver,
- string Package,string Version)
+ string PackageName,
+ string Version)
{
pkgCache &Cache = Owner->Cache;
+
+ // We do not add self referencing provides
+ if (Ver.ParentPkg().Name() == PackageName)
+ return true;
// Get a structure
unsigned long Provides = Owner->Map.Allocate(sizeof(pkgCache::Provides));
return false;
// Locate the target package
- pkgCache::PkgIterator Pkg = Cache.FindPkg(Package);
- if (Pkg.end() == true)
- if (Owner->NewPackage(Pkg,Package) == false)
- return false;
+ pkgCache::PkgIterator Pkg;
+ if (Owner->NewPackage(Pkg,PackageName) == false)
+ return false;
// Link it to the package
Prv->ParentPkg = Pkg.Index();
CurrentFile->NextFile = Cache.HeaderP->FileList;
CurrentFile->Flags = Flags;
PkgFileName = File;
-
+ Cache.HeaderP->FileList = CurrentFile - Cache.PkgFileP;
+
if (CurrentFile->FileName == 0)
return false;
+ return true;
}
/*}}}*/
// CacheGenerator::WriteUniqueString - Insert a unique string /*{{{*/
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;
}