]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/deb/deblistparser.cc
Fixed space parsing problem
[apt.git] / apt-pkg / deb / deblistparser.cc
index f1c1925e1d4a24f7cc552d2c821f2e679dc735b7..9adc6004408ee0ebf30dfc2ca6a9690020935a88 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: deblistparser.cc,v 1.9 1998/07/26 04:49:37 jgg Exp $
+// $Id: deblistparser.cc,v 1.18 1999/04/12 19:16:11 jgg Exp $
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
@@ -13,7 +13,7 @@
 #include <apt-pkg/deblistparser.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/configuration.h>
-#include <strutl.h>
+#include <apt-pkg/strutl.h>
 
 #include <system.h>
                                                                        /*}}}*/
 /* */
 debListParser::debListParser(FileFd &File) : Tags(File)
 {
-}
-                                                                       /*}}}*/
-// ListParser::FindTag - Find the tag and return a string              /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-string debListParser::FindTag(const char *Tag)
-{
-   const char *Start;
-   const char *Stop;
-   if (Section.Find(Tag,Start,Stop) == false)
-      return string();
-   return string(Start,Stop - Start);
-}
-                                                                       /*}}}*/
-// ListParser::FindTagI - Find the tag and return an int               /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-signed long debListParser::FindTagI(const char *Tag,signed long Default)
-{
-   const char *Start;
-   const char *Stop;
-   if (Section.Find(Tag,Start,Stop) == false)
-      return Default;
-   
-   // Copy it into a temp buffer so we can use strtol
-   char S[300];
-   if ((unsigned)(Stop - Start) >= sizeof(S))
-      return Default;
-   strncpy(S,Start,Stop-Start);
-   S[Stop - Start] = 0;
-   
-   char *End;
-   signed long Result = strtol(S,&End,10);
-   if (S == End)
-      return Default;
-   return Result;
 }
                                                                        /*}}}*/
 // ListParser::UniqFindTagWrite - Find the tag and write a unq string  /*{{{*/
@@ -73,47 +37,14 @@ unsigned long debListParser::UniqFindTagWrite(const char *Tag)
    return WriteUniqString(Start,Stop - Start);
 }
                                                                        /*}}}*/
-// ListParser::HandleFlag - Sets a flag variable based on a tag                /*{{{*/
-// ---------------------------------------------------------------------
-/* This checks the tag for true/false yes/no etc */
-bool debListParser::HandleFlag(const char *Tag,unsigned long &Flags,
-                              unsigned long Flag)
-{
-   const char *Start;
-   const char *Stop;
-   if (Section.Find(Tag,Start,Stop) == false)
-      return true;
-   
-   int Set = 2;
-   if (stringcasecmp(Start,Stop,"yes") == 0)
-      Set = 1;
-   if (stringcasecmp(Start,Stop,"true") == 0)
-      Set = 1;
-   if (stringcasecmp(Start,Stop,"no") == 0)
-      Set = 0;
-   if (stringcasecmp(Start,Stop,"false") == 0)
-      Set = 0;
-   if (Set == 2)
-   {
-      _error->Warning("Unknown flag value");
-      return true;
-   }
-   
-   if (Set == 0)
-      Flags &= ~Flag;
-   if (Set == 1)
-      Flags |= Flag;
-   return true;
-}
-                                                                       /*}}}*/
 // ListParser::Package - Return the package name                       /*{{{*/
 // ---------------------------------------------------------------------
 /* This is to return the name of the package this section describes */
 string debListParser::Package()
 {
-   string Result = FindTag("Package");
+   string Result = Section.FindS("Package");
    if (Result.empty() == true)
-      _error->Error("Encoutered a section with no Package: header");
+      _error->Error("Encountered a section with no Package: header");
    return Result;
 }
                                                                        /*}}}*/
@@ -124,7 +55,7 @@ string debListParser::Package()
    entry is assumed to only describe package properties */
 string debListParser::Version()
 {
-   return FindTag("Version");
+   return Section.FindS("Version");
 }
                                                                        /*}}}*/
 // ListParser::NewVersion - Fill in the version structure              /*{{{*/
@@ -134,12 +65,13 @@ bool debListParser::NewVersion(pkgCache::VerIterator Ver)
 {
    // Parse the section
    Ver->Section = UniqFindTagWrite("Section");
+   Ver->Arch = UniqFindTagWrite("Architecture");
    
    // Archive Size
-   Ver->Size = (unsigned)FindTagI("Size");
+   Ver->Size = (unsigned)Section.FindI("Size");
    
    // Unpacked Size (in K)
-   Ver->InstalledSize = (unsigned)FindTagI("Installed-Size");
+   Ver->InstalledSize = (unsigned)Section.FindI("Installed-Size");
    Ver->InstalledSize *= 1024;
 
    // Priority
@@ -167,7 +99,7 @@ bool debListParser::NewVersion(pkgCache::VerIterator Ver)
       return false;
    if (ParseDepends(Ver,"Conflicts",pkgCache::Dep::Conflicts) == false)
       return false;
-   if (ParseDepends(Ver,"Replaces",pkgCache::Dep::Depends) == false)
+   if (ParseDepends(Ver,"Replaces",pkgCache::Dep::Replaces) == false)
       return false;
 
    if (ParseProvides(Ver) == false)
@@ -185,10 +117,14 @@ bool debListParser::UsePackage(pkgCache::PkgIterator Pkg,
 {
    if (Pkg->Section == 0)
       Pkg->Section = UniqFindTagWrite("Section");
-   if (HandleFlag("Essential",Pkg->Flags,pkgCache::Flag::Essential) == false)
+   if (Section.FindFlag("Essential",Pkg->Flags,pkgCache::Flag::Essential) == false)
       return false;
-   if (HandleFlag("Immediate-Configure",Pkg->Flags,pkgCache::Flag::ImmediateConf) == false)
+   if (Section.FindFlag("Important",Pkg->Flags,pkgCache::Flag::Important) == false)
       return false;
+
+   if (strcmp(Pkg.Name(),"apt") == 0)
+      Pkg->Flags |= pkgCache::Flag::Important;
+   
    if (ParseStatus(Pkg,Ver) == false)
       return false;
    return true;
@@ -382,7 +318,11 @@ const char *debListParser::ParseDepends(const char *Start,const char *Stop,
       if (I == Stop || Start == I)
         return 0;     
       
-      Ver = string(Start,I-Start);
+      // Skip trailing whitespace
+      const char *End = I;
+      for (; End > Start && isspace(End[-1]); End--);
+      
+      Ver = string(Start,End-Start);
       I++;
    }
    else
@@ -512,3 +452,36 @@ bool debListParser::Step()
    return false;
 }
                                                                        /*}}}*/
+// ListParser::LoadReleaseInfo - Load the release information          /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator FileI,
+                                   FileFd &File)
+{
+   pkgTagFile Tags(File);
+   pkgTagSection Section;
+   if (Tags.Step(Section) == false)
+      return false;
+
+   const char *Start;
+   const char *Stop;
+   if (Section.Find("Archive",Start,Stop) == true)
+      FileI->Archive = WriteUniqString(Start,Stop - Start);
+   if (Section.Find("Component",Start,Stop) == true)
+      FileI->Component = WriteUniqString(Start,Stop - Start);
+   if (Section.Find("Version",Start,Stop) == true)
+      FileI->Version = WriteUniqString(Start,Stop - Start);
+   if (Section.Find("Origin",Start,Stop) == true)
+      FileI->Origin = WriteUniqString(Start,Stop - Start);
+   if (Section.Find("Label",Start,Stop) == true)
+      FileI->Label = WriteUniqString(Start,Stop - Start);
+   if (Section.Find("Architecture",Start,Stop) == true)
+      FileI->Architecture = WriteUniqString(Start,Stop - Start);
+   
+   if (Section.FindFlag("NotAutomatic",FileI->Flags,
+                       pkgCache::Flag::NotAutomatic) == false)
+      _error->Warning("Bad NotAutomatic flag");
+   
+   return !_error->PendingError();
+}
+                                                                       /*}}}*/