/* LICENSE: BSD 2-Clause */ #include static int __dump_buf(const void *buf, size_t len, int (*dump_char)(unsigned char), int bytes_per_line) { size_t i; const unsigned char *ptr = buf; for (i = 0; i < len; i++) { if (!(i % bytes_per_line)) if (printf("0x%04zx: ", i) < 0) return -1; if (dump_char(ptr[i]) == -1) return -1; if (putchar((i + 1) % bytes_per_line && i + 1 < len ? ' ' : '\n') == EOF) return -1; } return 0; } int hex_dump_char(unsigned char c) { if (printf("%02x", c) < 0) return -1; return 0; } int bin_dump_char(unsigned char c) { unsigned char bit_mask; for (bit_mask = 0x80; bit_mask; bit_mask = bit_mask >> 1) if (putchar(c & bit_mask ? '1' : '0') == EOF) return -1; return 0; } int hex_dump(const void *buf, size_t len) { return __dump_buf(buf, len, hex_dump_char, 16); } int bin_dump(const void *buf, size_t len) { return __dump_buf(buf, len, bin_dump_char, 8); } int main() { size_t i; char buf[32]; for (i = 0; i < sizeof(buf); i++) buf[i] = i; if (hex_dump(buf, sizeof(buf)) == -1) return 1; if (bin_dump(buf, sizeof(buf)) == -1) return 1; return 0; }