summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2024-05-29 12:29:46 (GMT)
committerKitware Robot <kwrobot@kitware.com>2024-05-29 12:30:10 (GMT)
commitf2ea85f516a2e496db435400330bee7f51e3d180 (patch)
treee999c7b0feb069fec4b5f7c02b3577e27d09bcaf /Source
parent0b2c781cb736f801c8e73fa7461bc852ab43038e (diff)
parent98dd754b624c2b60bd1a0817b3aa7784522f8d0a (diff)
downloadCMake-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.cxx26
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(),