diff options
Diffstat (limited to 'apt-pkg/contrib/configuration.cc')
-rw-r--r-- | apt-pkg/contrib/configuration.cc | 61 |
1 files changed, 34 insertions, 27 deletions
diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc index da026f0f6..e03001f84 100644 --- a/apt-pkg/contrib/configuration.cc +++ b/apt-pkg/contrib/configuration.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: configuration.cc,v 1.10 1998/11/05 07:21:43 jgg Exp $ +// $Id: configuration.cc,v 1.11 1999/01/18 06:20:07 jgg Exp $ /* ###################################################################### Configuration Class @@ -43,10 +43,17 @@ Configuration::Item *Configuration::Lookup(Item *Head,const char *S, int Res = 1; Item *I = Head->Child; Item **Last = &Head->Child; - for (; I != 0; Last = &I->Next, I = I->Next) - if ((Res = stringcasecmp(I->Tag.begin(),I->Tag.end(),S,S + Len)) == 0) - break; + // Empty strings match nothing. They are used for lists. + if (Len != 0) + { + for (; I != 0; Last = &I->Next, I = I->Next) + if ((Res = stringcasecmp(I->Tag.begin(),I->Tag.end(),S,S + Len)) == 0) + break; + } + else + for (; I != 0; Last = &I->Next, I = I->Next); + if (Res == 0) return I; if (Create == false) @@ -73,7 +80,7 @@ Configuration::Item *Configuration::Lookup(const char *Name,bool Create) const char *End = Start + strlen(Name); const char *TagEnd = Name; Item *Itm = Root; - for (; End - TagEnd > 2; TagEnd++) + for (; End - TagEnd >= 2; TagEnd++) { if (TagEnd[0] == ':' && TagEnd[1] == ':') { @@ -84,6 +91,13 @@ Configuration::Item *Configuration::Lookup(const char *Name,bool Create) } } + // This must be a trailing ::, we create unique items in a list + if (End - Start == 0) + { + if (Create == false) + return 0; + } + Itm = Lookup(Itm,Start,End - Start,Create); return Itm; } @@ -377,17 +391,11 @@ bool ReadConfigFile(Configuration &Conf,string FName) continue; // Parse off the tag - string::size_type Pos = LineBuffer.find(' '); - if (Pos == string::npos) - { - if (TermChar == '{') - Pos = LineBuffer.length(); - else - return _error->Error("Syntax error %s:%u: Tag with no value",FName.c_str(),CurLine); - } + 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); - string Tag = string(LineBuffer,0,Pos); - // Go down a level if (TermChar == '{') { @@ -398,17 +406,16 @@ bool ReadConfigFile(Configuration &Conf,string FName) Tag = string(); } - // We dont have a value to set - if (Pos == LineBuffer.length()) - { - LineBuffer = string(); - continue; - } - // Parse off the word string Word; - if (ParseCWord(LineBuffer.c_str()+Pos,Word) == false) - return _error->Error("Syntax error %s:%u: Malformed value",FName.c_str(),CurLine); + if (ParseCWord(Pos,Word) == false) + { + if (TermChar != '{') + { + Word = Tag; + Tag = ""; + } + } // Generate the item name string Item; @@ -416,10 +423,10 @@ bool ReadConfigFile(Configuration &Conf,string FName) Item = Tag; else { - if (Tag.empty() == true) - Item = ParentTag; - else + if (TermChar != '{' || Tag.empty() == false) Item = ParentTag + "::" + Tag; + else + Item = ParentTag; } // Set the item in the configuration class |