Commit a8d038db authored by Brad King's avatar Brad King
Browse files

ENH: Added Split method to cmSystemTools to split a string into lines on its newlines.

parent 3d3d7a91
......@@ -1894,6 +1894,34 @@ std::string cmSystemTools::CollapseFullPath(const char* in_name)
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.
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));
// 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.
......@@ -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.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment