summaryrefslogtreecommitdiffstats
path: root/Tests/CMakeLib/testEncoding.cxx
diff options
context:
space:
mode:
authorDāvis Mosāns <davispuh@gmail.com>2016-11-23 12:11:40 (GMT)
committerBrad King <brad.king@kitware.com>2016-11-30 14:06:51 (GMT)
commit2ed473b3b8e28485e6a14a49c7e0e4133eb02eee (patch)
tree1343f0e826693c923074102e588f90f0678e3cc5 /Tests/CMakeLib/testEncoding.cxx
parent076aef8e45a91e83f9a7d879712fd70778d67c92 (diff)
downloadCMake-2ed473b3b8e28485e6a14a49c7e0e4133eb02eee.zip
CMake-2ed473b3b8e28485e6a14a49c7e0e4133eb02eee.tar.gz
CMake-2ed473b3b8e28485e6a14a49c7e0e4133eb02eee.tar.bz2
execute_process: Add ENCODING option for Windows child process output
Different applications can use different output encodings.
Diffstat (limited to 'Tests/CMakeLib/testEncoding.cxx')
-rw-r--r--Tests/CMakeLib/testEncoding.cxx49
1 files changed, 49 insertions, 0 deletions
diff --git a/Tests/CMakeLib/testEncoding.cxx b/Tests/CMakeLib/testEncoding.cxx
new file mode 100644
index 0000000..88743b0
--- /dev/null
+++ b/Tests/CMakeLib/testEncoding.cxx
@@ -0,0 +1,49 @@
+#include <fstream>
+#include <iostream>
+#include <string>
+
+#include <cmsys/ConsoleBuf.hxx>
+
+#ifdef _WIN32
+void setEncoding(cmsys::ConsoleBuf::Manager& buf, UINT codepage)
+{
+ cmsys::ConsoleBuf* cb = buf.GetConsoleBuf();
+ if (cb) {
+ cb->input_pipe_codepage = codepage;
+ cb->output_pipe_codepage = codepage;
+ cb->input_file_codepage = codepage;
+ cb->output_file_codepage = codepage;
+ cb->activateCodepageChange();
+ }
+}
+#endif
+
+int main(int argc, char* argv[])
+{
+#ifdef _WIN32
+ cmsys::ConsoleBuf::Manager consoleOut(std::cout);
+#endif
+ if (argc <= 2) {
+ std::cout << "Usage: testEncoding <encoding> <file>" << std::endl;
+ return 1;
+ }
+ const std::string encoding(argv[1]);
+#ifdef _WIN32
+ if (encoding == "UTF8") {
+ setEncoding(consoleOut, CP_UTF8);
+ } else if (encoding == "ANSI") {
+ setEncoding(consoleOut, CP_ACP);
+ } else if (encoding == "OEM") {
+ setEncoding(consoleOut, CP_OEMCP);
+ } // else AUTO
+#endif
+ std::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>());
+ std::cout << text;
+ return 0;
+}