#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ALIGN(x,y) ( (((x)%(y))==0) ? (x) : ((x)+((y)-((x)%(y)))) )
int main(int argc, char **argv){
if (argc<2){
puts("usage: xview <file>");
return 1;
}
FILE *fp = fopen(argv[1],"rb");
fseek(fp,0,SEEK_END);
size_t filesize = ftell(fp);
fseek(fp,0,SEEK_SET);
unsigned char *data = malloc(filesize);
fread(data,filesize,1,fp);
unsigned int i;
for (i=0;i<ALIGN(filesize,16)+1;i++){
if (i%16==0){
if (i!=0){
printf(" | ");
int backset = 16;
while(backset-- && ((i-backset)<filesize+1)){
if (data[i-backset-1]>' ' && data[i-backset-1]<'~') putchar(data[i-backset-1]);
else putchar('.');
}
}
putchar('\n');
}
if (i%8==0) putchar(' ');
if (i>filesize-1){
printf(" ");
}else{
printf("%.2X ",data[i]);
}
}
return 0;
}