Files
ft_malloc/srcs/hex_dump.c
2025-02-15 16:22:08 +01:00

104 lines
2.2 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* hex_dump.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/14 18:03:26 by tomoron #+# #+# */
/* Updated: 2025/02/15 16:19:00 by tomoron ### ########.fr */
/* */
/* ************************************************************************** */
#include "includes/malloc.h"
static void put_hex_padded(t_ul addr, int padding, int prefix)
{
int len;
t_ul tmp;
len = 1;
tmp = addr;
while (tmp >= 16)
{
tmp /= 16;
len++;
}
if(prefix)
write(1, "0x", 2);
while(len < padding)
{
write(1, "0", 1);
len++;
}
put_ulnbr_base(addr, "0123456789abcdef");
}
static void put_char_dot(char c)
{
if(c >= 32 && c <= 126)
write(1, &c, 1);
else
write(1, ".", 1);
}
static void hex_dump_show_line(char *addr, int len)
{
int i;
put_hex_padded((long unsigned)addr, 16, 1);
write(1, " ", 2);
i = 0;
while(i < 16)
{
if(i < len)
put_hex_padded(addr[i], 2, 0);
else
write(1, " ", 2);
write(1, " ", 1);
if(i == 7 || i == 15)
write(1, " ", 1);
i++;
}
i = 0;
write(1, "|", 1);
while(i < len)
{
put_char_dot(addr[i]);
i++;
}
write(1, "|", 1);
write(1, "\n", 1);
(void)len;
}
void hex_dump(char *addr, size_t nb)
{
char buf[16];
size_t cur;
int lst_same;
cur = 0;
lst_same = 0;
while (cur + 16 < nb)
{
if(cur && !ft_memcmp(buf, addr + cur, 16))
{
cur += 16;
if(!lst_same)
write(1, "*\n", 2);
lst_same = 1;
continue;
}
lst_same = 0;
ft_memcpy(buf, addr + cur, 16);
hex_dump_show_line(addr + cur, 16);
cur += 16;
}
if(cur < nb)
hex_dump_show_line(addr + cur, nb - cur);
put_hex_padded((long unsigned)addr, 16, 1);
write(1, "\n", 1);
}