//bin2hex.cpp Coded by x@rgs
#include <stdio.h>

//出力ファイル名用バッファ(省略された時のみ)
const int iFileNmaeBuffer=1024;

int strlen(const char *str){
	int i=0;
	while(*str++)i++;
	return i;
}

int main(int argc,const char* argv[]){
	FILE* fpIn;
	FILE* fpOut;

	if(argc==2||argc==3){
		if((fpIn=fopen(argv[1],"rb"))!=NULL){
			char szOut[iFileNmaeBuffer]={0};
			char* pszOut;
			if(argc==2){
				//出力ファイル名が省略された時は〜.hexとして出力
				int i=strlen(argv[1]);
				if(i+1>iFileNmaeBuffer){
					//バッファが足りない時はa.hexとして出力
					szOut[0]='a';
					i=1;
				}else{
					pszOut=szOut;
					while((*(pszOut)++=*(argv[1])++));
				}
				szOut[i]='.';
				szOut[++i]='h';
				szOut[++i]='e';
				szOut[++i]='x';
			}

			if((fpOut=fopen((argc==2)?szOut:argv[2],"w"))!=NULL){
				int i=0;
				int iChar;

				while((iChar=fgetc(fpIn))!=EOF){
					if(i!=0){
						//16文字毎に改行する
						if(i%16==0)fprintf(fpOut,"\n");
						else fprintf(fpOut," ");
					}
					fprintf(fpOut,"%02lx",iChar&0xFFl);
					i++;
				}
				fclose(fpOut);
			}else{
				fprintf(stderr,"Cannot open %s\n",(argc==2)?szOut:argv[2]);
			}
			fclose(fpIn);
		}else{
			fprintf(stderr,"Cannot open %s\n",argv[1]);
		}
	}else{
		fprintf(stderr,"Invalid argument\n");
	}
	return 0;
}
