From 0b661a5cb3d3f25b47c21b98ddbaeb27985b8279 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Mon, 6 Jun 2016 14:30:28 +0200 Subject: get right of the hardcoded string-length compares With have better ways to compare, manipulate and work with strings, so use it instead of counting string length by hand with is a wonder it hasn't failed yet. Ignoreable from a changelog perspective as there is no behaviour change. Git-Dch: Ignore --- apt-pkg/edsp.cc | 68 ++++++++++++++++++++++++--------------------------------- 1 file changed, 28 insertions(+), 40 deletions(-) diff --git a/apt-pkg/edsp.cc b/apt-pkg/edsp.cc index dfd64ca82..94cac4eb1 100644 --- a/apt-pkg/edsp.cc +++ b/apt-pkg/edsp.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -724,24 +725,31 @@ static bool ReadLine(int const input, std::string &line) { // StringToBool - convert yes/no to bool /*{{{*/ // --------------------------------------------------------------------- /* we are not as lazy as we are in the global StringToBool as we really - only accept yes/no here - but we will ignore leading spaces */ -static bool StringToBool(char const *answer, bool const defValue) { - for (; isspace(*answer) != 0; ++answer); - if (strncasecmp(answer, "yes", 3) == 0) + only accept yes/no here */ +static bool localStringToBool(std::string answer, bool const defValue) { + std::transform(answer.begin(), answer.end(), answer.begin(), ::tolower); + if (answer == "yes") return true; - else if (strncasecmp(answer, "no", 2) == 0) + else if (answer == "no") return false; else - _error->Warning("Value '%s' is not a boolean 'yes' or 'no'!", answer); + _error->Warning("Value '%s' is not a boolean 'yes' or 'no'!", answer.c_str()); return defValue; } /*}}}*/ -static bool ReadFlag(unsigned int &flags, std::string const &line, APT::StringView const name, unsigned int const setflag)/*{{{*/ +static bool LineStartsWithAndStrip(std::string &line, APT::StringView const with)/*{{{*/ { - if (line.compare(0, name.length(), name.data()) != 0) + if (line.compare(0, with.size(), with.data()) != 0) return false; - auto const l = line.c_str() + name.length() + 1; - if (StringToBool(l, false)) + line = APT::String::Strip(line.substr(with.length())); + return true; +} + /*}}}*/ +static bool ReadFlag(unsigned int &flags, std::string &line, APT::StringView const name, unsigned int const setflag)/*{{{*/ +{ + if (LineStartsWithAndStrip(line, name) == false) + return false; + if (localStringToBool(line, false)) flags |= setflag; else flags &= ~setflag; @@ -762,7 +770,7 @@ bool EDSP::ReadRequest(int const input, std::list &install, if (line.empty() == true) continue; // The first Tag must be a request, so search for it - if (line.compare(0, 8, "Request:") != 0) + if (LineStartsWithAndStrip(line, "Request:")) continue; while (ReadLine(input, line) == true) @@ -772,16 +780,10 @@ bool EDSP::ReadRequest(int const input, std::list &install, return true; std::list *request = NULL; - if (line.compare(0, 8, "Install:") == 0) - { - line.erase(0, 8); + if (LineStartsWithAndStrip(line, "Install:")) request = &install; - } - else if (line.compare(0, 7, "Remove:") == 0) - { - line.erase(0, 7); + else if (LineStartsWithAndStrip(line, "Remove:")) request = &remove; - } else if (ReadFlag(flags, line, "Upgrade:", (Request::UPGRADE_ALL | Request::FORBID_REMOVE | Request::FORBID_NEW_INSTALL)) || ReadFlag(flags, line, "Dist-Upgrade:", Request::UPGRADE_ALL) || ReadFlag(flags, line, "Upgrade-All:", Request::UPGRADE_ALL) || @@ -789,33 +791,19 @@ bool EDSP::ReadRequest(int const input, std::list &install, ReadFlag(flags, line, "Forbid-Remove:", Request::FORBID_REMOVE) || ReadFlag(flags, line, "Autoremove:", Request::AUTOREMOVE)) ; - else if (line.compare(0, 13, "Architecture:") == 0) - _config->Set("APT::Architecture", line.c_str() + 14); - else if (line.compare(0, 14, "Architectures:") == 0) - { - std::string const archs = line.c_str() + 15; - _config->Set("APT::Architectures", SubstVar(archs, " ", ",")); - } - else if (line.compare(0, 7, "Solver:") == 0) + else if (LineStartsWithAndStrip(line, "Architecture:")) + _config->Set("APT::Architecture", line); + else if (LineStartsWithAndStrip(line, "Architectures:")) + _config->Set("APT::Architectures", SubstVar(line, " ", ",")); + else if (LineStartsWithAndStrip(line, "Solver:")) ; // purely informational line else _error->Warning("Unknown line in EDSP Request stanza: %s", line.c_str()); if (request == NULL) continue; - size_t end = line.length(); - do { - size_t begin = line.rfind(' '); - if (begin == std::string::npos) - { - request->push_back(line.substr(0, end)); - break; - } - else if (begin < end) - request->push_back(line.substr(begin + 1, end)); - line.erase(begin); - end = line.find_last_not_of(' '); - } while (end != std::string::npos); + auto const pkgs = VectorizeString(line, ' '); + std::move(pkgs.begin(), pkgs.end(), std::back_inserter(*request)); } } return false; -- cgit v1.2.3