From 85df83a6d846d575657016682c7014a09ac8af4e Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Fri, 15 Apr 2022 15:36:25 -0500 Subject: [PATCH] Bugfix: Trailing Unicode sequences that get cut off before the encoding is completed improperly display. Detect when this kind of underflow happens. Print remaining characters without trying to print missing characters. Reset and perform remaining data to print at end. --- level_3/byte_dump/c/private-byte_dump.c | 45 +++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/level_3/byte_dump/c/private-byte_dump.c b/level_3/byte_dump/c/private-byte_dump.c index e768944..e9c54e4 100644 --- a/level_3/byte_dump/c/private-byte_dump.c +++ b/level_3/byte_dump/c/private-byte_dump.c @@ -191,8 +191,49 @@ extern "C" { // Print placeholders to fill out the remaining line and then optionally print the text block. if (cell.column && cell.column < data->width) { - previous.bytes = 0; - previous.invalid = 0; + const uint8_t width_missing = width_utf - width_count; + const uint8_t column_offset = data->width - cell.column; + width_count = 0; + + // Handle incomplete character at the end of the stream. + if (width_count < width_utf) { + found_invalid_utf = F_true; + invalid[character_current] = width_utf; + + if (byte_dump_print_character_fragment(data, characters, invalid, width_utf, 1, &previous, &cell, &offset) == F_true) { + character_reset = F_true; + } + + if (++width_count < width_missing) { + if (byte_dump_print_character_fragment(data, characters, invalid, width_utf, 2, &previous, &cell, &offset) == F_true) { + character_reset = F_true; + } + + if (++width_count < width_missing) { + if (byte_dump_print_character_fragment(data, characters, invalid, width_utf, 3, &previous, &cell, &offset) == F_true) { + character_reset = F_true; + } + + if (++width_count < width_missing) { + if (byte_dump_print_character_fragment(data, characters, invalid, width_utf, 4, &previous, &cell, &offset) == F_true) { + character_reset = F_true; + } + } + } + } + + if (character_reset) { + characters.used = 0; + memset(&invalid, 0, sizeof(f_char_t) * data->width); + + previous.bytes = column_offset; + previous.invalid = previous.bytes; + } + else { + previous.bytes = 0; + previous.invalid = 0; + } + } while (cell.column < data->width) { -- 1.8.3.1