[Cmake-commits] CMake branch, next, updated. v3.6.1-1715-g6e3215e

Brad King brad.king at kitware.com
Fri Sep 2 09:20:42 EDT 2016


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  6e3215e77b4d73acf662ddcddbaf9f762dde77e6 (commit)
       via  228f4e9b336757ddbf3085637e47962692278c45 (commit)
       via  b481ddb3df21e02e16038854ec7d256601717018 (commit)
      from  c9121b67058dbb5bc2a4d57b8546e5b058d43871 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6e3215e77b4d73acf662ddcddbaf9f762dde77e6
commit 6e3215e77b4d73acf662ddcddbaf9f762dde77e6
Merge: c9121b6 228f4e9
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Fri Sep 2 09:20:37 2016 -0400
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Sep 2 09:20:37 2016 -0400

    Merge branch 'autogen-base32' into next


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=228f4e9b336757ddbf3085637e47962692278c45
commit 228f4e9b336757ddbf3085637e47962692278c45
Author:     Sebastian Holtermann <sebholt at xwmw.org>
AuthorDate: Thu Sep 1 13:17:58 2016 +0200
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Sep 2 09:19:00 2016 -0400

    cmFilePathUuid: Use Base32 string instead of Base64 string
    
    This produces files that will not collide on a case-insensitive
    filesystem.  It also avoids the need for special character
    substitutions.

diff --git a/Source/cmFilePathUuid.cxx b/Source/cmFilePathUuid.cxx
index 2839b63..f99646c 100644
--- a/Source/cmFilePathUuid.cxx
+++ b/Source/cmFilePathUuid.cxx
@@ -12,10 +12,10 @@
 
 #include "cmFilePathUuid.h"
 
+#include "cmBase32.h"
 #include "cmCryptoHash.h"
 #include "cmMakefile.h"
 #include "cmSystemTools.h"
-#include "cmsys/Base64.h"
 
 cmFilePathUuid::cmFilePathUuid(cmMakefile* makefile)
 {
@@ -111,22 +111,16 @@ std::string cmFilePathUuid::GetChecksumString(
   const std::string& sourceFilename, const std::string& sourceRelPath,
   const std::string& sourceRelSeed)
 {
-  std::string checksumBase64;
+  std::string checksumBase32;
   {
     // Calculate the file ( seed + relative path + name ) checksum
     std::vector<unsigned char> hashBytes =
       cmCryptoHash::New("SHA256")->ByteHashString(
         (sourceRelSeed + sourceRelPath + sourceFilename).c_str());
-    // Convert hash bytes to Base64 text string
-    std::vector<unsigned char> base64Bytes(hashBytes.size() * 2, 0);
-    cmsysBase64_Encode(&hashBytes[0], hashBytes.size(), &base64Bytes[0], 0);
-    checksumBase64 = reinterpret_cast<const char*>(&base64Bytes[0]);
+
+    checksumBase32 =
+      cmBase32Encoder().encodeString(&hashBytes[0], hashBytes.size(), false);
   }
-  // Base64 allows '/', '+' and '=' characters which are problematic
-  // when used in file names. Replace them with safer alternatives.
-  std::replace(checksumBase64.begin(), checksumBase64.end(), '/', '-');
-  std::replace(checksumBase64.begin(), checksumBase64.end(), '+', '_');
-  std::replace(checksumBase64.begin(), checksumBase64.end(), '=', '_');
 
-  return checksumBase64;
+  return checksumBase32;
 }

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=b481ddb3df21e02e16038854ec7d256601717018
commit b481ddb3df21e02e16038854ec7d256601717018
Author:     Sebastian Holtermann <sebholt at xwmw.org>
AuthorDate: Thu Sep 1 13:08:18 2016 +0200
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Sep 2 09:18:59 2016 -0400

    Add cmBase32Encoder class

diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 8c74f60..6c3ebf5 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -166,6 +166,7 @@ endif()
 #
 set(SRCS
   cmArchiveWrite.cxx
+  cmBase32.cxx
   cmBootstrapCommands1.cxx
   cmBootstrapCommands2.cxx
   cmCacheManager.cxx
diff --git a/Source/cmBase32.cxx b/Source/cmBase32.cxx
new file mode 100644
index 0000000..ce5c99b
--- /dev/null
+++ b/Source/cmBase32.cxx
@@ -0,0 +1,108 @@
+/*============================================================================
+  CMake - Cross Platform Makefile Generator
+  Copyright 2016 Sebastian Holtermann <sebholt at xwmw.org>
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+============================================================================*/
+#include "cmBase32.h"
+
+// -- Static functions
+
+static const unsigned char Base32EncodeTable[33] =
+  "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
+
+inline unsigned char Base32EncodeChar(int schar)
+{
+  return Base32EncodeTable[schar];
+}
+
+void Base32Encode5(const unsigned char src[5], char dst[8])
+{
+  // [0]:5 bits
+  dst[0] = Base32EncodeChar((src[0] >> 3) & 0x1F);
+  // [0]:3 bits + [1]:2 bits
+  dst[1] = Base32EncodeChar(((src[0] << 2) & 0x1C) + ((src[1] >> 6) & 0x03));
+  // [1]:5 bits
+  dst[2] = Base32EncodeChar((src[1] >> 1) & 0x1F);
+  // [1]:1 bit + [2]:4 bits
+  dst[3] = Base32EncodeChar(((src[1] << 4) & 0x10) + ((src[2] >> 4) & 0x0F));
+  // [2]:4 bits + [3]:1 bit
+  dst[4] = Base32EncodeChar(((src[2] << 1) & 0x1E) + ((src[3] >> 7) & 0x01));
+  // [3]:5 bits
+  dst[5] = Base32EncodeChar((src[3] >> 2) & 0x1F);
+  // [3]:2 bits + [4]:3 bit
+  dst[6] = Base32EncodeChar(((src[3] << 3) & 0x18) + ((src[4] >> 5) & 0x07));
+  // [4]:5 bits
+  dst[7] = Base32EncodeChar((src[4] << 0) & 0x1F);
+}
+
+// -- Class methods
+
+cmBase32Encoder::cmBase32Encoder()
+{
+}
+
+cmBase32Encoder::~cmBase32Encoder()
+{
+}
+
+std::string cmBase32Encoder::encodeString(const unsigned char* input,
+                                          size_t len, bool padding)
+{
+  std::string res;
+
+  static const size_t blockSize = 5;
+  static const size_t bufferSize = 8;
+  char buffer[bufferSize];
+
+  const unsigned char* end = input + len;
+  while ((input + blockSize) <= end) {
+    Base32Encode5(input, buffer);
+    res.append(buffer, bufferSize);
+    input += blockSize;
+  }
+
+  size_t remain(end - input);
+  if (remain != 0) {
+    // Temporary source buffer filled up with 0s
+    unsigned char extended[blockSize];
+    for (size_t ii = 0; ii != remain; ++ii) {
+      extended[ii] = input[ii];
+    }
+    for (size_t ii = remain; ii != blockSize; ++ii) {
+      extended[ii] = 0;
+    }
+
+    Base32Encode5(extended, buffer);
+    size_t numPad(0);
+    switch (remain) {
+      case 1:
+        numPad = 6;
+        break;
+      case 2:
+        numPad = 4;
+        break;
+      case 3:
+        numPad = 3;
+        break;
+      case 4:
+        numPad = 1;
+        break;
+      default:
+        break;
+    }
+    res.append(buffer, bufferSize - numPad);
+    if (padding) {
+      for (size_t ii = 0; ii != numPad; ++ii) {
+        res.push_back(paddingChar);
+      }
+    }
+  }
+
+  return res;
+}
diff --git a/Source/cmBase32.h b/Source/cmBase32.h
new file mode 100644
index 0000000..66ff8ba
--- /dev/null
+++ b/Source/cmBase32.h
@@ -0,0 +1,42 @@
+/*============================================================================
+  CMake - Cross Platform Makefile Generator
+  Copyright 2016 Sebastian Holtermann <sebholt at xwmw.org>
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+============================================================================*/
+#ifndef cmBase32_h
+#define cmBase32_h
+
+#include <cmConfigure.h> // IWYU pragma: keep
+
+#include <stddef.h>
+#include <string>
+
+/** \class cmBase32Encoder
+ * \brief Encodes a byte sequence to a Base32 byte sequence according to
+ * RFC4648
+ *
+ */
+class cmBase32Encoder
+{
+public:
+  static const char paddingChar = '=';
+
+public:
+  cmBase32Encoder();
+  ~cmBase32Encoder();
+
+  // Encodes the given input byte sequence into a string
+  // @arg input Input data pointer
+  // @arg len Input data size
+  // @arg padding Flag to append "=" on demand
+  std::string encodeString(const unsigned char* input, size_t len,
+                           bool padding = true);
+};
+
+#endif

-----------------------------------------------------------------------

Summary of changes:


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list