diff options
author | Stephen Kelly <steveire@gmail.com> | 2012-12-10 11:00:34 (GMT) |
---|---|---|
committer | Stephen Kelly <steveire@gmail.com> | 2013-01-10 17:06:03 (GMT) |
commit | f99196dc0cde6e5868cc74c603a78b10f1ba324a (patch) | |
tree | 9e9a61b1c467d184904b1a290f5e7c3c57ec0673 | |
parent | 93034a8350102e308fa5bca8d89bf3f6fae12771 (diff) | |
download | CMake-f99196dc0cde6e5868cc74c603a78b10f1ba324a.zip CMake-f99196dc0cde6e5868cc74c603a78b10f1ba324a.tar.gz CMake-f99196dc0cde6e5868cc74c603a78b10f1ba324a.tar.bz2 |
Add cmGeneratorExpression::Split() API.
It can split a string like
"A;$<1:B>;$<1:C>;D;E;$<1:F;G;H>;$<1:I>;J"
into
"A" "$<1:B>" "$<1:C>" "D" "E" "$<1:F;G;H>" "$<1:I>" "J"
-rw-r--r-- | Source/cmGeneratorExpression.cxx | 61 | ||||
-rw-r--r-- | Source/cmGeneratorExpression.h | 3 |
2 files changed, 64 insertions, 0 deletions
diff --git a/Source/cmGeneratorExpression.cxx b/Source/cmGeneratorExpression.cxx index 4063697..d306dee 100644 --- a/Source/cmGeneratorExpression.cxx +++ b/Source/cmGeneratorExpression.cxx @@ -251,6 +251,67 @@ static std::string stripExportInterface(const std::string &input, } //---------------------------------------------------------------------------- +void cmGeneratorExpression::Split(const std::string &input, + std::vector<std::string> &output) +{ + std::string::size_type pos = 0; + std::string::size_type lastPos = pos; + while((pos = input.find("$<", lastPos)) != input.npos) + { + std::string part = input.substr(lastPos, pos - lastPos); + std::string preGenex; + if (!part.empty()) + { + std::string::size_type startPos = input.rfind(";", pos); + if (startPos != pos - 1 && startPos >= lastPos) + { + part = input.substr(lastPos, startPos - lastPos); + preGenex = input.substr(startPos + 1, pos - startPos - 1); + } + cmSystemTools::ExpandListArgument(part.c_str(), output); + } + pos += 2; + int nestingLevel = 1; + const char *c = input.c_str() + pos; + const char * const cStart = c; + for ( ; *c; ++c) + { + if(c[0] == '$' && c[1] == '<') + { + ++nestingLevel; + ++c; + continue; + } + if(c[0] == '>') + { + --nestingLevel; + if (nestingLevel == 0) + { + break; + } + } + } + for ( ; *c; ++c) + { + // Capture the part after the genex and before the next ';' + if(c[0] == ';') + { + --c; + break; + } + } + const std::string::size_type traversed = (c - cStart) + 1; + output.push_back(preGenex + "$<" + input.substr(pos, traversed)); + pos += traversed; + lastPos = pos; + } + if (lastPos < input.size()) + { + cmSystemTools::ExpandListArgument(input.substr(lastPos), output); + } +} + +//---------------------------------------------------------------------------- std::string cmGeneratorExpression::Preprocess(const std::string &input, PreprocessContext context) { diff --git a/Source/cmGeneratorExpression.h b/Source/cmGeneratorExpression.h index b58dde5..8f1aef6 100644 --- a/Source/cmGeneratorExpression.h +++ b/Source/cmGeneratorExpression.h @@ -59,6 +59,9 @@ public: static std::string Preprocess(const std::string &input, PreprocessContext context); + static void Split(const std::string &input, + std::vector<std::string> &output); + private: cmGeneratorExpression(const cmGeneratorExpression &); void operator=(const cmGeneratorExpression &); |