Refactor change and add failing test case

This commit is contained in:
Blargian 2024-06-03 16:34:53 +02:00
parent b1b3514658
commit 6a8adb6d48
3 changed files with 33 additions and 4 deletions

View File

@ -140,6 +140,18 @@ inline bool isPrintableASCII(char c)
return uc >= 32 && uc <= 126; /// 127 is ASCII DEL.
}
inline bool isCSIParameterByte(char c)
{
uint8_t uc = c;
return uc >= 0x30 && uc <= 0x3F; /// ASCII 09:;<=>?
}
inline bool isCSIIntermediateByte(char c)
{
uint8_t uc = c;
return uc >= 0x20 && uc <= 0x2F; /// ASCII !"#$%&'()*+,-./
}
inline bool isCSIFinalByte(char c)
{
uint8_t uc = c;

View File

@ -147,10 +147,22 @@ size_t computeWidthImpl(const UInt8 * data, size_t size, size_t prefix, size_t l
while (i < size && isPrintableASCII(data[i]))
{
if (!isEscapeSequence)
auto isParameterByte = isCSIParameterByte(data[i]);
auto isIntermediateByte = isCSIIntermediateByte(data[i]);
auto ignore_width = isEscapeSequence & (isParameterByte || isIntermediateByte);
if (ignore_width || (data[i] == '[' && isEscapeSequence))
{
/// don't count the width
}
else if (isEscapeSequence && isCSIFinalByte(data[i]))
{
isEscapeSequence = false;
}
else
{
++width;
else if (isCSIFinalByte(data[i]) && data[i - 1] != '\x1b')
isEscapeSequence = false; /// end of CSI escape sequence reached
}
++i;
}

View File

@ -1 +1,6 @@
SELECT format('\x1b[38;2;{0};{1};{2}m█\x1b[0m', 255, 128, 0) AS x FORMAT Pretty;
SELECT format('\x1b[38;2;{0};{1};{2}m█\x1b[0m', 255, 128, 128) AS x;
SELECT format('\x1b[38;2;{0};{1};{2}m█ test \x1b[0m', 255, 128, 128) AS x;
SELECT format('\x1b[38;2;{0};{1};{2}m█\x1b[0m test', 255, 128, 128) AS x;
SELECT format('test \x1b[38;2;{0};{1};{2}m█\x1b[0m', 255, 128, 128) AS x;
SELECT format('\x1b[38;2;{0};{1};{2}m█\x1b[0m test \x1b[38;2;{0};{1};{2}m█\x1b[0m', 255, 128, 128) AS x;
SELECT visibleWidth('0};{1};{2}m█');