From 8477aa59e5b5f52f81cc140012471faaeba11dbd Mon Sep 17 00:00:00 2001
From: Andy Cedilnik <andy.cedilnik@kitware.com>
Date: Sun, 1 Jan 2006 23:31:17 -0500
Subject: [PATCH] ENH: Merge from cpack branch

---
 Source/CMakeLists.txt    | 23 ++++++++++++++++++++
 Source/cmSystemTools.cxx | 45 ++++++++++++++++++++++++++++++++++++++++
 Source/cmSystemTools.h   |  3 +++
 3 files changed, 71 insertions(+)

diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 10828ebc66..d6adea7bb6 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -7,6 +7,10 @@ CONFIGURE_FILE(
   "${CMake_SOURCE_DIR}/Source/cmConfigure.cmake.h.in"
   "${CMake_BINARY_DIR}/Source/cmConfigure.h"
   )
+CONFIGURE_FILE(
+  "${CMake_SOURCE_DIR}/Source/CPack/cmCPackConfigure.h.in"
+  "${CMake_BINARY_DIR}/Source/CPack/cmCPackConfigure.h"
+  )
 
 # add the include path to find the .h 
 INCLUDE_DIRECTORIES(
@@ -247,6 +251,21 @@ SET(CMTEST_SRCS cmCTest.cxx
 ADD_LIBRARY(CTestLib ${CMTEST_SRCS})
 TARGET_LINK_LIBRARIES(CTestLib CMakeLib ${CMAKE_CURL_LIBRARIES} ${CMAKE_XMLRPC_LIBRARIES})
 
+#
+# Sources for CPack
+#
+SET(CPACK_SRCS
+  CPack/cmCPackGenerators.cxx
+  CPack/cmCPackSTGZGenerator.cxx
+  CPack/cmCPackTGZGenerator.cxx
+  CPack/cmCPackNSISGenerator.cxx
+  CPack/cmCPackPackageMakerGenerator.cxx
+  CPack/cmCPackGenericGenerator.cxx
+  )
+# Build CPackLib
+ADD_LIBRARY(CPackLib ${CPACK_SRCS})
+TARGET_LINK_LIBRARIES(CPackLib CMakeLib)
+
 # Build CMake executable
 ADD_EXECUTABLE(cmake cmakemain.cxx)
 TARGET_LINK_LIBRARIES(cmake CMakeLib)
@@ -265,6 +284,10 @@ ENDIF(WIN32)
 ADD_EXECUTABLE(ctest ctest.cxx)
 TARGET_LINK_LIBRARIES(ctest CTestLib)
 
+# Build CPack executable
+ADD_EXECUTABLE(cpack CPack/cpack.cxx)
+TARGET_LINK_LIBRARIES(cpack CPackLib)
+
 # Curses GUI
 IF (UNIX)
   INCLUDE (${CMake_SOURCE_DIR}/Modules/FindCurses.cmake OPTIONAL)
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 45fa836d34..85d17868f4 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -1353,6 +1353,51 @@ bool cmSystemTools::PutEnv(const char* value)
   return ret == 0;
 }
 
+std::string cmSystemTools::MakeXMLSafe(const char* str)
+{
+  std::vector<char> result;
+  result.reserve(500);
+  const char* pos = str;
+  for ( ;*pos; ++pos)
+    {
+    char ch = *pos;
+    if ( (ch > 126 || ch < 32) && ch != 9  && ch != 10 && ch != 13 && ch != '\r' )
+      {
+      char buffer[33];
+      sprintf(buffer, "&lt;%d&gt;", (int)ch);
+      //sprintf(buffer, "&#x%0x;", (unsigned int)ch);
+      result.insert(result.end(), buffer, buffer+strlen(buffer));
+      }
+    else
+      {
+      const char* const encodedChars[] = {
+        "&amp;",
+        "&lt;",
+        "&gt;"
+      };
+      switch ( ch )
+        {
+        case '&':
+          result.insert(result.end(), encodedChars[0], encodedChars[0]+5);
+          break;
+        case '<':
+          result.insert(result.end(), encodedChars[1], encodedChars[1]+4);
+          break;
+        case '>':
+          result.insert(result.end(), encodedChars[2], encodedChars[2]+4);
+          break;
+        case '\n':
+          result.push_back('\n');
+          break;
+        case '\r': break; // Ignore \r
+        default:
+          result.push_back(ch);
+        }
+      }
+    }
+  return std::string(&*result.begin(), result.size());
+}
+
 bool cmSystemTools::IsPathToFramework(const char* path)
 {
   if(cmSystemTools::FileIsFullPath(path))
diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h
index 181d51362e..2895fff2b9 100644
--- a/Source/cmSystemTools.h
+++ b/Source/cmSystemTools.h
@@ -297,6 +297,9 @@ public:
       of the form var=value */
   static bool PutEnv(const char* value);
 
+  /** Make string XML safe */
+  static std::string MakeXMLSafe(const char* str);
+
   /** Create tar */
   static bool ListTar(const char* outFileName, std::vector<cmStdString>& files, bool gzip, bool verbose);
   static bool CreateTar(const char* outFileName, const std::vector<cmStdString>& files, bool gzip, bool verbose);
-- 
GitLab