
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<ctype.h>
#include	<memory.h>

#define	UCHAR	unsigned char
#define	SHORT	short

typedef	struct
{	char	idCode[10];
	char	dmy[6];
	SHORT	gaiNum;			/* 登録外字数	*/
	UCHAR	xs, ys;			/* ドット数		*/
	UCHAR	xb, yb;			/* バイト数		*/
	UCHAR	bytes;			/* ????			*/
	UCHAR	col;			/* ????			*/
	long	ofs;			/* オフセット	*/
	char	dmy2[4];
} GAIHEAD_T;

char	Fnt12flag = 0;

void	MakeGaijiDat(char *fn, char *writePath)
{
	int			i, j, k, n;
	FILE		*rfp, *wfp;
	UCHAR		*buf, tmp[4];
	SHORT		code;
	GAIHEAD_T	gaiHead;

	if ( (rfp = fopen(fn,"rb")) == NULL )
	{	fprintf(stderr,"@ file open error!! (%s)\n", fn);
		exit(1);
	}
	/* ヘッダ情報の読み取り	*/
	fread(&gaiHead,sizeof(GAIHEAD_T),1,rfp);
	if ( memcmp(gaiHead.idCode, "GAIJIFIL", 8) != 0 )
	{	fclose(rfp);
		fprintf(stdout,"@ Gaiji file header error!!\n");
		exit(1);
	}
	if ( gaiHead.gaiNum == 0 )
	{	fclose(rfp);
		fprintf(stdout,"@ 外字データが存在しません！！\n");
		exit(1);
	}
	fprintf(stderr,"size (%02d,%02d)\n", gaiHead.xs, gaiHead.ys);

	if ( (buf = malloc(gaiHead.bytes)) == NULL )
	{	fclose(rfp);
		fprintf(stdout,"@ Memory allocation error!!\n");
		exit(1);
	}

	if ( writePath == NULL )
		wfp = stdout;
	else
	{	if ( (wfp = fopen(writePath, "wb")) == NULL )
		{	fprintf(stderr,"@ file open error!! (%s)\n", writePath );
			exit(1);
		}
	}
	for ( i = 0; i < gaiHead.gaiNum; ++i )
	{
		fread(tmp, 2,1, rfp);
		code = tmp[0]*256 + tmp[1];
		fprintf(stderr,"$ code $%04X\n", code );
		fread(buf, gaiHead.bytes,1, rfp);
		if ( Fnt12flag && gaiHead.bytes ==  32 )
		{	/* 12ドットフォント用にコンバート	*/
			for ( j = 0; j < 24; j += 2 )
				buf[j+1] &= 0xF0;
			n = 24;
		} else
			n = gaiHead.bytes;
		
		fprintf(wfp,"\n/* $ code $%04X */\n", code );
		for ( k = 0; k < n; ++k )
		{	fprintf(wfp,"0x%02X,",buf[k]);
			if ( (k & 7) == 7 )
				fprintf(wfp,"\n");
		}
		if ( (n & 7) != 0 )
			fprintf(wfp,"\n");
	}
	free(buf);
	fclose(wfp);
	fclose(rfp);
}



void	help(void)
{	exit(1);
}

void	main(int argc,char *argv[])
{
	char	*s;
	int		i;
	char	*fn = NULL;
	char	*writePath = NULL;

	for ( i = 1; i < argc; ++i )
	{	s = argv[i];
		if ( *s == '?' )
			help();
		if ( *s == '-' || *s == '/' )
		{	/* option(s)	*/
			++s;
			if ( *s == '?' )
				help();
			if ( tolower(*s) == 'w' )
			{	writePath = &s[1];
			} else if ( strcmp(s,"12") == 0 )
				Fnt12flag = 1;
		} else if ( fn == NULL )
			fn = s;
	}
	if ( fn == NULL )
		fn = "gaiji.dot";

	MakeGaijiDat( fn, writePath );

	exit(0);
}

