From 9ea17c1d53ceba950624a32889792ec1a91c70db Mon Sep 17 00:00:00 2001 From: Thad House Date: Mon, 22 Jun 2026 15:55:48 -0700 Subject: [PATCH] [glass] Fix ANSI handling at end column (#9011) Ported from mrccomm --- .../native/thirdparty/mrccomm/src/AnsiDisplayState.cpp | 4 ++-- glass/src/test/native/cpp/AnsiDisplayTest.cpp | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/glass/src/lib/native/thirdparty/mrccomm/src/AnsiDisplayState.cpp b/glass/src/lib/native/thirdparty/mrccomm/src/AnsiDisplayState.cpp index 7f67d9d0f0..1846f66699 100644 --- a/glass/src/lib/native/thirdparty/mrccomm/src/AnsiDisplayState.cpp +++ b/glass/src/lib/native/thirdparty/mrccomm/src/AnsiDisplayState.cpp @@ -627,9 +627,9 @@ struct AnsiDisplayState::Impl { size_t TargetColumn = ((CursorColumn / DisplayTabWidth) + 1) * DisplayTabWidth; TargetColumn = std::min(TargetColumn, MaxDisplayColumnIndex); - do { + while (CursorColumn < TargetColumn) { WriteCharacter(" "); - } while (CursorColumn < TargetColumn); + } } void SetCell(size_t Row, size_t Column, DisplayCell Cell) { diff --git a/glass/src/test/native/cpp/AnsiDisplayTest.cpp b/glass/src/test/native/cpp/AnsiDisplayTest.cpp index 8ccbc6bd3c..0dda1a1a33 100644 --- a/glass/src/test/native/cpp/AnsiDisplayTest.cpp +++ b/glass/src/test/native/cpp/AnsiDisplayTest.cpp @@ -218,3 +218,12 @@ TEST_CASE("AnsiDisplayStateTest Utf8SplitAcrossApplyCallsWritesOneCell", CHECK(visitor.runs[0].columns == 1u); CHECK(visitor.runs[0].text == "X"); } + +TEST_CASE("AnsiDisplayState ignores tab at max column", "[AnsiDisplayState]") { + mrc::AnsiDisplayState state; + state.Apply("\x1b[4096GX\t"); + std::string snapshot = state.BuildSnapshot(); + + REQUIRE(snapshot.find("\x1b[1;4096HX") != std::string::npos); + REQUIRE(snapshot.ends_with("\x1b[1;1H\x1b[s\x1b[1;4096H")); +}