Files
numa/numa.c
cinqatte 09b6fe75ba
2024-10-03 14:49:23 +02:00

55 lines
2.1 KiB
C

#include "numa.h"
#include <stdio.h>
#include <ctype.h>
void numa(const uint8_t *data, uint32_t length, uint16_t width, uint8_t bytes) {
uint32_t i, j;
for (i = 0; i < length; i += width) {
printf("%08x: ", i);
for (j = 0; j < width; j += bytes) {
if (i + j < length) {
switch (bytes) {
case 1: printf("%02x ", data[i + j]); break;
case 2:
if (i + j + 1 < length)
printf("%04x ", *((uint16_t *)(data + i + j)));
else
printf("%02x ", data[i + j]);
break;
case 4:
if (i + j + 3 < length)
printf("%08x ", *((uint32_t *)(data + i + j)));
else {
for (int k = 0; k < 4 && i + j + k < length; k++)
printf("%02x", data[i + j + k]);
printf("%*s", 2 * (4 - (length - (i + j))), "");
}
break;
case 8:
if (i + j + 7 < length)
printf("%016lx ", *((uint64_t *)(data + i + j)));
else {
for (int k = 0; k < 8 && i + j + k < length; k++)
printf("%02x", data[i + j + k]);
printf("%*s", 2 * (8 - (length - (i + j))), "");
}
break;
default:
fprintf(stderr, "Unsupported byte width\n");
return;
}
} else {
printf("%*s", bytes * 2 + 1, "");
}
}
// Print ASCII representation
printf(" | ");
for (j = 0; j < width && i + j < length; ++j) {
uint8_t byte = data[i + j];
printf("%c", isprint(byte) ? byte : '.');
}
printf("\n");
}
}