]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/deb/deblistparser.cc
* FindInCache() uses the correct file now
[apt.git] / apt-pkg / deb / deblistparser.cc
index 267636776ac609cc56793daad7a57b2227639572..6e78ed42b80b71950d7fe0bdd7c6683f5ccb89fc 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: deblistparser.cc,v 1.25 2001/05/27 05:36:04 jgg Exp $
+// $Id: deblistparser.cc,v 1.29.2.5 2004/01/06 01:43:44 mdz Exp $
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
@@ -15,6 +15,7 @@
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/crc-16.h>
+#include <apt-pkg/md5.h>
 
 #include <ctype.h>
 
@@ -117,6 +118,46 @@ bool debListParser::NewVersion(pkgCache::VerIterator Ver)
    return true;
 }
                                                                        /*}}}*/
+// ListParser::Description - Return the description string             /*{{{*/
+// ---------------------------------------------------------------------
+/* This is to return the string describing the package in debian
+   form. If this returns the blank string then the entry is assumed to
+   only describe package properties */
+string debListParser::Description()
+{
+   if (DescriptionLanguage().empty())
+      return Section.FindS("Description");
+   else
+      return Section.FindS(("Description-" + pkgIndexFile::LanguageCode()).c_str());
+}
+                                                                        /*}}}*/
+// ListParser::DescriptionLanguage - Return the description lang string        /*{{{*/
+// ---------------------------------------------------------------------
+/* This is to return the string describing the language of
+   description. If this returns the blank string then the entry is
+   assumed to describe original description. */
+string debListParser::DescriptionLanguage()
+{
+   return Section.FindS("Description").empty() ? pkgIndexFile::LanguageCode() : "";
+}
+                                                                        /*}}}*/
+// ListParser::Description - Return the description_md5 MD5SumValue    /*{{{*/
+// ---------------------------------------------------------------------
+/* This is to return the md5 string to allow the check if is the right
+   description. If thisreturns a blank string then calculate the md5
+   value. */
+MD5SumValue debListParser::Description_md5()
+{
+   string value = Section.FindS("Description-md5");
+
+   if (value.empty()) {
+      MD5Summation md5;
+      md5.Add((Description() + "\n").c_str());
+      return md5.Result();
+   } else
+      return MD5SumValue(value);
+}
+                                                                        /*}}}*/
 // ListParser::UsePackage - Update a package structure                 /*{{{*/
 // ---------------------------------------------------------------------
 /* This is called to update the package with any new information 
@@ -152,7 +193,7 @@ unsigned short debListParser::VersionHash()
                             "Conflicts",
                             "Replaces",0};
    unsigned long Result = INIT_FCS;
-   char S[300];
+   char S[1024];
    for (const char **I = Sections; *I != 0; I++)
    {
       const char *Start;
@@ -173,7 +214,7 @@ unsigned short debListParser::VersionHash()
         if (*Start == '>' && Start[1] != '>' && Start[1] != '=')
            *I++ = '=';
       }
-      
+
       Result = AddCRC16(Result,S,I - S);
    }
    
@@ -268,11 +309,7 @@ bool debListParser::ParseStatus(pkgCache::PkgIterator Pkg,
    
    return true;
 }
-                                                                       /*}}}*/
-// ListParser::ParseDepends - Parse a dependency element               /*{{{*/
-// ---------------------------------------------------------------------
-/* This parses the dependency elements out of a standard string in place,
-   bit by bit. */
+
 const char *debListParser::ConvertRelation(const char *I,unsigned int &Op)
 {
    // Determine the operator
@@ -331,6 +368,11 @@ const char *debListParser::ConvertRelation(const char *I,unsigned int &Op)
    return I;
 }
 
+                                                                       /*}}}*/
+// ListParser::ParseDepends - Parse a dependency element               /*{{{*/
+// ---------------------------------------------------------------------
+/* This parses the dependency elements out of a standard string in place,
+   bit by bit. */
 const char *debListParser::ParseDepends(const char *Start,const char *Stop,
                                        string &Package,string &Ver,
                                        unsigned int &Op, bool ParseArchFlags)
@@ -391,7 +433,7 @@ const char *debListParser::ParseDepends(const char *Start,const char *Stop,
    if (ParseArchFlags == true)
    {
       string arch = _config->Find("APT::Architecture");
-      
+
       // Parse an architecture
       if (I != Stop && *I == '[')
       {
@@ -402,6 +444,7 @@ const char *debListParser::ParseDepends(const char *Start,const char *Stop,
         
          const char *End = I;
          bool Found = false;
+        bool NegArch = false;
          while (I != Stop) 
         {
             // look for whitespace or ending ']'
@@ -410,8 +453,14 @@ const char *debListParser::ParseDepends(const char *Start,const char *Stop,
         
            if (End == Stop) 
               return 0;
-           
-           if (stringcmp(arch.c_str(),arch.c_str()+arch.length(),I,End) == 0)
+
+           if (*I == '!')
+            {
+              NegArch = true;
+              I++;
+            }
+
+           if (stringcmp(arch,I,End) == 0)
               Found = true;
            
            if (*End++ == ']') {
@@ -422,8 +471,11 @@ const char *debListParser::ParseDepends(const char *Start,const char *Stop,
            I = End;
            for (;I != Stop && isspace(*I) != 0; I++);
          }
+
+        if (NegArch)
+           Found = !Found;
         
-         if (Found == false) 
+         if (Found == false)
            Package = ""; /* not for this arch */
       }
       
@@ -538,7 +590,7 @@ bool debListParser::Step()
       if (Section.Find("Architecture",Start,Stop) == false)
         return true;
 
-      if (stringcmp(Arch.c_str(),Arch.c_str()+Arch.length(),Start,Stop) == 0)
+      if (stringcmp(Arch,Start,Stop) == 0)
         return true;
 
       if (stringcmp(Start,Stop,"all") == 0)
@@ -555,14 +607,14 @@ bool debListParser::Step()
 bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator FileI,
                                    FileFd &File)
 {
-   pkgTagFile Tags(&File);
+   pkgTagFile Tags(&File, File.Size() + 256); // XXX
    pkgTagSection Section;
    if (Tags.Step(Section) == false)
       return false;
 
    const char *Start;
    const char *Stop;
-   if (Section.Find("Archive",Start,Stop) == true)
+   if (Section.Find("Suite",Start,Stop) == true)
       FileI->Archive = WriteUniqString(Start,Stop - Start);
    if (Section.Find("Component",Start,Stop) == true)
       FileI->Component = WriteUniqString(Start,Stop - Start);