From 4a819762e666f98f3c844f18f47210c66b8119a8 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 22 Oct 2024 12:48:14 -0400 Subject: [PATCH] Unbuffering stdout --- BeefLibs/corlib/src/Console.bf | 5 ++--- BeefRT/rt/BfObjects.h | 3 ++- BeefRT/rt/Internal.cpp | 15 +++++++++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/BeefLibs/corlib/src/Console.bf b/BeefLibs/corlib/src/Console.bf index b34610ff..630d162d 100644 --- a/BeefLibs/corlib/src/Console.bf +++ b/BeefLibs/corlib/src/Console.bf @@ -90,13 +90,12 @@ namespace System static function void(StringView str) OutString = => OutString_Simple; - public static extern void PutChar(char8 c); + private static extern void PutChars(char8* c, int32 len); public static extern void ReopenHandles(); static void OutString_Simple(StringView str) { - for (var c in str.RawChars) - PutChar(c); + PutChars(str.Ptr, (.)str.Length); } static void OutString_Ex(StringView str) diff --git a/BeefRT/rt/BfObjects.h b/BeefRT/rt/BfObjects.h index 479d6356..f6a7b983 100644 --- a/BeefRT/rt/BfObjects.h +++ b/BeefRT/rt/BfObjects.h @@ -183,8 +183,9 @@ namespace bf class Console { + private: + BFRT_EXPORT static void PutChars(char* ptr, int len); public: - BFRT_EXPORT static void PutChar(char c); BFRT_EXPORT static void ReopenHandles(); }; diff --git a/BeefRT/rt/Internal.cpp b/BeefRT/rt/Internal.cpp index eb39249b..37564ea9 100644 --- a/BeefRT/rt/Internal.cpp +++ b/BeefRT/rt/Internal.cpp @@ -292,9 +292,20 @@ static void NTAPI TlsFreeFunc(void* ptr) gBfRtCallbacks.Thread_Exiting(); } -void bf::System::Console::PutChar(char c) +void bf::System::Console::PutChars(char* ptr, int len) { - putchar(c); +#ifdef BF_PLATFORM_WINDOWS + HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); + if (handle != INVALID_HANDLE_VALUE) + { + DWORD numBytesWritten = 0; + ::WriteFile(handle, ptr, (DWORD)len, &numBytesWritten, NULL); + return; + } +#endif + + for (int i = 0; i < len; i++) + putchar(ptr[i]); } void bf::System::Console::ReopenHandles()