#include #include #include #define LINE_LEN 16 void print_zero_line(uint32_t offset) { } void main(const char *path) { struct file *f = open_file(path); if (!f) { tell_user_sz("Couldn't open file.\n"); return; } uint8_t line[LINE_LEN + 2]; uint8_t len; uint32_t offset = -LINE_LEN; enum { ZR_NO, ZR_FIRST, ZR_REST } zero_run; char nbuf[9]; while ((len = read_from_file(f, LINE_LEN, line))) { offset += LINE_LEN; for (uint8_t i = 0; i < LINE_LEN; ++i) if (line[i]) { zero_run = ZR_NO; goto print_normal; } switch (zero_run) { case ZR_NO: zero_run = ZR_FIRST; _log_string("0x"); itosz_h32(offset, nbuf); _log_string(nbuf); _log_string(" | 00 00 00 00 00 00 00 00 " "00 00 00 00 00 00 00 00 |\n"); continue; case ZR_FIRST: zero_run = ZR_REST; tell_user_sz("...\n"); case ZR_REST: continue; } print_normal: _log_string("0x"); itosz_h32(offset, nbuf); _log_string(nbuf); _log_string(" |"); nbuf[0] = ' '; for (uint8_t i = 0; i < len; ++i) { itosz_h8(line[i], nbuf + 1); _log_string(nbuf); } for (uint8_t i = len; i < LINE_LEN; ++i) _log_string(" "); _log_string(" | "); for (uint8_t i = 0; i < len; ++i) if ((line[i] < 0x20) || (line[i] > 0x7e)) line[i] = ' '; line[len] = '\n'; line[len + 1] = '\0'; _log_string(line); } close_file(f); }