#include <exec/types.h>
#include <libraries/dos.h>
#include <stdio.h>

char *show_ascii();

char *types[]={
"Unknomn","IFF","GIF","PCX","Sound Arranger instrument file",
"Icon file","PowerPacked file","AmigaGuide","Executable",
"C Object file", "AmiNet readme file", "Lha archive",
"DMS archive", "ZIP archive", "DBTools database",
"AmigaBase database", "Quickfile database",
};

BPTR fh=NULL;

void __regargs _CXBRK(void)
{
	if(fh) Close(fh);
	printf("- Aborted -------------------------------------------------------------------\n");
}

int IdH(char *bf, char i1, char i2, char i3, char i4)
{
	if(i1==bf[0] && i2==bf[1] && i3==bf[2] && i4==bf[3])
		return TRUE;
	else
		return FALSE;
}

void main(argc,argv)
char *argv[];
{
 unsigned char bf[17],buffer[256],filebfr[200];
 int i,rd=16,size,offs=0;
 int ftp=0;

 bf[16]=0;

 if(argc==0) {
  printf("HexType V1.2\n");
  printf("Enter filename > ");
  gets(filebfr);
  argc=2;
  argv[1]=filebfr;
 }

 if(argc<2) {
  printf("HexType V1.2 ©1995-1997 Henrik I\n");
  printf("USAGE: %s FILE/A\n",argv[0]);
 }

 fh=Open(argv[1],MODE_OLDFILE);
 if(fh) {
	Seek(fh,0,OFFSET_END);
	size=Seek(fh,0,OFFSET_BEGINNING);

	Read(fh,buffer,256);

	if(Id(buffer,"FORM")) ftp=1;
	if(Id(buffer,"GIF"))  ftp=2;
	if(IdH(buffer,10,5,1,8))  ftp=3;
	if(Id(buffer,"SASI"))  ftp=4;
	if(IdH(buffer,0xe3,0x10,0x00,0x01))  ftp=5;
	if(Id(buffer,"PP"))  ftp=6;
	if(Id(buffer,"@da"))  ftp=7;
	if(Id(buffer,"@DA"))  ftp=7;
	if(Id(buffer,"@Da"))  ftp=7;
	if(IdH(buffer,0x0,0x0,0x3,243))  ftp=8;
	if(IdH(buffer,0x0,0x0,0x3,231))  ftp=9;
	if(Id(buffer,"Short:"))  ftp=10;
	if(Id(buffer,"**-lh"))  ftp=11;
	if(Id(buffer,"DMS"))  ftp=12;
	if(Id(buffer,"PK"))  ftp=13;
	if(Id(buffer,"DBTDAT"))  ftp=13;
	if(Id(buffer,"ABST"))  ftp=14;
	if(Id(buffer,"QuickFile"))  ftp=15;
 
	Seek(fh,0,OFFSET_BEGINNING);

	printf("-----------------------------------------------------------------------------\n");
	printf(" File: %s\n",argv[1]);
	printf(" Size: %ld bytes\n",size);
	printf(" File type: %s\n",types[ftp]);
	printf("-----------------------------------------------------------------------------\n");
	printf("OFFSET:  HEX:                                                ASCII:\n");
	printf("-------- -----------  -----------  -----------  -----------  ----------------\n");
	while(rd==16) {
		printf("%08lx ",offs);
		offs+=0x10;
		rd=Read(fh,bf,sizeof(bf)-1);
		for(i=0;i<16;i++) {
			if(i>rd) bf[i]=0;
			printf("%02x ",bf[i]);
			if(i==3 || i==7 || i==11 || i==15) printf(" ");
		}
		printf("%s\n",show_ascii(bf));
	}
	printf("-----------------------------------------------------------------------------\n");
	Close(fh);
 } else {
	printf("Error! File %s not found!\n",argv[1]);
 }
}

char *show_ascii(bf)
char *bf;
{
 int i;

 for(i=0;i<16;i++) {
  if(bf[i]<' ' || bf[i]>'~') bf[i]='.';
 }

 return bf;
}

int Id(bf,str)
char *bf,*str;
{
 int i;

 for(i=0;str[i]!=0;i++) {
  if(str[i]!=bf[i]) {
	if(str[i]!='*') return FALSE;
  }
 }
 return TRUE;
}
