#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;
}