diff options
-rw-r--r-- | Source/cmSystemTools.cxx | 28 | ||||
-rw-r--r-- | Source/cmSystemTools.h | 8 |
2 files changed, 34 insertions, 2 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 1941165c0f..8bcaa848ac 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1894,6 +1894,34 @@ std::string cmSystemTools::CollapseFullPath(const char* in_name) #endif } +bool cmSystemTools::Split(const char* str, std::vector<cmStdString>& lines) +{ + std::string data(str); + std::string::size_type lpos = 0; + while(lpos < data.length()) + { + std::string::size_type rpos = data.find_first_of("\n", lpos); + if(rpos == std::string::npos) + { + // Line ends at end of string without a newline. + lines.push_back(data.substr(lpos)); + return false; + } + if((rpos > lpos) && (data[rpos-1] == '\r')) + { + // Line ends in a "\r\n" pair, remove both characters. + lines.push_back(data.substr(lpos, (rpos-1)-lpos)); + } + else + { + // Line ends in a "\n", remove the character. + lines.push_back(data.substr(lpos, rpos-lpos)); + } + lpos = rpos+1; + } + return true; +} + /** * Return path of a full filename (no trailing slashes). * Warning: returned path is converted to Unix slashes format. diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 04806cd477..879f5c827b 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -218,11 +218,11 @@ public: ///! Find a file in the system PATH, with optional extra paths. static std::string FindFile(const char* name, - const std::vector<std::string>& path= std::vector<std::string>()); + const std::vector<std::string>& path= std::vector<std::string>()); ///! Find an executable in the system PATH, with optional extra paths. static std::string FindProgram(const char* name, - const std::vector<std::string>& path = std::vector<std::string>(), + const std::vector<std::string>& path = std::vector<std::string>(), bool no_system_path = false); ///! Find a library in the system PATH, with optional extra paths. @@ -293,6 +293,10 @@ public: static void EnableRunCommandOutput() {s_DisableRunCommandOutput = false; } static bool GetRunCommandOutput() { return s_DisableRunCommandOutput; } + /** Split a string on its newlines into multiple lines. Returns + false only if the last line stored had no newline. */ + static bool Split(const char* str, std::vector<cmStdString>& lines); + /** * Come constants for different file formats. */ |