[Cmake-commits] CMake branch, next, updated. v3.6.1-1676-g53f189c
Brad King
brad.king at kitware.com
Thu Sep 1 10:58:09 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 53f189c917de7b6657524f08e18502f445693712 (commit)
via 46de2f5b1cf1faa3bc18659b592306753c61f66c (commit)
via 67dba415e6f3a9d45d84c7790c4447625f917999 (commit)
from b93f03c8e15a8a2dde9cdfb9d239d304adbaee8d (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=53f189c917de7b6657524f08e18502f445693712
commit 53f189c917de7b6657524f08e18502f445693712
Merge: b93f03c 46de2f5
Author: Brad King <brad.king at kitware.com>
AuthorDate: Thu Sep 1 10:58:07 2016 -0400
Commit: CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Thu Sep 1 10:58:07 2016 -0400
Merge topic 'autogen-base32' into next
46de2f5b cmFilePathUuid: Use Base32 string instead of Base64 string
67dba415 Add cmBase32Encoder class
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=46de2f5b1cf1faa3bc18659b592306753c61f66c
commit 46de2f5b1cf1faa3bc18659b592306753c61f66c
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: Thu Sep 1 10:51:15 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=67dba415e6f3a9d45d84c7790c4447625f917999
commit 67dba415e6f3a9d45d84c7790c4447625f917999
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: Thu Sep 1 10:51:15 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..38c955b
--- /dev/null
+++ b/Source/cmBase32.h
@@ -0,0 +1,41 @@
+/*============================================================================
+ 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 <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:
Source/CMakeLists.txt | 1 +
Source/cmBase32.cxx | 108 +++++++++++++++++++++++++++++++++++++++++++++
Source/cmBase32.h | 41 +++++++++++++++++
Source/cmFilePathUuid.cxx | 18 +++-----
4 files changed, 156 insertions(+), 12 deletions(-)
create mode 100644 Source/cmBase32.cxx
create mode 100644 Source/cmBase32.h
hooks/post-receive
--
CMake
More information about the Cmake-commits
mailing list