mirror of
https://github.com/ScrelliCopter/tmx2gba.git
synced 2025-02-21 03:29:25 +11:00
base64: restore bundled & update tmxlite to use bundled version
This commit is contained in:
@@ -40,6 +40,8 @@ else()
|
|||||||
find_package(ZSTD REQUIRED)
|
find_package(ZSTD REQUIRED)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory(ext/base64)
|
||||||
|
|
||||||
if (USE_BUNDLED_TMXLITE)
|
if (USE_BUNDLED_TMXLITE)
|
||||||
add_subdirectory(ext/tmxlite)
|
add_subdirectory(ext/tmxlite)
|
||||||
else()
|
else()
|
||||||
|
|||||||
5
ext/base64/CMakeLists.txt
Normal file
5
ext/base64/CMakeLists.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
add_library(base64
|
||||||
|
base64.cpp base64.h)
|
||||||
|
add_library(base64::base64 ALIAS base64)
|
||||||
|
target_include_directories(base64
|
||||||
|
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
282
ext/base64/base64.cpp
Normal file
282
ext/base64/base64.cpp
Normal file
@@ -0,0 +1,282 @@
|
|||||||
|
/*
|
||||||
|
base64.cpp and base64.h
|
||||||
|
|
||||||
|
base64 encoding and decoding with C++.
|
||||||
|
More information at
|
||||||
|
https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp
|
||||||
|
|
||||||
|
Version: 2.rc.08 (release candidate)
|
||||||
|
|
||||||
|
Copyright (C) 2004-2017, 2020, 2021 René Nyffenegger
|
||||||
|
|
||||||
|
This source code is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the author be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this source code must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original source code. If you use this source code
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original source code.
|
||||||
|
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "base64.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
//
|
||||||
|
// Depending on the url parameter in base64_chars, one of
|
||||||
|
// two sets of base64 characters needs to be chosen.
|
||||||
|
// They differ in their last two characters.
|
||||||
|
//
|
||||||
|
static const char* base64_chars[2] = {
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
"abcdefghijklmnopqrstuvwxyz"
|
||||||
|
"0123456789"
|
||||||
|
"+/",
|
||||||
|
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
"abcdefghijklmnopqrstuvwxyz"
|
||||||
|
"0123456789"
|
||||||
|
"-_"};
|
||||||
|
|
||||||
|
static unsigned int pos_of_char(const unsigned char chr) {
|
||||||
|
//
|
||||||
|
// Return the position of chr within base64_encode()
|
||||||
|
//
|
||||||
|
|
||||||
|
if (chr >= 'A' && chr <= 'Z') return chr - 'A';
|
||||||
|
else if (chr >= 'a' && chr <= 'z') return chr - 'a' + ('Z' - 'A') + 1;
|
||||||
|
else if (chr >= '0' && chr <= '9') return chr - '0' + ('Z' - 'A') + ('z' - 'a') + 2;
|
||||||
|
else if (chr == '+' || chr == '-') return 62; // Be liberal with input and accept both url ('-') and non-url ('+') base 64 characters (
|
||||||
|
else if (chr == '/' || chr == '_') return 63; // Ditto for '/' and '_'
|
||||||
|
else
|
||||||
|
//
|
||||||
|
// 2020-10-23: Throw std::exception rather than const char*
|
||||||
|
//(Pablo Martin-Gomez, https://github.com/Bouska)
|
||||||
|
//
|
||||||
|
throw std::runtime_error("Input is not valid base64-encoded data.");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string insert_linebreaks(std::string str, size_t distance) {
|
||||||
|
//
|
||||||
|
// Provided by https://github.com/JomaCorpFX, adapted by me.
|
||||||
|
//
|
||||||
|
if (!str.length()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t pos = distance;
|
||||||
|
|
||||||
|
while (pos < str.size()) {
|
||||||
|
str.insert(pos, "\n");
|
||||||
|
pos += distance + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename String, unsigned int line_length>
|
||||||
|
static std::string encode_with_line_breaks(String s) {
|
||||||
|
return insert_linebreaks(base64_encode(s, false), line_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename String>
|
||||||
|
static std::string encode_pem(String s) {
|
||||||
|
return encode_with_line_breaks<String, 64>(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename String>
|
||||||
|
static std::string encode_mime(String s) {
|
||||||
|
return encode_with_line_breaks<String, 76>(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename String>
|
||||||
|
static std::string encode(String s, bool url) {
|
||||||
|
return base64_encode(reinterpret_cast<const unsigned char*>(s.data()), s.length(), url);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string base64_encode(unsigned char const* bytes_to_encode, size_t in_len, bool url) {
|
||||||
|
|
||||||
|
size_t len_encoded = (in_len +2) / 3 * 4;
|
||||||
|
|
||||||
|
unsigned char trailing_char = url ? '.' : '=';
|
||||||
|
|
||||||
|
//
|
||||||
|
// Choose set of base64 characters. They differ
|
||||||
|
// for the last two positions, depending on the url
|
||||||
|
// parameter.
|
||||||
|
// A bool (as is the parameter url) is guaranteed
|
||||||
|
// to evaluate to either 0 or 1 in C++ therefore,
|
||||||
|
// the correct character set is chosen by subscripting
|
||||||
|
// base64_chars with url.
|
||||||
|
//
|
||||||
|
const char* base64_chars_ = base64_chars[url];
|
||||||
|
|
||||||
|
std::string ret;
|
||||||
|
ret.reserve(len_encoded);
|
||||||
|
|
||||||
|
unsigned int pos = 0;
|
||||||
|
|
||||||
|
while (pos < in_len) {
|
||||||
|
ret.push_back(base64_chars_[(bytes_to_encode[pos + 0] & 0xfc) >> 2]);
|
||||||
|
|
||||||
|
if (pos+1 < in_len) {
|
||||||
|
ret.push_back(base64_chars_[((bytes_to_encode[pos + 0] & 0x03) << 4) + ((bytes_to_encode[pos + 1] & 0xf0) >> 4)]);
|
||||||
|
|
||||||
|
if (pos+2 < in_len) {
|
||||||
|
ret.push_back(base64_chars_[((bytes_to_encode[pos + 1] & 0x0f) << 2) + ((bytes_to_encode[pos + 2] & 0xc0) >> 6)]);
|
||||||
|
ret.push_back(base64_chars_[ bytes_to_encode[pos + 2] & 0x3f]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret.push_back(base64_chars_[(bytes_to_encode[pos + 1] & 0x0f) << 2]);
|
||||||
|
ret.push_back(trailing_char);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
ret.push_back(base64_chars_[(bytes_to_encode[pos + 0] & 0x03) << 4]);
|
||||||
|
ret.push_back(trailing_char);
|
||||||
|
ret.push_back(trailing_char);
|
||||||
|
}
|
||||||
|
|
||||||
|
pos += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename String>
|
||||||
|
static std::string decode(String encoded_string, bool remove_linebreaks) {
|
||||||
|
//
|
||||||
|
// decode(…) is templated so that it can be used with String = const std::string&
|
||||||
|
// or std::string_view (requires at least C++17)
|
||||||
|
//
|
||||||
|
|
||||||
|
if (encoded_string.empty()) return std::string();
|
||||||
|
|
||||||
|
if (remove_linebreaks) {
|
||||||
|
|
||||||
|
std::string copy(encoded_string);
|
||||||
|
|
||||||
|
copy.erase(std::remove(copy.begin(), copy.end(), '\n'), copy.end());
|
||||||
|
|
||||||
|
return base64_decode(copy, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t length_of_string = encoded_string.length();
|
||||||
|
size_t pos = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// The approximate length (bytes) of the decoded string might be one or
|
||||||
|
// two bytes smaller, depending on the amount of trailing equal signs
|
||||||
|
// in the encoded string. This approximation is needed to reserve
|
||||||
|
// enough space in the string to be returned.
|
||||||
|
//
|
||||||
|
size_t approx_length_of_decoded_string = length_of_string / 4 * 3;
|
||||||
|
std::string ret;
|
||||||
|
ret.reserve(approx_length_of_decoded_string);
|
||||||
|
|
||||||
|
while (pos < length_of_string) {
|
||||||
|
//
|
||||||
|
// Iterate over encoded input string in chunks. The size of all
|
||||||
|
// chunks except the last one is 4 bytes.
|
||||||
|
//
|
||||||
|
// The last chunk might be padded with equal signs or dots
|
||||||
|
// in order to make it 4 bytes in size as well, but this
|
||||||
|
// is not required as per RFC 2045.
|
||||||
|
//
|
||||||
|
// All chunks except the last one produce three output bytes.
|
||||||
|
//
|
||||||
|
// The last chunk produces at least one and up to three bytes.
|
||||||
|
//
|
||||||
|
|
||||||
|
size_t pos_of_char_1 = pos_of_char(encoded_string[pos+1] );
|
||||||
|
|
||||||
|
//
|
||||||
|
// Emit the first output byte that is produced in each chunk:
|
||||||
|
//
|
||||||
|
ret.push_back(static_cast<std::string::value_type>( ( (pos_of_char(encoded_string[pos+0]) ) << 2 ) + ( (pos_of_char_1 & 0x30 ) >> 4)));
|
||||||
|
|
||||||
|
if ( ( pos + 2 < length_of_string ) && // Check for data that is not padded with equal signs (which is allowed by RFC 2045)
|
||||||
|
encoded_string[pos+2] != '=' &&
|
||||||
|
encoded_string[pos+2] != '.' // accept URL-safe base 64 strings, too, so check for '.' also.
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Emit a chunk's second byte (which might not be produced in the last chunk).
|
||||||
|
//
|
||||||
|
unsigned int pos_of_char_2 = pos_of_char(encoded_string[pos+2] );
|
||||||
|
ret.push_back(static_cast<std::string::value_type>( (( pos_of_char_1 & 0x0f) << 4) + (( pos_of_char_2 & 0x3c) >> 2)));
|
||||||
|
|
||||||
|
if ( ( pos + 3 < length_of_string ) &&
|
||||||
|
encoded_string[pos+3] != '=' &&
|
||||||
|
encoded_string[pos+3] != '.'
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Emit a chunk's third byte (which might not be produced in the last chunk).
|
||||||
|
//
|
||||||
|
ret.push_back(static_cast<std::string::value_type>( ( (pos_of_char_2 & 0x03 ) << 6 ) + pos_of_char(encoded_string[pos+3]) ));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pos += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string base64_decode(std::string const& s, bool remove_linebreaks) {
|
||||||
|
return decode(s, remove_linebreaks);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string base64_encode(std::string const& s, bool url) {
|
||||||
|
return encode(s, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string base64_encode_pem (std::string const& s) {
|
||||||
|
return encode_pem(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string base64_encode_mime(std::string const& s) {
|
||||||
|
return encode_mime(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if __cplusplus >= 201703L
|
||||||
|
//
|
||||||
|
// Interface with std::string_view rather than const std::string&
|
||||||
|
// Requires C++17
|
||||||
|
// Provided by Yannic Bonenberger (https://github.com/Yannic)
|
||||||
|
//
|
||||||
|
|
||||||
|
std::string base64_encode(std::string_view s, bool url) {
|
||||||
|
return encode(s, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string base64_encode_pem(std::string_view s) {
|
||||||
|
return encode_pem(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string base64_encode_mime(std::string_view s) {
|
||||||
|
return encode_mime(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string base64_decode(std::string_view s, bool remove_linebreaks) {
|
||||||
|
return decode(s, remove_linebreaks);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __cplusplus >= 201703L
|
||||||
35
ext/base64/base64.h
Normal file
35
ext/base64/base64.h
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
//
|
||||||
|
// base64 encoding and decoding with C++.
|
||||||
|
// Version: 2.rc.08 (release candidate)
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A
|
||||||
|
#define BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#if __cplusplus >= 201703L
|
||||||
|
#include <string_view>
|
||||||
|
#endif // __cplusplus >= 201703L
|
||||||
|
|
||||||
|
std::string base64_encode (std::string const& s, bool url = false);
|
||||||
|
std::string base64_encode_pem (std::string const& s);
|
||||||
|
std::string base64_encode_mime(std::string const& s);
|
||||||
|
|
||||||
|
std::string base64_decode(std::string const& s, bool remove_linebreaks = false);
|
||||||
|
std::string base64_encode(unsigned char const*, size_t len, bool url = false);
|
||||||
|
|
||||||
|
#if __cplusplus >= 201703L
|
||||||
|
//
|
||||||
|
// Interface with std::string_view rather than const std::string&
|
||||||
|
// Requires C++17
|
||||||
|
// Provided by Yannic Bonenberger (https://github.com/Yannic)
|
||||||
|
//
|
||||||
|
std::string base64_encode (std::string_view s, bool url = false);
|
||||||
|
std::string base64_encode_pem (std::string_view s);
|
||||||
|
std::string base64_encode_mime(std::string_view s);
|
||||||
|
|
||||||
|
std::string base64_decode(std::string_view s, bool remove_linebreaks = false);
|
||||||
|
#endif // __cplusplus >= 201703L
|
||||||
|
|
||||||
|
#endif /* BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A */
|
||||||
@@ -27,6 +27,8 @@ if (MSVC)
|
|||||||
target_compile_definitions(tmxlite PRIVATE _CRT_SECURE_NO_WARNINGS)
|
target_compile_definitions(tmxlite PRIVATE _CRT_SECURE_NO_WARNINGS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
target_link_libraries(tmxlite base64::base64)
|
||||||
|
|
||||||
if (USE_BUNDLED_PUGIXML)
|
if (USE_BUNDLED_PUGIXML)
|
||||||
target_link_libraries(tmxlite pugixml::static)
|
target_link_libraries(tmxlite pugixml::static)
|
||||||
else()
|
else()
|
||||||
|
|||||||
@@ -25,30 +25,6 @@ and must not be misrepresented as being the original software.
|
|||||||
source distribution.
|
source distribution.
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
base64_decode
|
|
||||||
|
|
||||||
Copyright (C) 2004-2008 René Nyffenegger
|
|
||||||
This source code is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the author be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this source code must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original source code. If you use this source code
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original source code.
|
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
|
||||||
|
|
||||||
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <tmxlite/detail/Android.hpp>
|
#include <tmxlite/detail/Android.hpp>
|
||||||
@@ -66,72 +42,6 @@ namespace tmx
|
|||||||
//using inline here just to supress unused warnings on gcc
|
//using inline here just to supress unused warnings on gcc
|
||||||
bool decompress(const char* source, std::vector<unsigned char>& dest, std::size_t inSize, std::size_t expectedSize);
|
bool decompress(const char* source, std::vector<unsigned char>& dest, std::size_t inSize, std::size_t expectedSize);
|
||||||
|
|
||||||
static inline std::string base64_decode(std::string const& encoded_string)
|
|
||||||
{
|
|
||||||
static const std::string base64_chars =
|
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
||||||
"abcdefghijklmnopqrstuvwxyz"
|
|
||||||
"0123456789+/";
|
|
||||||
|
|
||||||
std::function<bool(unsigned char)> is_base64 =
|
|
||||||
[](unsigned char c)->bool
|
|
||||||
{
|
|
||||||
return (isalnum(c) || (c == '+') || (c == '/'));
|
|
||||||
};
|
|
||||||
|
|
||||||
auto in_len = encoded_string.size();
|
|
||||||
int i = 0;
|
|
||||||
int j = 0;
|
|
||||||
int in_ = 0;
|
|
||||||
unsigned char char_array_4[4], char_array_3[3];
|
|
||||||
std::string ret;
|
|
||||||
|
|
||||||
while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_]))
|
|
||||||
{
|
|
||||||
char_array_4[i++] = encoded_string[in_]; in_++;
|
|
||||||
if (i == 4)
|
|
||||||
{
|
|
||||||
for (i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
char_array_4[i] = static_cast<unsigned char>(base64_chars.find(char_array_4[i]));
|
|
||||||
}
|
|
||||||
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
|
|
||||||
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
|
||||||
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
|
|
||||||
|
|
||||||
for (i = 0; (i < 3); i++)
|
|
||||||
{
|
|
||||||
ret += char_array_3[i];
|
|
||||||
}
|
|
||||||
i = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i)
|
|
||||||
{
|
|
||||||
for (j = i; j < 4; j++)
|
|
||||||
{
|
|
||||||
char_array_4[j] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0; j < 4; j++)
|
|
||||||
{
|
|
||||||
char_array_4[j] = static_cast<unsigned char>(base64_chars.find(char_array_4[j]));
|
|
||||||
}
|
|
||||||
|
|
||||||
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
|
|
||||||
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
|
||||||
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
|
|
||||||
|
|
||||||
for (j = 0; (j < i - 1); j++)
|
|
||||||
{
|
|
||||||
ret += char_array_3[j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline Colour colourFromString(std::string str)
|
static inline Colour colourFromString(std::string str)
|
||||||
{
|
{
|
||||||
//removes preceding #
|
//removes preceding #
|
||||||
|
|||||||
@@ -26,15 +26,13 @@ source distribution.
|
|||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
#include <pugixml.hpp>
|
#include <pugixml.hpp>
|
||||||
|
|
||||||
#ifdef USE_ZSTD
|
#ifdef USE_ZSTD
|
||||||
#include <zstd.h>
|
# include <zstd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include "base64.h"
|
||||||
#include <tmxlite/FreeFuncs.hpp>
|
#include "tmxlite/FreeFuncs.hpp"
|
||||||
#include <tmxlite/TileLayer.hpp>
|
#include "tmxlite/TileLayer.hpp"
|
||||||
#include <tmxlite/detail/Log.hpp>
|
#include "tmxlite/detail/Log.hpp"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
using namespace tmx;
|
using namespace tmx;
|
||||||
|
|||||||
Reference in New Issue
Block a user