Ken Martin před 21 roky
rodič
revize
a18fbc3b37
2 změnil soubory, kde provedl 27 přidání a 23 odebrání
  1. 21 19
      Source/cmIfCommand.cxx
  2. 6 4
      Source/cmIfCommand.h

+ 21 - 19
Source/cmIfCommand.cxx

@@ -133,7 +133,7 @@ bool cmIfCommand::InvokeInitialPass(const std::vector<cmListFileArgument>& args)
 
 // order of operations, 
 // EXISTS COMMAND DEFINED 
-// MATCHES LESS GREATER EQUAL STRLESS STRGREATER
+// MATCHES LESS GREATER EQUAL STRLESS STRGREATER STREQUAL 
 // AND OR
 //
 // There is an issue on whether the arguments should be values of references,
@@ -357,32 +357,34 @@ bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
         }
 
       if (argP1 != newArgs.end() && argP2 != newArgs.end() &&
-          (*(argP1) == "STRLESS" || *(argP1) == "STRGREATER")) 
+          (*(argP1) == "STRLESS" || 
+           *(argP1) == "STREQUAL" || 
+           *(argP1) == "STRGREATER")) 
         {
         def = cmIfCommand::GetVariableOrString(arg->c_str(), makefile);
         def2 = cmIfCommand::GetVariableOrString((argP2)->c_str(), makefile);
+        int val = strcmp(def,def2);
+        int result;
         if (*(argP1) == "STRLESS")
           {
-          if(strcmp(def,def2) < 0)
-            {
-            *arg = "1";
-            }
-          else
-            {
-            *arg = "0";
-            }
+          result = (val < 0);
+          }
+        else if (*(argP1) == "STRGREATER")
+          {
+          result = (val > 0);
+          }
+        else // strequal
+          {
+          result = (val == 0);
+          }
+        if(result)
+          {
+          *arg = "1";
           }
         else
           {
-          if(strcmp(def,def2) > 0)
-            {
-            *arg = "1";
-            }
-          else
-            {
-            *arg = "0";
-            }
-          }          
+          *arg = "0";
+          }
         newArgs.erase(argP2);
         newArgs.erase(argP1);
         argP1 = arg;

+ 6 - 4
Source/cmIfCommand.h

@@ -115,9 +115,9 @@ public:
       "the same expression must be given to IF, ELSE, and ENDIF.  Long "
       "exressions can be used and the order or precidence is that the "
       "EXISTS, COMMAND, and DEFINED operators will be evaluated first. "
-      "Then any EQUAL, LESS, GREATER, STRLESS, STRGREATER, MATCHES will be "
-      "evaluated. Then NOT operators and finally AND, OR operators will be "
-      "evaluated. Possible expressions are:\n"
+      "Then any EQUAL, LESS, GREATER, STRLESS, STRGREATER, STREQUAL, MATCHES "
+      "will be evaluated. Then NOT operators and finally AND, OR operators "
+      "will be evaluated. Possible expressions are:\n"
       "  IF(variable)\n"
       "True if the variable's value is not empty, 0, FALSE, OFF, or NOTFOUND.\n"
       "  IF(NOT variable)\n"
@@ -149,8 +149,10 @@ public:
       "  IF(string STRLESS string)\n"
       "  IF(variable STRGREATER string)\n"
       "  IF(string STRGREATER string)\n"
+      "  IF(variable STREQUAL string)\n"
+      "  IF(string STREQUAL string)\n"
       "True if the given string or variable's value is lexicographically "
-      "less (or greater) than the string on the right.\n"
+      "less (or greater, or equal) than the string on the right.\n"
       "  IF(DEFINED variable)\n"
       "True if the given variable is defined. It does not matter if the "
       "variable is true or false just if it has been set.";