From 6b2f3ad6c83f255f00e73b8ec9b21aab5d4edfbd Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Fri, 24 Feb 2023 20:29:14 +0000 Subject: [PATCH] AK: Fix DeprecatedString::bijective_base_from for large numbers The output of the DeprecatedString::bijective_base_from() is now correct for numbers larger than base^2. This makes column names display correctly in Spreadsheet. --- AK/DeprecatedString.cpp | 18 ++++++++++-------- Tests/AK/TestDeprecatedString.cpp | 5 ++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/AK/DeprecatedString.cpp b/AK/DeprecatedString.cpp index 5877bc74265..437b27a71ab 100644 --- a/AK/DeprecatedString.cpp +++ b/AK/DeprecatedString.cpp @@ -246,6 +246,7 @@ DeprecatedString DeprecatedString::repeated(StringView string, size_t count) DeprecatedString DeprecatedString::bijective_base_from(size_t value, unsigned base, StringView map) { + value++; if (map.is_null()) map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"sv; @@ -255,15 +256,16 @@ DeprecatedString DeprecatedString::bijective_base_from(size_t value, unsigned ba Array buffer; size_t i = 0; do { - buffer[i++] = map[value % base]; - value /= base; - } while (value > 0); + auto remainder = value % base; + auto new_value = value / base; + if (remainder == 0) { + new_value--; + remainder = map.length(); + } - // NOTE: Weird as this may seem, the thing that comes after 'Z' is 'AA', which as a number would be '00' - // to make this work, only the most significant digit has to be in a range of (1..25) as opposed to (0..25), - // but only if it's not the only digit in the string. - if (i > 1) - --buffer[i - 1]; + buffer[i++] = map[remainder - 1]; + value = new_value; + } while (value > 0); for (size_t j = 0; j < i / 2; ++j) swap(buffer[j], buffer[i - j - 1]); diff --git a/Tests/AK/TestDeprecatedString.cpp b/Tests/AK/TestDeprecatedString.cpp index a0045357e3e..0b6687f4064 100644 --- a/Tests/AK/TestDeprecatedString.cpp +++ b/Tests/AK/TestDeprecatedString.cpp @@ -290,7 +290,10 @@ TEST_CASE(bijective_base) EXPECT_EQ(DeprecatedString::bijective_base_from(25), "Z"); EXPECT_EQ(DeprecatedString::bijective_base_from(26), "AA"); EXPECT_EQ(DeprecatedString::bijective_base_from(52), "BA"); - EXPECT_EQ(DeprecatedString::bijective_base_from(704), "ABC"); + EXPECT_EQ(DeprecatedString::bijective_base_from(701), "ZZ"); + EXPECT_EQ(DeprecatedString::bijective_base_from(702), "AAA"); + EXPECT_EQ(DeprecatedString::bijective_base_from(730), "ABC"); + EXPECT_EQ(DeprecatedString::bijective_base_from(18277), "ZZZ"); } TEST_CASE(roman_numerals)