/************************************************************************
*		ＣＯＬＯＲコンバート					*
************************************************************************/

#include <stdio.h>

#define unchar	unsigned char
#define unshort unsigned short

#define ON	1
#define OFF	0

FILE *fpr,*fpw0,*fpw1;

void	colcnv( char * );

void main( int argc,char **argv )
{

	/****** 変数宣言 ******/

	/****** 引数チェック ******/
	if( argc != 4 ){
		printf( "Usage: ys_colcnv (table_file) (label_file) (convert data_file)\n" );
		exit(1);
	}

	/****** テーブルファイルＯＰＥＮ ******/
	if( !( fpr = fopen( argv[1],"r" ) ) ){
		printf( "can't open (%s) !!\n",argv[1] );
		exit(1);
	}

	/****** ラベル名ファイルＯＰＥＮ ******/
	if( !( fpw0 = fopen( argv[2],"w" ) ) ){
		printf( "can't open (%s) !!\n",argv[2] );
		exit(1);
	}

	/****** コンバートデータ出力ファイルＯＰＥＮ ******/
	if( !( fpw1 = fopen( argv[3],"w" ) ) ){
		printf( "can't open (%s) !!\n",argv[3] );
		exit(1);
	}

	/****** カラーデータ変換 ******/
	colcnv( argv[1] );


	/****** ファイルＣＬＯＳＥ ******/
	fclose( fpr );
	fclose( fpw0 );
	fclose( fpw1 );

}

/****************************************************************
*	カラーデータ変換					*
****************************************************************/
void colcnv( char *tbl_name )
{

	/****** 変数宣言 ******/
	FILE	*fpr0;

	struct {
		char	name[256];
		int	pointer;
	} label[512];
	int	label_no = 0;

	unchar	cnv_buf[0x8000];	/* コンバートデータバッファ */
	int	cnv_pnt = 0;		/*	      ”	   ポインター */

	int	line_no = 1;		/* ラインＮＯ． */
	char	tbl_buf[256];
	char	arg0_buf[256];
	char	arg1_buf[256];
	int	arg2_buf;
	int	arg3_buf;

	unchar	col_buf[0x200];		/* カラーデータバッファ */
	int	file_flag = 0;		/* ファイルＯＰＥＮフラグ */

	int	i;

	/****** テーブルファイル読み込み ******/
	while( fgets( tbl_buf,256,fpr ) != NULL ){		/* ファイルＥＮＤ？ */

		arg0_buf[0] = '\0';
		sscanf( tbl_buf,"%s %s %X %X",arg0_buf,arg1_buf,&arg2_buf,&arg3_buf );

		if( strlen( arg0_buf ) && arg0_buf[0] != '#' ){

			if( !( strcmp( arg0_buf,".file" ) ) ||
			    !( strcmp( arg0_buf,".FILE" ) ) ){

				/********************************************************
				*	カラーファイル指定				*
				********************************************************/

				strcat( arg1_buf,".COL" );	/* カラーファイル名作成 */

				/****** カラーファイルＯＰＥＮ ******/
				if( file_flag ){
					fclose( fpr0 );
				}
				if( !( fpr0 = fopen( arg1_buf,"r" ) ) ){
					printf( "%s:%d: can't open (%s) !!\n",tbl_name,line_no,arg1_buf );
					exit(1);
				}

				/****** カラーデータ読み込み ******/
				if( fread( col_buf,sizeof(unchar),0x200,fpr0 ) != 0x200 ){
					printf( "%s:%d: color file(%s) read error !!\n",tbl_name,line_no,arg1_buf );
					exit(1);
				}

				file_flag = 1;

			}
			else if( !( strcmp( arg0_buf,".label" ) ) ||
				 !( strcmp( arg0_buf,".LABEL" ) ) ){

				/********************************************************
				*	カラーデータ取り出し指定			*
				********************************************************/

				if( !file_flag ){
					printf( "%s:%d: color data nothing !!\n",tbl_name,line_no );
					exit(1);
				}
				if( arg1_buf[0] != '.' ){
					strcpy( label[label_no].name,arg1_buf );
					label[label_no].pointer = cnv_pnt;
					label_no++;
				}

				for( i=(arg2_buf*2);i<=(arg3_buf*2)+1;i++ ){
					cnv_buf[cnv_pnt++] = col_buf[i];
				}

			}
			else if( !( strcmp( arg0_buf,".end" ) ) ||
				 !( strcmp( arg0_buf,".END" ) ) ){

				/********************************************************
				*	ＥＮＤ指定					*
				********************************************************/

				break;

			}
			else{
				/********************************************************
				*	エラーコード指定				*
				********************************************************/

				printf( "%s:%d: error code !!\n",tbl_name,line_no );
				exit(1);

			}

		}

		line_no++;

	}

	if( cnv_pnt ){		/* コンバートデータ無し？ */

		/********************************************************
		*	ラベル名出力					*
		********************************************************/

		fprintf( fpw0,";************************************************************************\n" );
		fprintf( fpw0,";*\t\tcolor data pointer table\t\t\t\t\n" );
		fprintf( fpw0,";************************************************************************\n" );
		fprintf( fpw0,";\n" );
		for( i=0;i<label_no;i++ ){
			fprintf( fpw0,"%s\t",label[i].name );
			if( strlen( label[i].name ) < 8 ) fprintf( fpw0,"\t" );
			fprintf( fpw0,"EQU\t%05XH\n",label[i].pointer );
		}
		fprintf( fpw0,";\n" );

		/********************************************************
		*	コンバートデータ出力				*
		********************************************************/

		if( fwrite( cnv_buf,sizeof(unchar),cnv_pnt,fpw1 ) != cnv_pnt ){
			printf( "convert data write error !!\n" );
		}

	}

}
