From 76dab4ad0b8c475784c558526555961c2e703be3 Mon Sep 17 00:00:00 2001 From: Alexandru Ciobanu Date: Wed, 19 Oct 2022 09:37:52 +0100 Subject: [PATCH 1/2] Simplify MakePrintable by using AND and avoiding converting to string and back. --- Terminal.Gui/Core/ConsoleDriver.cs | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/Terminal.Gui/Core/ConsoleDriver.cs b/Terminal.Gui/Core/ConsoleDriver.cs index 873d8398b..cd180af1c 100644 --- a/Terminal.Gui/Core/ConsoleDriver.cs +++ b/Terminal.Gui/Core/ConsoleDriver.cs @@ -681,11 +681,13 @@ namespace Terminal.Gui { /// Column to move the cursor to. /// Row to move the cursor to. public abstract void Move (int col, int row); + /// /// Adds the specified rune to the display at the current cursor position /// /// Rune to add. public abstract void AddRune (Rune rune); + /// /// Ensures a Rune is not a control character and can be displayed by translating characters below 0x20 /// to equivalent, printable, Unicode chars. @@ -694,21 +696,14 @@ namespace Terminal.Gui { /// public static Rune MakePrintable (Rune c) { - var controlChars = gethexaformat (c, 4); - if (controlChars <= 0x1F || (controlChars >= 0X7F && controlChars <= 0x9F)) { + var controlChars = c & 0xFFFF; + if (controlChars <= 0x1F || controlChars >= 0X7F && controlChars <= 0x9F) { // ASCII (C0) control characters. // C1 control characters (https://www.aivosto.com/articles/control-characters.html#c1) return new Rune (controlChars + 0x2400); - } else { - return c; } - } - static uint gethexaformat (uint rune, int length) - { - var hex = rune.ToString ($"x{length}"); - var hexstr = hex.Substring (hex.Length - length, length); - return (uint)int.Parse (hexstr, System.Globalization.NumberStyles.HexNumber); + return c; } /// From 441960e25ee486f3858d02f5916c591462fefa6e Mon Sep 17 00:00:00 2001 From: Alexandru Ciobanu Date: Wed, 19 Oct 2022 13:41:02 +0100 Subject: [PATCH 2/2] Added two unit tests to check for the MakePrintable cases. --- UnitTests/ConsoleDriverTests.cs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/UnitTests/ConsoleDriverTests.cs b/UnitTests/ConsoleDriverTests.cs index cb4bc1dcf..e9688c638 100644 --- a/UnitTests/ConsoleDriverTests.cs +++ b/UnitTests/ConsoleDriverTests.cs @@ -608,5 +608,29 @@ namespace Terminal.Gui.ConsoleDrivers { Application.Run (win); Application.Shutdown (); } + + [Theory] + [InlineData(0x0000001F, 0x241F)] + [InlineData(0x0000007F, 0x247F)] + [InlineData(0x0000009F, 0x249F)] + [InlineData(0x0001001A, 0x241A)] + public void MakePrintable_Converts_Control_Chars_To_Proper_Unicode (uint code, uint expected) + { + var actual = ConsoleDriver.MakePrintable(code); + + Assert.Equal (expected, actual.Value); + } + + [Theory] + [InlineData(0x20)] + [InlineData(0x7E)] + [InlineData(0xA0)] + [InlineData(0x010020)] + public void MakePrintable_Does_Not_Convert_Ansi_Chars_To_Unicode (uint code) + { + var actual = ConsoleDriver.MakePrintable(code); + + Assert.Equal (code, actual.Value); + } } }