/*
	dump.c
	use LSI-C86 試食版
	lcc dump.c -ltinymain.obj -lintlib -ldoslib
	1993/10/20,10/22,10/24
	bug:キャラクタ表示に異常あり.
*/

#define COPYLEFT "file dump utility v0.03 (c) calo"
#define USAGE "usege: dump [-/opt] filename\n\
	<opt> h,?:この説明   x:大文字   c:キャラクタ付き  b nn:nnバイト分"

#include <stdio.h>
#include <stdlib.h>

#define NUL 0
#define ON 1
#define OFF 0
#define KEI "======-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-=="
#define BT_MAX 0xfffff

int help( char *fn, char *emes );

void main( int argc, char **argv ){

	/* 変数宣言 */

	FILE *fp;
	char *fn,*usa,*usd;
	char cha[20]="  ";
	int c;
	int adi;
	int cf = OFF;
	int i,j;
	unsigned long int add = 0,bt = BT_MAX;
	
	fn = NULL;
	usa = "%05x:";
	usd = " %02x";
	
	/* オプションとファイル名取得 */
	if(argc==1) help( argv[0],NULL);
	for (i=1;argv[i]!=NULL;i++) {
		if(argv[i][0]=='-'||argv[i][0]=='/'){
			for (j=1;argv[i][j]!=NULL;j++) {
				switch (argv[i][j]) {
				case 'b':
					bt = atol( argv[i+1] );
					i++;
					break;
				case 'x':
					usa = "%05X:";
					usd = " %02X";
					break;
				case 'c':
					cf = ON;
					break;
				case 'h':
				case '?':
					help(argv[0],NULL);
				default:
					help(argv[0],"オプションがちがいます.");
				}
				if(bt!=BT_MAX) break;
			}
		} else {
			if(fn==NULL) fn = argv[i];
		}
	}
	if(fn==NULL) help(argv[0],"ファイルの指定がありません.");

	/* メイン処理 */

	if((fp=fopen(fn,"rb"))==NULL) help(argv[0],"オープンエラー.");
	fprintf( stderr,"<< File : %s >>\n",fn);
	add = 0;
	c = NUL;
	while((c=getc(fp))!=EOF){
		adi = add % 16;
		if(adi==0) printf( usa,add );
		printf( usd,c );
		cha[adi+2] = ((c<0x20||c==0x7f||c==0xef||c==0xff) ? '.' : c );
		cha[adi+3] = ' ';
		/* if(c<0x20 || c==0x7f) cha[adi+2] = '.'; */
		/*	else cha[adi+2] = c; */
		if(adi == 15 ){
			if( cf ) printf( cha );
			printf( "\n" );
		}
		add++;
		if( add >= bt ) break;
	}
	if( cf ){
		if((i=adi)<15){
			while (i++<15) printf( "   " );
			cha[adi+4] = cha[adi+5] = NUL;
			printf( cha );
		}
	}
	fprintf( stderr,"\n" KEI "\n" );
	fprintf( stderr,"filedump: %6ld byte.\n",add );

	printf("\n");
	fclose( fp );

}

int help( char *fn, char *emes ){
	fprintf(stderr,"%s " COPYLEFT "\n",fn);
	if(emes!=NULL) fprintf(stderr,"Eorr:%s\n",emes);
	fprintf(stderr, USAGE "\n");
	exit(1);
}
