From a014eee86ae91e590a2a554ea89f07de0fac5b81 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Fri, 11 Jun 2004 15:07:17 -0400 Subject: [PATCH] BUG: fix crash for if statment due to bad microsoft docs on deque BUG id 917 --- Source/cmIfCommand.cxx | 161 ++++++++++++++++++++++++++++------------- 1 file changed, 110 insertions(+), 51 deletions(-) diff --git a/Source/cmIfCommand.cxx b/Source/cmIfCommand.cxx index 466fc2a82..a2ffd21c6 100644 --- a/Source/cmIfCommand.cxx +++ b/Source/cmIfCommand.cxx @@ -16,7 +16,7 @@ =========================================================================*/ #include "cmIfCommand.h" #include // required for atof -#include +#include #include bool cmIfFunctionBlocker:: @@ -177,7 +177,7 @@ bool cmIfCommand::IsTrue(const std::vector &args, // store the reduced args in this vector - std::deque newArgs; + std::list newArgs; int reducible; unsigned int i; @@ -186,19 +186,25 @@ bool cmIfCommand::IsTrue(const std::vector &args, { newArgs.push_back(args[i]); } + std::list::iterator argP1; + std::list::iterator argP2; // now loop through the arguments and see if we can reduce any of them // we do this multiple times. Once for each level of precedence do { reducible = 0; - std::deque::iterator arg = newArgs.begin(); + std::list::iterator arg = newArgs.begin(); while (arg != newArgs.end()) { + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; // does a file exist - if (*arg == "EXISTS" && arg + 1 != newArgs.end()) + if (*arg == "EXISTS" && argP1 != newArgs.end()) { - if(cmSystemTools::FileExists((arg + 1)->c_str())) + if(cmSystemTools::FileExists((argP1)->c_str())) { *arg = "1"; } @@ -206,13 +212,17 @@ bool cmIfCommand::IsTrue(const std::vector &args, { *arg = "0"; } - newArgs.erase(arg+1); + newArgs.erase(argP1); + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; reducible = 1; } // does a command exist - if (*arg == "COMMAND" && arg + 1 != newArgs.end()) + if (*arg == "COMMAND" && argP1 != newArgs.end()) { - if(makefile->CommandExists((arg + 1)->c_str())) + if(makefile->CommandExists((argP1)->c_str())) { *arg = "1"; } @@ -220,13 +230,17 @@ bool cmIfCommand::IsTrue(const std::vector &args, { *arg = "0"; } - newArgs.erase(arg+1); + newArgs.erase(argP1); + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; reducible = 1; } // is a variable defined - if (*arg == "DEFINED" && arg + 1 != newArgs.end()) + if (*arg == "DEFINED" && argP1 != newArgs.end()) { - def = makefile->GetDefinition((arg + 1)->c_str()); + def = makefile->GetDefinition((argP1)->c_str()); if(def) { *arg = "1"; @@ -235,7 +249,11 @@ bool cmIfCommand::IsTrue(const std::vector &args, { *arg = "0"; } - newArgs.erase(arg+1); + newArgs.erase(argP1); + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; reducible = 1; } ++arg; @@ -249,14 +267,19 @@ bool cmIfCommand::IsTrue(const std::vector &args, do { reducible = 0; - std::deque::iterator arg = newArgs.begin(); + std::list::iterator arg = newArgs.begin(); + while (arg != newArgs.end()) { - if (arg + 1 != newArgs.end() && arg + 2 != newArgs.end() && - *(arg + 1) == "MATCHES") + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; + if (argP1 != newArgs.end() && argP2 != newArgs.end() && + *(argP1) == "MATCHES") { def = cmIfCommand::GetVariableOrString(arg->c_str(), makefile); - cmsys::RegularExpression regEntry((arg+2)->c_str()); + cmsys::RegularExpression regEntry((argP2)->c_str()); if (regEntry.find(def)) { *arg = "1"; @@ -265,25 +288,33 @@ bool cmIfCommand::IsTrue(const std::vector &args, { *arg = "0"; } - newArgs.erase(arg+2); - newArgs.erase(arg+1); + newArgs.erase(argP2); + newArgs.erase(argP1); + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; reducible = 1; } - if (arg + 1 != newArgs.end() && *arg == "MATCHES") + if (argP1 != newArgs.end() && *arg == "MATCHES") { *arg = "0"; - newArgs.erase(arg+1); + newArgs.erase(argP1); + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; reducible = 1; } - if (arg + 1 != newArgs.end() && arg + 2 != newArgs.end() && - (*(arg + 1) == "LESS" || *(arg + 1) == "GREATER" || - *(arg + 1) == "EQUAL")) + if (argP1 != newArgs.end() && argP2 != newArgs.end() && + (*(argP1) == "LESS" || *(argP1) == "GREATER" || + *(argP1) == "EQUAL")) { def = cmIfCommand::GetVariableOrString(arg->c_str(), makefile); - def2 = cmIfCommand::GetVariableOrString((arg + 2)->c_str(), makefile); - if (*(arg + 1) == "LESS") + def2 = cmIfCommand::GetVariableOrString((argP2)->c_str(), makefile); + if (*(argP1) == "LESS") { if(atof(def) < atof(def2)) { @@ -294,7 +325,7 @@ bool cmIfCommand::IsTrue(const std::vector &args, *arg = "0"; } } - else if (*(arg + 1) == "GREATER") + else if (*(argP1) == "GREATER") { if(atof(def) > atof(def2)) { @@ -316,17 +347,21 @@ bool cmIfCommand::IsTrue(const std::vector &args, *arg = "0"; } } - newArgs.erase(arg+2); - newArgs.erase(arg+1); + newArgs.erase(argP2); + newArgs.erase(argP1); + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; reducible = 1; } - if (arg + 1 != newArgs.end() && arg + 2 != newArgs.end() && - (*(arg + 1) == "STRLESS" || *(arg + 1) == "STRGREATER")) + if (argP1 != newArgs.end() && argP2 != newArgs.end() && + (*(argP1) == "STRLESS" || *(argP1) == "STRGREATER")) { def = cmIfCommand::GetVariableOrString(arg->c_str(), makefile); - def2 = cmIfCommand::GetVariableOrString((arg + 2)->c_str(), makefile); - if (*(arg + 1) == "STRLESS") + def2 = cmIfCommand::GetVariableOrString((argP2)->c_str(), makefile); + if (*(argP1) == "STRLESS") { if(strcmp(def,def2) < 0) { @@ -348,8 +383,12 @@ bool cmIfCommand::IsTrue(const std::vector &args, *arg = "0"; } } - newArgs.erase(arg+2); - newArgs.erase(arg+1); + newArgs.erase(argP2); + newArgs.erase(argP1); + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; reducible = 1; } @@ -364,12 +403,16 @@ bool cmIfCommand::IsTrue(const std::vector &args, do { reducible = 0; - std::deque::iterator arg = newArgs.begin(); + std::list::iterator arg = newArgs.begin(); while (arg != newArgs.end()) { - if (arg + 1 != newArgs.end() && *arg == "NOT") + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; + if (argP1 != newArgs.end() && *arg == "NOT") { - def = cmIfCommand::GetVariableOrNumber((arg + 1)->c_str(), makefile); + def = cmIfCommand::GetVariableOrNumber((argP1)->c_str(), makefile); if(!cmSystemTools::IsOff(def)) { *arg = "0"; @@ -378,7 +421,11 @@ bool cmIfCommand::IsTrue(const std::vector &args, { *arg = "1"; } - newArgs.erase(arg+1); + newArgs.erase(argP1); + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; reducible = 1; } ++arg; @@ -391,14 +438,18 @@ bool cmIfCommand::IsTrue(const std::vector &args, do { reducible = 0; - std::deque::iterator arg = newArgs.begin(); + std::list::iterator arg = newArgs.begin(); while (arg != newArgs.end()) { - if (arg + 1 != newArgs.end() && *(arg + 1) == "AND" && - arg + 2 != newArgs.end()) + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; + if (argP1 != newArgs.end() && *(argP1) == "AND" && + argP2 != newArgs.end()) { def = cmIfCommand::GetVariableOrNumber(arg->c_str(), makefile); - def2 = cmIfCommand::GetVariableOrNumber((arg + 2)->c_str(), makefile); + def2 = cmIfCommand::GetVariableOrNumber((argP2)->c_str(), makefile); if(cmSystemTools::IsOff(def) || cmSystemTools::IsOff(def2)) { *arg = "0"; @@ -407,16 +458,20 @@ bool cmIfCommand::IsTrue(const std::vector &args, { *arg = "1"; } - newArgs.erase(arg+2); - newArgs.erase(arg+1); + newArgs.erase(argP2); + newArgs.erase(argP1); + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; reducible = 1; } - if (arg + 1 != newArgs.end() && *(arg + 1) == "OR" && - arg + 2 != newArgs.end()) + if (argP1 != newArgs.end() && *(argP1) == "OR" && + argP2 != newArgs.end()) { def = cmIfCommand::GetVariableOrNumber(arg->c_str(), makefile); - def2 = cmIfCommand::GetVariableOrNumber((arg + 2)->c_str(), makefile); + def2 = cmIfCommand::GetVariableOrNumber((argP2)->c_str(), makefile); if(cmSystemTools::IsOff(def) && cmSystemTools::IsOff(def2)) { *arg = "0"; @@ -425,8 +480,12 @@ bool cmIfCommand::IsTrue(const std::vector &args, { *arg = "1"; } - newArgs.erase(arg+2); - newArgs.erase(arg+1); + newArgs.erase(argP2); + newArgs.erase(argP1); + argP1 = arg; + argP1++; + argP2 = argP1; + argP2++; reducible = 1; } @@ -439,11 +498,11 @@ bool cmIfCommand::IsTrue(const std::vector &args, if (newArgs.size() == 1) { isValid = true; - if (newArgs[0] == "0") + if (*newArgs.begin() == "0") { return false; } - if (newArgs[0] == "1") + if (*newArgs.begin() == "1") { return true; }