1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-18 17:31:57 +08:00
Files
CMake/Tests/CMakeLib/testEncoding.cxx
Brad King 3f8ad3e894 Tests: Simplify implementation of execute_process encoding test executable
Replace use of KWSys ConsoleBuf with direct encoding conversion calls.
2025-04-17 19:53:45 -04:00

62 lines
1.8 KiB
C++

#include <iostream>
#include <iterator>
#include <string>
#include "cmsys/FStream.hxx"
#ifdef _WIN32
# include <windows.h>
#endif
int main(int argc, char* argv[])
{
if (argc <= 2) {
std::cout << "Usage: testEncoding <encoding> <file>" << std::endl;
return 1;
}
std::string const encoding(argv[1]);
#ifdef _WIN32
unsigned int codePage = 0;
if ((encoding == "UTF8") || (encoding == "UTF-8")) {
codePage = CP_UTF8;
} else if (encoding == "ANSI") {
codePage = CP_ACP;
} else if (encoding == "OEM") {
codePage = CP_OEMCP;
} else if (unsigned int consoleOutputCP = GetConsoleOutputCP()) {
codePage = consoleOutputCP;
} else if (unsigned int ansiCP = GetACP()) {
codePage = ansiCP;
}
#endif
cmsys::ifstream file(argv[2]);
if (!file.is_open()) {
std::cout << "Failed to open file: " << argv[2] << std::endl;
return 2;
}
std::string text((std::istreambuf_iterator<char>(file)),
std::istreambuf_iterator<char>());
#ifdef _WIN32
if (codePage) {
if (int wlen = MultiByteToWideChar(CP_UTF8, 0, text.data(),
int(text.size()), nullptr, 0)) {
std::vector<wchar_t> w(wlen);
if (MultiByteToWideChar(CP_UTF8, 0, text.data(), int(text.size()),
w.data(), w.size())) {
if (int nlen =
WideCharToMultiByte(codePage, 0, w.data(), int(w.size()),
nullptr, 0, nullptr, nullptr)) {
std::vector<char> n(nlen);
if (WideCharToMultiByte(codePage, 0, w.data(), int(w.size()),
n.data(), int(n.size()), nullptr, nullptr)) {
text = std::string(n.data(), n.size());
}
}
}
}
}
#endif
std::cout << text;
return 0;
}