36
36
#include " llvm/Support/Errno.h"
37
37
#include " llvm/Support/FileSystem.h"
38
38
#include " llvm/Support/Process.h"
39
+ #include " llvm/Support/raw_ostream.h"
39
40
40
41
using namespace lldb ;
41
42
using namespace lldb_private ;
@@ -247,6 +248,32 @@ uint32_t File::GetPermissions(Status &error) const {
247
248
return file_stats.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
248
249
}
249
250
251
+ NativeFile::NativeFile () = default;
252
+
253
+ NativeFile::NativeFile (FILE *fh, bool transfer_ownership)
254
+ : m_stream(fh), m_own_stream(transfer_ownership) {
255
+ #ifdef _WIN32
256
+ // In order to properly display non ASCII characters in Windows, we need to
257
+ // use Windows APIs to print to the console. This is only required if the
258
+ // stream outputs to a console.
259
+ int fd = _fileno (fh);
260
+ is_windows_console =
261
+ ::GetFileType ((HANDLE)::_get_osfhandle(fd)) == FILE_TYPE_CHAR;
262
+ #endif
263
+ }
264
+
265
+ NativeFile::NativeFile (int fd, OpenOptions options, bool transfer_ownership)
266
+ : m_descriptor(fd), m_own_descriptor(transfer_ownership),
267
+ m_options(options) {
268
+ #ifdef _WIN32
269
+ // In order to properly display non ASCII characters in Windows, we need to
270
+ // use Windows APIs to print to the console. This is only required if the
271
+ // file outputs to a console.
272
+ is_windows_console =
273
+ ::GetFileType ((HANDLE)::_get_osfhandle(fd)) == FILE_TYPE_CHAR;
274
+ #endif
275
+ }
276
+
250
277
bool NativeFile::IsValid () const {
251
278
std::scoped_lock<std::mutex, std::mutex> lock (m_descriptor_mutex, m_stream_mutex);
252
279
return DescriptorIsValidUnlocked () || StreamIsValidUnlocked ();
@@ -618,6 +645,12 @@ Status NativeFile::Write(const void *buf, size_t &num_bytes) {
618
645
619
646
ssize_t bytes_written = -1 ;
620
647
if (ValueGuard descriptor_guard = DescriptorIsValid ()) {
648
+ #ifdef _WIN32
649
+ if (is_windows_console) {
650
+ llvm::raw_fd_ostream (m_descriptor, false ).write ((char *)buf, num_bytes);
651
+ return error;
652
+ }
653
+ #endif
621
654
bytes_written =
622
655
llvm::sys::RetryAfterSignal (-1 , ::write, m_descriptor, buf, num_bytes);
623
656
if (bytes_written == -1 ) {
@@ -629,6 +662,13 @@ Status NativeFile::Write(const void *buf, size_t &num_bytes) {
629
662
}
630
663
631
664
if (ValueGuard stream_guard = StreamIsValid ()) {
665
+ #ifdef _WIN32
666
+ if (is_windows_console) {
667
+ llvm::raw_fd_ostream (_fileno (m_stream), false )
668
+ .write ((char *)buf, num_bytes);
669
+ return error;
670
+ }
671
+ #endif
632
672
bytes_written = ::fwrite (buf, 1 , num_bytes, m_stream);
633
673
634
674
if (bytes_written == 0 ) {
0 commit comments