/*!
 *  @file    dumpcode.c
 *  @author  Kang IkSeon (ikseon1026@gmail.com)
 *
 *  @internal
 *       Created:  2018년 01월 30일
 *     Copyright:  Copyright (c) 2018, Kang IkSeon
 */

#include <stdio.h>
#include <ctype.h>

#include "src/dumpcode.h"

void printchar(unsigned char c) {
    if (isprint(c))
        printf("%c", c);
    else
        printf(".");
}

void dumpcode(void *ptr, int len) {
    int i;
    for (i=0; i < len; i++) {
        if (i%16 == 0)
            printf("%p  ", ((unsigned char *)ptr + i));
        printf("%02x ", ((unsigned char *)ptr)[i]);
        if (i%16-15 == 0) {
            int j;
            printf("  ");
            for (j=i-15; j <= i; j++)
                printchar(((unsigned char *)ptr)[j]);
            printf("\n");
        }
    }
    if (i%16 != 0) {
        int j;
        int spaces = (len-i+16-i%16)*3+2;
        for (j=0; j < spaces; j++)
            printf(" ");
        for (j=i-i%16; j < len; j++)
            printchar(((unsigned char *)ptr)[j]);
    }
    printf("\n");
}