Working acquire code
[ntk/apt.git] / apt-pkg / contrib / configuration.cc
index b12fed6..da026f0 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: configuration.cc,v 1.5 1998/09/26 05:34:26 jgg Exp $
+// $Id: configuration.cc,v 1.10 1998/11/05 07:21:43 jgg Exp $
 /* ######################################################################
 
    Configuration Class
@@ -33,7 +33,7 @@ Configuration::Configuration()
    Root = new Item;
 }
                                                                        /*}}}*/
-// Configuration::Lookup - Lookup a single item                                                                        /*{{{*/
+// Configuration::Lookup - Lookup a single item                                /*{{{*/
 // ---------------------------------------------------------------------
 /* This will lookup a single item by name below another item. It is a 
    helper function for the main lookup function */
@@ -66,6 +66,9 @@ Configuration::Item *Configuration::Lookup(Item *Head,const char *S,
    new items */
 Configuration::Item *Configuration::Lookup(const char *Name,bool Create)
 {
+   if (Name == 0)
+      return Root->Child;
+   
    const char *Start = Name;
    const char *End = Start + strlen(Name);
    const char *TagEnd = Name;
@@ -102,11 +105,12 @@ string Configuration::Find(const char *Name,const char *Default)
    return Itm->Value;
 }
                                                                        /*}}}*/
-// Configuration::FindDir - Find a directory                           /*{{{*/
+// Configuration::FindFile - Find a Filename                           /*{{{*/
 // ---------------------------------------------------------------------
 /* Directories are stored as the base dir in the Parent node and the
+   sub directory in sub nodes with the final node being the end filename
  */
-string Configuration::FindDir(const char *Name,const char *Default = 0)
+string Configuration::FindFile(const char *Name,const char *Default)
 {
    Item *Itm = Lookup(Name,false);
    if (Itm == 0 || Itm->Value.empty() == true)
@@ -117,14 +121,33 @@ string Configuration::FindDir(const char *Name,const char *Default = 0)
         return Default;
    }
    
+   // Absolute path
    if (Itm->Value[0] == '/' || Itm->Parent == 0)
       return Itm->Value;
+   
+   // ./ is also considered absolute as is anything with ~ in it
+   if (Itm->Value[0] != 0 && 
+       ((Itm->Value[0] == '.' && Itm->Value[1] == '/') ||
+       (Itm->Value[0] == '~' && Itm->Value[1] == '/')))
+      return Itm->Value;
+   
    if (Itm->Parent->Value.end()[-1] == '/')
       return Itm->Parent->Value + Itm->Value;
    else
       return Itm->Parent->Value + '/' + Itm->Value;
 }
                                                                        /*}}}*/
+// Configuration::FindDir - Find a directory name                      /*{{{*/
+// ---------------------------------------------------------------------
+/* This is like findfile execept the result is terminated in a / */
+string Configuration::FindDir(const char *Name,const char *Default)
+{
+   string Res = FindFile(Name,Default);
+   if (Res.end()[-1] != '/')
+      return Res + '/';
+   return Res;
+}
+                                                                       /*}}}*/
 // Configuration::FindI - Find an integer value                                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -151,28 +174,7 @@ bool Configuration::FindB(const char *Name,bool Default)
    if (Itm == 0 || Itm->Value.empty() == true)
       return Default;
    
-   char *End;
-   int Res = strtol(Itm->Value.c_str(),&End,0);
-   if (End == Itm->Value.c_str() || Res < 0 || Res > 1)
-   {
-      // Check for positives
-      if (strcasecmp(Itm->Value.c_str(),"no") == 0 ||
-         strcasecmp(Itm->Value.c_str(),"false") == 0 ||
-         strcasecmp(Itm->Value.c_str(),"without") == 0 ||
-         strcasecmp(Itm->Value.c_str(),"disable") == 0)
-        return false;
-      
-      // Check for negatives
-      if (strcasecmp(Itm->Value.c_str(),"yes") == 0 ||
-         strcasecmp(Itm->Value.c_str(),"true") == 0 ||
-         strcasecmp(Itm->Value.c_str(),"with") == 0 ||
-         strcasecmp(Itm->Value.c_str(),"enable") == 0)
-        return false;
-      
-      return Default;
-   }
-   
-   return Res;
+   return StringToBool(Itm->Value,Default);
 }
                                                                        /*}}}*/
 // Configuration::Set - Set a value                                    /*{{{*/
@@ -210,6 +212,42 @@ bool Configuration::Exists(const char *Name)
    return true;
 }
                                                                        /*}}}*/
+// Configuration::Dump - Dump the config                               /*{{{*/
+// ---------------------------------------------------------------------
+/* Dump the entire configuration space */
+void Configuration::Dump()
+{
+   /* Write out all of the configuration directives by walking the 
+      configuration tree */
+   const Configuration::Item *Top = _config->Tree(0);
+   for (; Top != 0;)
+   {
+      clog << Top->FullTag() << " \"" << Top->Value << "\";" << endl;
+      
+      if (Top->Child != 0)
+      {
+        Top = Top->Child;
+        continue;
+      }
+      
+      while (Top != 0 && Top->Next == 0)
+        Top = Top->Parent;
+      if (Top != 0)
+        Top = Top->Next;
+   }   
+}
+                                                                       /*}}}*/
+
+// Configuration::Item::FullTag - Return the fully scoped tag          /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+string Configuration::Item::FullTag() const
+{
+   if (Parent == 0 || Parent->Parent == 0)
+      return Tag;
+   return Parent->FullTag() + "::" + Tag;
+}
+                                                                       /*}}}*/
 
 // ReadConfigFile - Read a configuration file                          /*{{{*/
 // ---------------------------------------------------------------------
@@ -254,8 +292,14 @@ bool ReadConfigFile(Configuration &Conf,string FName)
       }
       
       // Discard single line comments
+      bool InQuote = false;
       for (char *I = Buffer; *I != 0; I++)
       {
+        if (*I == '"')
+           InQuote = !InQuote;
+        if (InQuote == true)
+           continue;
+        
         if (*I == '/' && I[1] == '/')
          {
            *I = 0;
@@ -266,6 +310,11 @@ bool ReadConfigFile(Configuration &Conf,string FName)
       // Look for multi line comments
       for (char *I = Buffer; *I != 0; I++)
       {
+        if (*I == '"')
+           InQuote = !InQuote;
+        if (InQuote == true)
+           continue;
+        
         if (*I == '/' && I[1] == '*')
          {
            InComment = true;
@@ -360,7 +409,7 @@ bool ReadConfigFile(Configuration &Conf,string FName)
            string Word;
            if (ParseCWord(LineBuffer.c_str()+Pos,Word) == false)
               return _error->Error("Syntax error %s:%u: Malformed value",FName.c_str(),CurLine);
-              
+           
            // Generate the item name
            string Item;
            if (ParentTag.empty() == true)