/*
** priv8hex.c by aleksander 'konewka' ambrozkiewicz
**
** Simple hex viewer.
**
** www.priv8security.com
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>

#define RED 	"\033[01;31m"
#define NORM	"\033\[00;00m"

void usage(char *progname);
void dump_hex(FILE *fd);
void clear_buf(char *buf, int size);
void clear_int(int itc[], int size);

void clear_int(int itc[], int size) {
    int i;
    
    for (i=0;i<=size;i++)
	itc[i] = 0;
}

void clear_buf(char *buf, int size) {
    int i;
    
    for (i=0;i<=size;i++)
	buf[i] = '\0';
}

void dump_hex(FILE *fd) {
    char buf[16];
    int c, i, j, hex[15];
    
    clear_buf(buf, 16);
    clear_int(hex, 15);
    for (i=1,j=0;(c = getc(fd)) != EOF;i++) {
	(isprint(c)) ? (buf[j] = c) : (buf[j] = '.');
	hex[j++] = c;
	
	if (!(i%16)) {
	    printf("("RED"0x%02x"NORM") | ", i/16);
	    for (j=0;j<=15;j++)
		printf("%02x ", hex[j]);
	    printf("| %s\n", buf);
	    j = 0;
	    clear_buf(buf, 16);
	    clear_int(hex, 15);
	}
    }
    if (i%16) {
	printf("("RED"0x%02x"NORM") | ", (i+16)/16);
	for (j=0;j<=15;j++)
	    printf("%02x ", hex[j]);
	printf("| %s\n", buf);
    }
}

void usage(char *progname) {
    printf(RED"+"NORM" priv8hex written by konewka (www.priv8security.com)\n");
    printf(RED"+"NORM" usage : %s <file>\n", progname);
    exit(0);
}

int main(int argc, char *argv[]) {
    FILE *fd;
    
    if (argc < 2)
	usage(argv[0]);
    
    if (!(fd = fopen(argv[1], "r"))) {
	printf(RED"-"NORM" cant open file\n");
	return -1;
    }
    
    dump_hex(fd);
    
    return 0;
}
