Browse Source

Unbuffering stdout

Brian Fiete 10 months ago
parent
commit
4a819762e6
3 changed files with 17 additions and 6 deletions
  1. 2 3
      BeefLibs/corlib/src/Console.bf
  2. 2 1
      BeefRT/rt/BfObjects.h
  3. 13 2
      BeefRT/rt/Internal.cpp

+ 2 - 3
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)

+ 2 - 1
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();
 		};
 

+ 13 - 2
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()