From ca596d93a8987fccedf08948335b57a6b615c951 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Tue, 9 Jul 2024 16:14:22 -0400 Subject: Fix hexdump one last time --- main.c | 72 ++++++++++++++++++++++++++++-------------------------------------- 1 file changed, 30 insertions(+), 42 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index d3bcf38..fb1ed87 100644 --- a/main.c +++ b/main.c @@ -361,49 +361,37 @@ void asdfapi_show_block_header(struct ASDFBlockHeader *hdr) { printf("\n"); } -static void asdfapi_hexdump(const char *data, const size_t size) { - char addr[80] = {0}; - char ascii[80] = {0}; - char row[80] = {0}; - size_t width = 16; - if (size < width) { - width = size; +static void asdfapi_hexdump(const char *data, size_t offset, const size_t size) { + char ascii[255] = {0}; + size_t width = 15; + if (size < 1) { + fprintf(stderr, "size must be greater than zero"); + return; + } else if (offset > size) { + fprintf(stderr, "offset must be less than size\n"); + return; } - for (size_t b = 0, col = 0; b < size; b++) { - char ch = data[b]; - if (!col) { - // Record the starting address - sprintf(addr, "%08lx", b + (intptr_t) data); - } - - if (col >= width) { - sprintf(row + strlen(row), "00 "); - sprintf(ascii + strlen(ascii), "."); - } else { - // Store byte as hex - sprintf(row + strlen(row), "%02x ", (unsigned char) ch); - // Store byte as ascii - sprintf(ascii + strlen(ascii), "%c", isprint(ch) ? (unsigned char) ch : '.'); - } - if (col == 7) { - // Inject two spaces to visually break up the line - sprintf(row + strlen(row), " "); - } - if (col >= 16) { - // Dump output / reset counters and strings - printf("%s %s| %s\n", addr, row, ascii); - col = 0; - row[col] = 0; - ascii[col] = 0; - addr[col] = 0; - continue; + for (size_t i = offset; i < size; i++) { + for (size_t x = 0; x <= width; x++) { + if (!x) { + printf("%#08lX | ", (size_t) data + i); + } else if (x == 8) { + printf(" "); + } + if ((i + x) >= size) { + printf(" "); + ascii[x] = ' '; + } else { + printf("%02X ", (unsigned char) data[i + x]); + ascii[x] = isprint(data[i + x]) ? data[i + x] : '.'; + } } - col++; - } - if (strlen(row)) { - // Dump remaining output - printf("%s %s| %s\n", addr, row, ascii); + printf("| %s", ascii); + printf("\n"); + memset(ascii, 0, sizeof(ascii)); + i += width; } + } int main(int argc, char *argv[]) { @@ -433,10 +421,10 @@ int main(int argc, char *argv[]) { used_size = handle->fp_size - handle->block_offsets[0]; } if (used_size > 128) { - asdfapi_hexdump(block_hdr->data.mem, 128); + asdfapi_hexdump(block_hdr->data.mem, 0, 128); puts("[output too long for terminal]"); } else { - asdfapi_hexdump(block_hdr->data.mem, used_size); + asdfapi_hexdump(block_hdr->data.mem, 0, used_size); } puts("\n"); -- cgit