vt-hexdump
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (C) Fadhil Riyanto <fadhil.riyanto@gnuweeb.org>
*
* this version is inspired by Ammar Faizi's versions
* ref: https://gist.githubusercontent.com/ammarfaizi2/e88a21171358b5092a3df412eeb80b2f/raw/59141b48f59b70b1e96208716c45b1703c56daa7/vt_hexdump.h
*/
#include <complex.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#ifndef VT_HEXDUMP_COLOR
#define VT_HEXDUMP_COLOR(fmt, vt_hexdump_hex) \
char current_hex = (char)vt_hexdump_hex; \
\
if (current_hex == 0x7F) { \
printf("\033[1;31m" fmt "\033[0m", vt_hexdump_hex); \
} else if (current_hex == 0xFF) { \
printf("\033[1;34m" fmt "\033[0m", vt_hexdump_hex); \
} else if (current_hex == 0x00) { \
printf("\033[1;37m" fmt "\033[0m", vt_hexdump_hex); \
} else { \
printf("\033[1;32m" fmt "\033[0m", vt_hexdump_hex); \
} \
#endif /* VT_HEXDUMP_COLOR */
#define VT_TITLE(PTR, SIZE) \
size_t t_ptr_size = SIZE; \
unsigned char *t_realptr = (unsigned char*)PTR; \
printf("================= VT_HEXDUMP =================\n"); \
printf("file\t\t: %s:%d\n", __FILE__, __LINE__); \
printf("func\t\t: %s\n", __FUNCTION__); \
printf("addr\t\t: 0x%016lx\n", t_realptr); \
printf("dump_size\t: %ld\n\n", t_ptr_size);
#ifndef HEXDUMP
#define HEXDUMP(PTR, SIZE) \
size_t ptr_size = SIZE; \
unsigned char *realptr = (unsigned char*)PTR; \
unsigned int initial_counter = 0; \
\
int n_loop = (ptr_size / 16) + 1; \
if (ptr_size % 16 == 0) { \
n_loop = n_loop - 1; \
} \
\
for (int x = 0; x < 75; x++) { \
if (x >= 40) { \
printf("16 BYTES WIDE\n"); \
break; \
} else { \
printf(" "); \
} \
} \
\
for (int x = 0; x < 75; x++) { \
if (x >= 21 && x <= 73) { \
printf("_"); \
} else { \
printf(" "); \
} \
} \
printf("\n"); \
\
for (int i = 0; i < n_loop; i++) { \
printf("|0x%016lx|", (uintptr_t)(realptr)); \
\
for (int i = 0; i < 16; i++) { \
if (i % 4 == 0 && i != 0) { \
printf(" "); \
} \
if (i != 15) { \
if (initial_counter <= ptr_size) { \
VT_HEXDUMP_COLOR(" %02x", realptr[i]); \
} \
} else { \
printf(" %02x ", realptr[i]); \
} \
} \
\
printf(" | "); \
for (int i = 0; i < 16; i++) { \
if (initial_counter <= ptr_size - 1) { \
if (realptr[i] >= 32 && realptr[i] <= 126) { \
printf("%c", realptr[i]); \
} else { \
printf(".", realptr[i]); \
} \
} else { \
printf("."); \
} \
initial_counter = initial_counter + 1; \
} \
printf(" | "); \
\
printf("\n"); \
realptr = realptr + 16; \
}
#endif
#ifndef VT_HEXDUMP
#define VT_HEXDUMP(PTR, SIZE) \
VT_TITLE(PTR, SIZE); \
HEXDUMP(PTR, SIZE);
#endif