diff options
author | Brad King <brad.king@kitware.com> | 2024-05-29 12:29:46 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2024-05-29 12:30:10 (GMT) |
commit | f2ea85f516a2e496db435400330bee7f51e3d180 (patch) | |
tree | e999c7b0feb069fec4b5f7c02b3577e27d09bcaf /Source | |
parent | 0b2c781cb736f801c8e73fa7461bc852ab43038e (diff) | |
parent | 98dd754b624c2b60bd1a0817b3aa7784522f8d0a (diff) | |
download | CMake-f2ea85f516a2e496db435400330bee7f51e3d180.zip CMake-f2ea85f516a2e496db435400330bee7f51e3d180.tar.gz CMake-f2ea85f516a2e496db435400330bee7f51e3d180.tar.bz2 |
Merge topic 'update-kwsys' into release-3.29
98dd754b62 KWSys: ConsoleBuf: Fix test case when running under Windows Terminal
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !9553
Diffstat (limited to 'Source')
-rw-r--r-- | Source/kwsys/testConsoleBuf.cxx | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/Source/kwsys/testConsoleBuf.cxx b/Source/kwsys/testConsoleBuf.cxx index f9b826d..64c61e2 100644 --- a/Source/kwsys/testConsoleBuf.cxx +++ b/Source/kwsys/testConsoleBuf.cxx @@ -476,6 +476,22 @@ static int testFile() # define _WIN32_WINNT_VISTA 0x0600 # endif +static bool consoleIsConhost() +{ + wchar_t consoleClassNameBuf[64]; + int const consoleClassNameLen = GetClassNameW( + GetConsoleWindow(), &consoleClassNameBuf[0], sizeof(consoleClassNameBuf)); + // Windows Console Host: ConsoleWindowClass + // Windows Terminal / ConPTY: PseudoConsoleWindow (undocumented) + return (consoleClassNameLen > 0 && + wcscmp(consoleClassNameBuf, L"ConsoleWindowClass") == 0); +} + +static bool charIsNUL(wchar_t c) +{ + return c == 0; +} + static int testConsole() { int didFail = 1; @@ -691,7 +707,15 @@ static int testConsole() throw std::runtime_error("ReadConsoleOutputCharacter failed!"); } std::wstring wideTestString = kwsys::Encoding::ToWide(encodedTestString); - std::replace(wideTestString.begin(), wideTestString.end(), '\0', ' '); + if (consoleIsConhost()) { + // Windows Console Host converts NUL bytes to spaces. + std::replace(wideTestString.begin(), wideTestString.end(), '\0', ' '); + } else { + // Windows Terminal / ConPTY removes NUL bytes. + wideTestString.erase(std::remove_if(wideTestString.begin(), + wideTestString.end(), charIsNUL), + wideTestString.end()); + } std::wstring wideInputTestString = kwsys::Encoding::ToWide(encodedInputTestString); if (memcmp(outputBuffer, wideTestString.c_str(), |