diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx index e49edd878..1fbde01e6 100644 --- a/Source/cmStringCommand.cxx +++ b/Source/cmStringCommand.cxx @@ -93,6 +93,10 @@ bool cmStringCommand { return this->HandleTimestampCommand(args); } + else if(subCommand == "MAKE_C_IDENTIFIER") + { + return this->HandleMakeCIdentifierCommand(args); + } std::string e = "does not recognize sub-command "+subCommand; this->SetError(e.c_str()); @@ -754,6 +758,24 @@ bool cmStringCommand return true; } +//---------------------------------------------------------------------------- +bool cmStringCommand +::HandleMakeCIdentifierCommand(std::vector const& args) +{ + if(args.size() != 3) + { + this->SetError("sub-command MAKE_C_IDENTIFIER requires two arguments."); + return false; + } + + const std::string& input = args[1]; + const std::string& variableName = args[2]; + + this->Makefile->AddDefinition(variableName.c_str(), + cmSystemTools::MakeCidentifier(input.c_str()).c_str()); + return true; +} + //---------------------------------------------------------------------------- bool cmStringCommand::HandleStripCommand( std::vector const& args) diff --git a/Source/cmStringCommand.h b/Source/cmStringCommand.h index 802e0b850..f584cfdbf 100644 --- a/Source/cmStringCommand.h +++ b/Source/cmStringCommand.h @@ -94,6 +94,7 @@ public: " [RANDOM_SEED ] )\n" " string(FIND [REVERSE])\n" " string(TIMESTAMP [] [UTC])\n" + " string(MAKE_C_IDENTIFIER )\n" "REGEX MATCH will match the regular expression once and store the " "match in the output variable.\n" "REGEX MATCHALL will match the regular expression as many times as " @@ -176,7 +177,9 @@ public: "and copied to the output as-is.\n" "If no explicit is given it will default to:\n" " %Y-%m-%dT%H:%M:%S for local time.\n" - " %Y-%m-%dT%H:%M:%SZ for UTC."; + " %Y-%m-%dT%H:%M:%SZ for UTC.\n" + "MAKE_C_IDENTIFIER will write a string which can be used as an " + "identifier in C."; } cmTypeMacro(cmStringCommand, cmCommand); @@ -200,6 +203,7 @@ protected: bool HandleRandomCommand(std::vector const& args); bool HandleFindCommand(std::vector const& args); bool HandleTimestampCommand(std::vector const& args); + bool HandleMakeCIdentifierCommand(std::vector const& args); class RegexReplacement { diff --git a/Tests/StringFileTest/CMakeLists.txt b/Tests/StringFileTest/CMakeLists.txt index 6d798b067..00383ab37 100644 --- a/Tests/StringFileTest/CMakeLists.txt +++ b/Tests/StringFileTest/CMakeLists.txt @@ -280,3 +280,9 @@ endif() if(NOT ST_NINE STREQUAL "9") message(SEND_ERROR "SUBSTRING does not return the tail when selected with -1") endif() + +string(MAKE_C_IDENTIFIER "1one-two$" MCI_1) + +if(NOT MCI_1 STREQUAL _1one_two_) + message(SEND_ERROR "MAKE_C_IDENTIFIER did not create expected result.") +endif()