13f65f718SMark de Wever //===----------------------------------------------------------------------===// 23f65f718SMark de Wever // 33f65f718SMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43f65f718SMark de Wever // See https://llvm.org/LICENSE.txt for license information. 53f65f718SMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63f65f718SMark de Wever // 73f65f718SMark de Wever //===----------------------------------------------------------------------===// 83f65f718SMark de Wever 93f65f718SMark de Wever #include <__config> 1025a2d518SLouis Dionne 113f65f718SMark de Wever #include <cstdlib> 123f65f718SMark de Wever #include <print> 133f65f718SMark de Wever 143f65f718SMark de Wever #include <__system_error/system_error.h> 153f65f718SMark de Wever 163f65f718SMark de Wever #include "filesystem/error.h" 173f65f718SMark de Wever 184fb7b330SMark de Wever #if defined(_LIBCPP_WIN32API) 194fb7b330SMark de Wever # define WIN32_LEAN_AND_MEAN 204fb7b330SMark de Wever # define NOMINMAX 214fb7b330SMark de Wever # include <io.h> 224fb7b330SMark de Wever # include <windows.h> 234fb7b330SMark de Wever #elif __has_include(<unistd.h>) 244fb7b330SMark de Wever # include <unistd.h> 254fb7b330SMark de Wever #endif 264fb7b330SMark de Wever 273f65f718SMark de Wever _LIBCPP_BEGIN_NAMESPACE_STD 283f65f718SMark de Wever 294fb7b330SMark de Wever #if defined(_LIBCPP_WIN32API) 304fb7b330SMark de Wever 313f65f718SMark de Wever _LIBCPP_EXPORTED_FROM_ABI bool __is_windows_terminal(FILE* __stream) { 323f65f718SMark de Wever // Note the Standard does this in one call, but it's unclear whether 333f65f718SMark de Wever // an invalid handle is allowed when calling GetConsoleMode. 343f65f718SMark de Wever // 353f65f718SMark de Wever // https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle?view=msvc-170 363f65f718SMark de Wever // https://learn.microsoft.com/en-us/windows/console/getconsolemode 373f65f718SMark de Wever intptr_t __handle = _get_osfhandle(fileno(__stream)); 383f65f718SMark de Wever if (__handle == -1) 393f65f718SMark de Wever return false; 403f65f718SMark de Wever 413f65f718SMark de Wever unsigned long __mode; 423f65f718SMark de Wever return GetConsoleMode(reinterpret_cast<void*>(__handle), &__mode); 433f65f718SMark de Wever } 443f65f718SMark de Wever 45c6f3b7bcSNikolas Klauser # if _LIBCPP_HAS_WIDE_CHARACTERS 463f65f718SMark de Wever _LIBCPP_EXPORTED_FROM_ABI void 473f65f718SMark de Wever __write_to_windows_console([[maybe_unused]] FILE* __stream, [[maybe_unused]] wstring_view __view) { 483f65f718SMark de Wever // https://learn.microsoft.com/en-us/windows/console/writeconsole 493f65f718SMark de Wever if (WriteConsoleW(reinterpret_cast<void*>(_get_osfhandle(fileno(__stream))), // clang-format aid 503f65f718SMark de Wever __view.data(), 513f65f718SMark de Wever __view.size(), 523f65f718SMark de Wever nullptr, 533f65f718SMark de Wever nullptr) == 0) { 54*2b26ee6eSJames Y Knight __throw_system_error(filesystem::detail::get_last_error(), "failed to write formatted output"); 553f65f718SMark de Wever } 563f65f718SMark de Wever } 57c6f3b7bcSNikolas Klauser # endif // _LIBCPP_HAS_WIDE_CHARACTERS 583f65f718SMark de Wever 594fb7b330SMark de Wever #elif __has_include(<unistd.h>) // !_LIBCPP_WIN32API 6025a2d518SLouis Dionne 614fb7b330SMark de Wever _LIBCPP_EXPORTED_FROM_ABI bool __is_posix_terminal(FILE* __stream) { return isatty(fileno(__stream)); } 624fb7b330SMark de Wever #endif 634fb7b330SMark de Wever 644fb7b330SMark de Wever _LIBCPP_END_NAMESPACE_STD 65