354d022967
commit f44d146e4ac906ff898e8968c6857fd2280f6d20 Author: project-bo4 <127137346+project-bo4@users.noreply.github.com> Date: Thu May 11 13:39:29 2023 -0700 remove lpc package from repository commit 29fb0f63e50de468ab0b9db35f7e8fdadf58afc3 Author: project-bo4 <themanwithantidote@gmail.com> Date: Thu May 11 13:06:13 2023 -0700 generic improvements + added identity configuration + objectstore improvements + added battlenet 'US' servers to blocklist + some other minor improvements commit 5d5e31099ebcce5a637b9a02d4936a97fb0802a7 Author: project-bo4 <themanwithantidote@gmail.com> Date: Sat Mar 25 16:32:52 2023 -0700 lpc improvements + fix lpc issue with foreign languages(non-english) not being considered in listing + check lpc files pre-start and warn user if missing any of core items commit 2de1a54b6f4cc5c44dc906871021cfbc85057ca9 Author: project-bo4 <themanwithantidote@gmail.com> Date: Thu Mar 23 12:45:56 2023 -0700 demonware improvements + handle object store uploadUserObject + silence bdUNK125 commit 710dcc3ec6178071d67c27e5bf6705f08cabe7e2 Author: project-bo4 <themanwithantidote@gmail.com> Date: Mon Mar 20 13:43:56 2023 -0700 forgot to update names commit 217682dfb07b35f7a09399fb2698924bb7fe8b77 Author: project-bo4 <themanwithantidote@gmail.com> Date: Mon Mar 20 11:09:18 2023 -0700 upload lpc and update readme commit 83f812b33b90791a8d13b9468f27da51e0a4f2b9 Author: project-bo4 <themanwithantidote@gmail.com> Date: Mon Mar 20 10:53:43 2023 -0700 demonware emulator + demonware emulator + platform name and id + xxhash and picoproto - remove g_runframe hook -disable discovery(save time) + improvements to utils + add new resources
197 lines
3.7 KiB
C++
197 lines
3.7 KiB
C++
#include "string.hpp"
|
|
#include <sstream>
|
|
#include <cstdarg>
|
|
#include <algorithm>
|
|
|
|
#include "nt.hpp"
|
|
|
|
namespace utils::string
|
|
{
|
|
const char* va(const char* fmt, ...)
|
|
{
|
|
static thread_local va_provider<8, 256> provider;
|
|
|
|
va_list ap;
|
|
va_start(ap, fmt);
|
|
|
|
const char* result = provider.get(fmt, ap);
|
|
|
|
va_end(ap);
|
|
return result;
|
|
}
|
|
|
|
std::vector<std::string> split(const std::string& s, const char delim)
|
|
{
|
|
std::stringstream ss(s);
|
|
std::string item;
|
|
std::vector<std::string> elems;
|
|
|
|
while (std::getline(ss, item, delim))
|
|
{
|
|
elems.push_back(item); // elems.push_back(std::move(item)); // if C++11 (based on comment from @mchiasson)
|
|
}
|
|
|
|
return elems;
|
|
}
|
|
|
|
std::vector<std::string> split(const std::string& s, const std::string& delim)
|
|
{
|
|
size_t pos_start = 0, pos_end, delim_len = delim.length();
|
|
std::string token;
|
|
std::vector<std::string> elems;
|
|
|
|
while ((pos_end = s.find(delim, pos_start)) != std::string::npos) {
|
|
token = s.substr(pos_start, pos_end - pos_start);
|
|
pos_start = pos_end + delim_len;
|
|
elems.push_back(token);
|
|
}
|
|
|
|
elems.push_back(s.substr(pos_start));
|
|
|
|
return elems;
|
|
}
|
|
|
|
std::string to_lower(std::string text)
|
|
{
|
|
std::transform(text.begin(), text.end(), text.begin(), [](const char input)
|
|
{
|
|
return static_cast<char>(tolower(input));
|
|
});
|
|
|
|
return text;
|
|
}
|
|
|
|
std::string to_upper(std::string text)
|
|
{
|
|
std::transform(text.begin(), text.end(), text.begin(), [](const char input)
|
|
{
|
|
return static_cast<char>(toupper(input));
|
|
});
|
|
|
|
return text;
|
|
}
|
|
|
|
bool starts_with(const std::string& text, const std::string& substring)
|
|
{
|
|
return text.find(substring) == 0;
|
|
}
|
|
|
|
bool ends_with(const std::string& text, const std::string& substring)
|
|
{
|
|
if (substring.size() > text.size()) return false;
|
|
return std::equal(substring.rbegin(), substring.rend(), text.rbegin());
|
|
}
|
|
|
|
std::string dump_hex(const std::string& data, const std::string& separator)
|
|
{
|
|
std::string result;
|
|
|
|
for (unsigned int i = 0; i < data.size(); ++i)
|
|
{
|
|
if (i > 0)
|
|
{
|
|
result.append(separator);
|
|
}
|
|
|
|
result.append(va("%02X", data[i] & 0xFF));
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
std::string get_clipboard_data()
|
|
{
|
|
if (OpenClipboard(nullptr))
|
|
{
|
|
std::string data;
|
|
|
|
auto* const clipboard_data = GetClipboardData(1u);
|
|
if (clipboard_data)
|
|
{
|
|
auto* const cliptext = static_cast<char*>(GlobalLock(clipboard_data));
|
|
if (cliptext)
|
|
{
|
|
data.append(cliptext);
|
|
GlobalUnlock(clipboard_data);
|
|
}
|
|
}
|
|
CloseClipboard();
|
|
|
|
return data;
|
|
}
|
|
return {};
|
|
}
|
|
|
|
void strip(const char* in, char* out, int max)
|
|
{
|
|
if (!in || !out) return;
|
|
|
|
max--;
|
|
auto current = 0;
|
|
while (*in != 0 && current < max)
|
|
{
|
|
const auto color_index = (*(in + 1) - 48) >= 0xC ? 7 : (*(in + 1) - 48);
|
|
|
|
if (*in == '^' && (color_index != 7 || *(in + 1) == '7'))
|
|
{
|
|
++in;
|
|
}
|
|
else
|
|
{
|
|
*out = *in;
|
|
++out;
|
|
++current;
|
|
}
|
|
|
|
++in;
|
|
}
|
|
*out = '\0';
|
|
}
|
|
|
|
#pragma warning(push)
|
|
#pragma warning(disable: 4100)
|
|
std::string convert(const std::wstring& wstr)
|
|
{
|
|
std::string result;
|
|
result.reserve(wstr.size());
|
|
|
|
for (const auto& chr : wstr)
|
|
{
|
|
result.push_back(static_cast<char>(chr));
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
std::wstring convert(const std::string& str)
|
|
{
|
|
std::wstring result;
|
|
result.reserve(str.size());
|
|
|
|
for (const auto& chr : str)
|
|
{
|
|
result.push_back(static_cast<wchar_t>(chr));
|
|
}
|
|
|
|
return result;
|
|
}
|
|
#pragma warning(pop)
|
|
|
|
std::string replace(std::string str, const std::string& from, const std::string& to)
|
|
{
|
|
if (from.empty())
|
|
{
|
|
return str;
|
|
}
|
|
|
|
size_t start_pos = 0;
|
|
while ((start_pos = str.find(from, start_pos)) != std::string::npos)
|
|
{
|
|
str.replace(start_pos, from.length(), to);
|
|
start_pos += to.length();
|
|
}
|
|
|
|
return str;
|
|
}
|
|
}
|