소스 검색

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

Brad King 23 년 전
부모
커밋
a8d038dbd0
2개의 변경된 파일34개의 추가작업 그리고 2개의 파일을 삭제
  1. 28 0
      Source/cmSystemTools.cxx
  2. 6 2
      Source/cmSystemTools.h

+ 28 - 0
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.

+ 6 - 2
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.
    */