From: Kevin Day Date: Fri, 15 Apr 2022 20:36:25 +0000 (-0500) Subject: Bugfix: Trailing Unicode sequences that get cut off before the encoding is completed... X-Git-Tag: 0.5.10~210 X-Git-Url: https://git.kevux.org/?a=commitdiff_plain;h=85df83a6d846d575657016682c7014a09ac8af4e;p=fll 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. --- 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) {