/*
	pmud.c
	use LSI-C86 試食版
	lcc pmud.c -ltinymain.obj -lintlib -ldoslib
	1993/10/24
*/

#define COPYLEFT "dump list to binary file utility v0.02 (c) calo"
#define USAGE "usege: pmud [-/opt] infilename outfilename\n\
	<opt> h,?:この説明   i:標準入力   o:標準出力"

#include <stdio.h>
#include <process.h>

#define ON 1
#define OFF 0
#define LF 254
#define NU 255

FILE *fp;
FILE *fpo;

unsigned int dc( char c );
int pd( FILE *fp, FILE *fpo );
int help( char *fn, char *emes );

void main( int argc, char **argv ){
	int i,j;
	char *fn,*fno;
	fn = fno = NULL;

	/* オプションとファイル名取得 */
	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 'i':
					fn = ".i";
					break;
				case 'o':
					fno = ".o";
					break;
				case 'h':
				case '?':
					help(argv[0],NULL);
				default:
					help(argv[0],"オプションがちがいます.");
				}
			}
		} else {
			if(fn==NULL) fn = argv[i];
			else if(fno==NULL) fno = argv[i];
		}
	}
	if(fn ==NULL) help(argv[0],"入力ファイルの指定がありません.");
	if(fno==NULL) help(argv[0],"出力ファイルの指定がありません.");

	if( fn[0]=='.' && fn[1]=='i' ) fp = stdin;
	else fp  = fopen( fn  ,"r"  );
	if( fno[0]=='.' && fno[1]=='o' ) fpo = stdout;
	else fpo = fopen( fno ,"wb" );
	if( fp  == NULL ) help(argv[0],"入力ファイルオープンエラー.");
	if( fpo == NULL ) help(argv[0],"出力ファイルオープンエラー.");
	
	pd( fp, fpo );
	fclose( fp );
	fclose( fpo );
}

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);
}
int pd( FILE *fp, FILE *fpo ){
	unsigned int da = 0;
	unsigned int cc = ON;
	unsigned int c;
	unsigned int h = OFF;
	unsigned int data = 0;

	while ( ! feof(fp) ){
		c = dc(fgetc( fp ));
		if ( c == LF ) { da = 0; cc = ON; continue; }
		if ( cc == ON  && c == NU ){ cc = OFF; continue; }
		if ( cc == OFF && c < 16 ) { da ++; cc = ON;}
		if ( cc == ON  && da >= 1 && da <= 16 ){
			if( h == OFF ){
				data = c;
				h = ON;
			}else{
				data = data * 16 + c;
				fputc( data,fpo );
				h = OFF;
			}
		}
	}
}

unsigned int dc( char c ){
	unsigned int f;
	switch (c) {
	case '0': f = 0; break;
	case '1': f = 1; break;
	case '2': f = 2; break;
	case '3': f = 3; break;
	case '4': f = 4; break;
	case '5': f = 5; break;
	case '6': f = 6; break;
	case '7': f = 7; break;
	case '8': f = 8; break;
	case '9': f = 9; break;
	case 'a': case 'A': f = 10; break;
	case 'b': case 'B': f = 11; break;
	case 'c': case 'C': f = 12; break;
	case 'd': case 'D': f = 13; break;
	case 'e': case 'E': f = 14; break;
	case 'f': case 'F': f = 15; break;
	case 0x0a:
		f = LF;
		break;
	default:
		f = NU;
	}
	return( f );
}
