X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/dfa11ecc05d342af77f86120c123a3ea618544b6..7810fc042d4d3dda6b2c721d09d3eb7eadc12e2d:/apt-pkg/contrib/configuration.cc diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc index 09e454be9..da57c2054 100644 --- a/apt-pkg/contrib/configuration.cc +++ b/apt-pkg/contrib/configuration.cc @@ -15,9 +15,6 @@ ##################################################################### */ /*}}}*/ // Include files /*{{{*/ -#ifdef __GNUG__ -#pragma implementation "apt-pkg/configuration.h" -#endif #include #include #include @@ -110,7 +107,7 @@ Configuration::Item *Configuration::Lookup(Item *Head,const char *S, return 0; I = new Item; - I->Tag = string(S,Len); + I->Tag.assign(S,Len); I->Next = *Last; I->Parent = Head; *Last = I; @@ -161,7 +158,7 @@ string Configuration::Find(const char *Name,const char *Default) const if (Itm == 0 || Itm->Value.empty() == true) { if (Default == 0) - return string(); + return ""; else return Default; } @@ -176,11 +173,16 @@ string Configuration::Find(const char *Name,const char *Default) const */ string Configuration::FindFile(const char *Name,const char *Default) const { + const Item *RootItem = Lookup("RootDir"); + std::string rootDir = (RootItem == 0) ? "" : RootItem->Value; + if(rootDir.size() > 0 && rootDir[rootDir.size() - 1] != '/') + rootDir.push_back('/'); + const Item *Itm = Lookup(Name); if (Itm == 0 || Itm->Value.empty() == true) { if (Default == 0) - return string(); + return ""; else return Default; } @@ -207,7 +209,7 @@ string Configuration::FindFile(const char *Name,const char *Default) const Itm = Itm->Parent; } - return val; + return rootDir + val; } /*}}}*/ // Configuration::FindDir - Find a directory name /*{{{*/ @@ -294,7 +296,7 @@ string Configuration::FindAny(const char *Name,const char *Default) const // Configuration::CndSet - Conditinal Set a value /*{{{*/ // --------------------------------------------------------------------- /* This will not overwrite */ -void Configuration::CndSet(const char *Name,string Value) +void Configuration::CndSet(const char *Name,const string &Value) { Item *Itm = Lookup(Name,true); if (Itm == 0) @@ -306,7 +308,7 @@ void Configuration::CndSet(const char *Name,string Value) // Configuration::Set - Set a value /*{{{*/ // --------------------------------------------------------------------- /* */ -void Configuration::Set(const char *Name,string Value) +void Configuration::Set(const char *Name,const string &Value) { Item *Itm = Lookup(Name,true); if (Itm == 0) @@ -330,7 +332,7 @@ void Configuration::Set(const char *Name,int Value) // Configuration::Clear - Clear an single value from a list /*{{{*/ // --------------------------------------------------------------------- /* */ -void Configuration::Clear(string Name, int Value) +void Configuration::Clear(const string Name, int Value) { char S[300]; snprintf(S,sizeof(S),"%i",Value); @@ -340,7 +342,7 @@ void Configuration::Clear(string Name, int Value) // Configuration::Clear - Clear an single value from a list /*{{{*/ // --------------------------------------------------------------------- /* */ -void Configuration::Clear(string Name, string Value) +void Configuration::Clear(const string Name, string Value) { Item *Top = Lookup(Name.c_str(),false); if (Top == 0 || Top->Child == 0) @@ -377,7 +379,7 @@ void Configuration::Clear(string Name) if (Top == 0) return; - Top->Value = string(); + Top->Value.clear(); Item *Stop = Top; Top = Top->Child; Stop->Child = 0; @@ -425,6 +427,7 @@ bool Configuration::ExistsAny(const char *Name) const string key = Name; if (key.size() > 2 && key.end()[-2] == '/') + { if (key.find_first_of("fdbi",key.size()-1) < key.size()) { key.resize(key.size() - 2); @@ -435,7 +438,7 @@ bool Configuration::ExistsAny(const char *Name) const { _error->Warning(_("Unrecognized type abbreviation: '%c'"), key.end()[-3]); } - + } return Exists(Name); } /*}}}*/ @@ -485,7 +488,7 @@ string Configuration::Item::FullTag(const Item *Stop) const sections like 'zone "foo.org" { .. };' This causes each section to be added in with a tag like "zone::foo.org" instead of being split tag/value. AsSectional enables Sectional parsing.*/ -bool ReadConfigFile(Configuration &Conf,string FName,bool AsSectional, +bool ReadConfigFile(Configuration &Conf,const string &FName,bool AsSectional, unsigned Depth) { // Open the stream for reading @@ -509,7 +512,7 @@ bool ReadConfigFile(Configuration &Conf,string FName,bool AsSectional, 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)); + return _error->Error(_("Line %d too long (max %lu)"), CurLine, sizeof(Buffer)); _strtabexpand(Buffer,sizeof(Buffer)); _strstrip(Buffer); @@ -711,13 +714,13 @@ bool ReadConfigFile(Configuration &Conf,string FName,bool AsSectional, } // Empty the buffer - LineBuffer = string(); + LineBuffer.clear(); // Move up a tag, but only if there is no bit to parse if (TermChar == '}') { if (StackPos == 0) - ParentTag = string(); + ParentTag.clear(); else ParentTag = Stack[--StackPos]; } @@ -742,8 +745,8 @@ bool ReadConfigFile(Configuration &Conf,string FName,bool AsSectional, // ReadConfigDir - Read a directory of config files /*{{{*/ // --------------------------------------------------------------------- /* */ -bool ReadConfigDir(Configuration &Conf,string Dir,bool AsSectional, - unsigned Depth) +bool ReadConfigDir(Configuration &Conf,const string &Dir,bool AsSectional, + unsigned Depth) { DIR *D = opendir(Dir.c_str()); if (D == 0)