forked from alterware/iw6-mod
Compare commits
3 Commits
color_stri
...
cmd_line_h
Author | SHA1 | Date | |
---|---|---|---|
1db89c64c6 | |||
51e831cbfe | |||
50aa4097bb |
35
src/common/utils/command_line.cpp
Normal file
35
src/common/utils/command_line.cpp
Normal file
@ -0,0 +1,35 @@
|
||||
#include "command_line.hpp"
|
||||
#include "nt.hpp"
|
||||
|
||||
#include <shellapi.h>
|
||||
#include <winrt/Windows.Foundation.h>
|
||||
|
||||
namespace utils::command_line
|
||||
{
|
||||
template <typename type, typename deleter>
|
||||
constexpr std::unique_ptr<type, deleter> make_unique_ptr(type* ptr, deleter&& del)
|
||||
{
|
||||
return std::unique_ptr<type, deleter&&>(ptr, std::forward<deleter>(del));
|
||||
}
|
||||
|
||||
const std::vector<std::filesystem::path>& get_args()
|
||||
{
|
||||
static const auto args = []()
|
||||
{
|
||||
auto argc = 0;
|
||||
const auto cmd_line = winrt::check_pointer(::GetCommandLineW());
|
||||
const auto up = make_unique_ptr(winrt::check_pointer(::CommandLineToArgvW(cmd_line, &argc)), ::LocalFree);
|
||||
const auto argv = up.get();
|
||||
|
||||
std::vector<std::filesystem::path> vec(argc);
|
||||
std::transform(argv, argv + argc, vec.begin(), [](const auto* path)
|
||||
{
|
||||
return std::filesystem::path(path);
|
||||
});
|
||||
|
||||
return vec;
|
||||
}();
|
||||
|
||||
return args;
|
||||
}
|
||||
}
|
9
src/common/utils/command_line.hpp
Normal file
9
src/common/utils/command_line.hpp
Normal file
@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <filesystem>
|
||||
#include <vector>
|
||||
|
||||
namespace utils::command_line
|
||||
{
|
||||
[[nodiscard]] const std::vector<std::filesystem::path>& get_args();
|
||||
}
|
@ -109,6 +109,86 @@ namespace utils::compression
|
||||
result.resize(length);
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<std::uint8_t> decompress(std::span<const std::uint8_t> input, std::size_t exp_output_size, double growth_rate)
|
||||
{
|
||||
auto decompress_internal = [](std::uint8_t* output, uLong* output_size, const std::uint8_t* input, uLong* input_size)
|
||||
{
|
||||
return uncompress2(
|
||||
reinterpret_cast<Bytef*>(output), output_size,
|
||||
reinterpret_cast<const Bytef*>(input), input_size
|
||||
);
|
||||
};
|
||||
|
||||
auto output_size = static_cast<uLong>(std::max(exp_output_size, std::size_t(256)));
|
||||
std::vector<std::uint8_t> output(output_size);
|
||||
|
||||
auto input_size = static_cast<uLong>(input.size());
|
||||
auto status = decompress_internal(output.data(), &output_size, input.data(), &input_size);
|
||||
|
||||
if (status == Z_BUF_ERROR)
|
||||
{
|
||||
const auto decompression_ratio = (input_size / static_cast<double>(output.size())) - 0.04;
|
||||
output_size = static_cast<uLong>(std::max(input.size() / decompression_ratio, static_cast<double>(output_size)));
|
||||
output.resize(output_size);
|
||||
|
||||
input_size = static_cast<uLong>(input.size());
|
||||
status = decompress_internal(output.data(), &output_size, input.data(), &input_size);
|
||||
}
|
||||
|
||||
for (growth_rate = std::max(growth_rate, 1.0); status == Z_BUF_ERROR;)
|
||||
{
|
||||
output_size = 4 + static_cast<uLong>(growth_rate * output.size());
|
||||
output.resize(output_size);
|
||||
|
||||
input_size = static_cast<uLong>(input.size());
|
||||
status = decompress_internal(output.data(), &output_size, input.data(), &input_size);
|
||||
}
|
||||
|
||||
if (status != Z_OK)
|
||||
{
|
||||
output.clear();
|
||||
return output;
|
||||
}
|
||||
|
||||
output.resize(output_size);
|
||||
return output;
|
||||
}
|
||||
|
||||
std::vector<std::uint8_t> compress(std::span<const std::uint8_t> input, std::size_t exp_output_size, double growth_rate)
|
||||
{
|
||||
auto compress_internal = [](std::uint8_t* output, uLong* output_size, const std::uint8_t* input, uLong input_size)
|
||||
{
|
||||
return compress2(
|
||||
reinterpret_cast<Bytef*>(output), output_size,
|
||||
reinterpret_cast<const Bytef*>(input), input_size,
|
||||
Z_BEST_COMPRESSION
|
||||
);
|
||||
};
|
||||
|
||||
auto output_size = static_cast<uLong>(std::max(exp_output_size, std::size_t(256)));
|
||||
std::vector<std::uint8_t> output(output_size);
|
||||
|
||||
const auto input_size = static_cast<uLong>(input.size());
|
||||
auto status = compress_internal(output.data(), &output_size, input.data(), input_size);
|
||||
|
||||
for (growth_rate = std::max(growth_rate, 1.0); status == Z_BUF_ERROR;)
|
||||
{
|
||||
output_size = 4 + static_cast<uLong>(growth_rate * output.size());
|
||||
output.resize(output_size);
|
||||
|
||||
status = compress_internal(output.data(), &output_size, input.data(), input_size);
|
||||
}
|
||||
|
||||
if (status != Z_OK)
|
||||
{
|
||||
output.clear();
|
||||
return output;
|
||||
}
|
||||
|
||||
output.resize(output_size);
|
||||
return output;
|
||||
}
|
||||
}
|
||||
|
||||
namespace zip
|
||||
|
@ -1,7 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <span>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
#define CHUNK 16384u
|
||||
|
||||
@ -11,6 +13,9 @@ namespace utils::compression
|
||||
{
|
||||
std::string compress(const std::string& data);
|
||||
std::string decompress(const std::string& data);
|
||||
|
||||
std::vector<std::uint8_t> compress(std::span<const std::uint8_t> input, std::size_t exp_output_size, double growth_rate = 2.0);
|
||||
std::vector<std::uint8_t> decompress(std::span<const std::uint8_t> input, std::size_t exp_output_size, double growth_rate = 2.0);
|
||||
}
|
||||
|
||||
namespace zip
|
||||
|
@ -115,13 +115,13 @@ namespace utils::string
|
||||
|
||||
void strip(const char* in, char* out, size_t max)
|
||||
{
|
||||
if (!in || !out) return;
|
||||
if (!in || !out || !max) return;
|
||||
|
||||
max--;
|
||||
auto current = 0u;
|
||||
while (*in != 0 && current < max)
|
||||
{
|
||||
const auto color_index = (*(in + 1) - 48) >= 0xC ? 7 : (*(in + 1) - 48);
|
||||
const auto color_index = (static_cast<size_t>(*(in + 1) - 48)) >= 0xC ? 7 : (*(in + 1) - 48);
|
||||
|
||||
if (*in == '^' && (color_index != 7 || *(in + 1) == '7'))
|
||||
{
|
||||
|
Reference in New Issue
Block a user