]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/configuration.cc
* updated with mainline
[apt.git] / apt-pkg / contrib / configuration.cc
index e6ea2a0efd6b8f037028e020f141c2d072f1b05a..09e454be903edf217dbb3ceb1caebf69e922667d 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: configuration.cc,v 1.27 2003/07/26 00:27:36 mdz Exp $
+// $Id: configuration.cc,v 1.28 2004/04/30 04:00:15 mdz Exp $
 /* ######################################################################
 
    Configuration Class
@@ -325,6 +325,47 @@ void Configuration::Set(const char *Name,int Value)
    char S[300];
    snprintf(S,sizeof(S),"%i",Value);
    Itm->Value = S;
+}
+                                                                       /*}}}*/
+// Configuration::Clear - Clear an single value from a list            /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void Configuration::Clear(string Name, int Value)
+{
+   char S[300];
+   snprintf(S,sizeof(S),"%i",Value);
+   Clear(Name, S);
+}
+                                                                       /*}}}*/
+// Configuration::Clear - Clear an single value from a list            /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void Configuration::Clear(string Name, string Value)
+{
+   Item *Top = Lookup(Name.c_str(),false);
+   if (Top == 0 || Top->Child == 0)
+      return;
+
+   Item *Tmp, *Prev, *I;
+   Prev = I = Top->Child;
+
+   while(I != NULL)
+   {
+      if(I->Value == Value)
+      {
+        Tmp = I;
+        // was first element, point parent to new first element
+        if(Top->Child == Tmp)
+           Top->Child = I->Next;
+        I = I->Next;
+        Prev->Next = I;
+        delete Tmp;
+      } else {
+        Prev = I;
+        I = I->Next;
+      }
+   }
+     
 }
                                                                        /*}}}*/
 // Configuration::Clear - Clear an entire tree                         /*{{{*/
@@ -333,9 +374,9 @@ void Configuration::Set(const char *Name,int Value)
 void Configuration::Clear(string Name)
 {
    Item *Top = Lookup(Name.c_str(),false);
-   if (Top == 0)
+   if (Top == 0) 
       return;
-   
+
    Top->Value = string();
    Item *Stop = Top;
    Top = Top->Child;
@@ -452,7 +493,7 @@ bool ReadConfigFile(Configuration &Conf,string FName,bool AsSectional,
    if (!F != 0)
       return _error->Errno("ifstream::ifstream",_("Opening configuration file %s"),FName.c_str());
    
-   char Buffer[300];
+   char Buffer[1024];
    string LineBuffer;
    string Stack[100];
    unsigned int StackPos = 0;
@@ -466,6 +507,10 @@ bool ReadConfigFile(Configuration &Conf,string FName,bool AsSectional,
    {
       F.getline(Buffer,sizeof(Buffer));
       CurLine++;
+      // This should be made to work instead, but this is better than looping
+      if (F.fail() && !F.eof())
+         return _error->Error(_("Line %d too long (max %d)"), CurLine, sizeof(Buffer));
+
       _strtabexpand(Buffer,sizeof(Buffer));
       _strstrip(Buffer);
 
@@ -579,7 +624,7 @@ bool ReadConfigFile(Configuration &Conf,string FName,bool AsSectional,
            string Tag;
            const char *Pos = LineBuffer.c_str();
            if (ParseQuoteWord(Pos,Tag) == false)
-              return _error->Error(_("Syntax error %s:%u: Malformed Tag"),FName.c_str(),CurLine);
+              return _error->Error(_("Syntax error %s:%u: Malformed tag"),FName.c_str(),CurLine);
 
            // Parse off the word
            string Word;