From 65bf58731fd347f7413feb0c8b01ed554c55f802 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 22 Jan 2023 23:26:43 +0100 Subject: [PATCH] Remove while loop in GetViewIntoMessageBuffer, closes #12 --- tgcli/Util.cs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/tgcli/Util.cs b/tgcli/Util.cs index 861c90c..1f9c14f 100644 --- a/tgcli/Util.cs +++ b/tgcli/Util.cs @@ -388,20 +388,14 @@ namespace tgcli { if (absoluteCursorPosition < bufferWidth - wraparoundOffsetPre - 1) return (TruncateString(message, bufferWidth, $"{Ansi.Inverse}>{Ansi.InverseOff}"), absoluteCursorPosition); - // now we can be sure the message needs at least one wrap - - // first wrap - // get rid of the content shown on the zeroth wrap, which is buf width minus wraparoundPreW (respects > character on screen edge) - var finalMessage = message[(bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPost)..]; var finalCursorPos = absoluteCursorPosition - bufferWidth + wraparoundOffsetPreW + wraparoundOffsetPostW; + var wraparounds = (finalCursorPos - wraparoundOffsetPostW) / (bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPostW); + finalCursorPos += wraparoundOffsetPostW * wraparounds; + finalCursorPos %= bufferWidth - wraparoundOffsetPreW; - // successive wraps - // repeat above steps (but respective of the new < character) until the string fits into the buffer - // it fits into the buffer when cursorPos >= bufferwidth minus wraparound (this time respecting > character absent on first wrap) - while (finalCursorPos >= bufferWidth - wraparoundOffsetPreW) { - finalMessage = finalMessage[(bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPostW)..]; - finalCursorPos = finalCursorPos - bufferWidth + wraparoundOffsetPreW + wraparoundOffsetPostW; - } + var messageOffset = (bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPostW) * wraparounds; + var finalMessage = message[(bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPost)..]; + finalMessage = finalMessage[messageOffset..]; finalMessage = TruncateString(finalMessage, bufferWidth - 1, $"{Ansi.Inverse}>{Ansi.InverseOff}");