#include <stdio.h>
#include "stdlib.h"
#include "string.h"
#include "egb.h"
#include "FMCFRB.H"
#include <msdos.cf>

/* #include "zc.h" */

#define  KBUF_SIZE	(640 * 480 * 2)

#define  SPACE_DELM 0
#define  SPACE_SKIP 1

extern char gwork[];	/* グラフィックワ−ク */
extern int svar[];
extern char	*guiEgbPtr ;	/*	mov生成用ワークアドレス	*/
extern char	*rbuf ;		/*	mov生成用ワークアドレス	*/
extern char	*bbuf ;		/*	mov生成用ワークアドレス	*/
extern int pacRough;
extern int idouMode;
extern int pacFilter;

extern int mode;		/* 1=2色 4=16色 8=256色 16=32k色 */
extern int ovr;			/* 重ね合わせ濃度	*/
extern int aflg;		/* 加算フラグ	*/
extern int sx,sy;		/* ズ−ム大きさ	*/
extern int ix,iy;		/* 読み込み位置	*/

int Get_word();

int ComFile( char *filename, short int *kbuf)
{
	FILE	*fp;
	char	word[80];
	int	delm;
	char	tracetext[80];
	char	com;
	char outfile[16], infile[16], prefix[80];
	int outmode;
	int fflg;
	short int *twbuf;		/* きらきら用バッファ */
	int  twflag, twvalue, twrange;

	if((fp = fopen(filename,"r")) == NULL){
		return 0;
	}

	memset( outfile, 0, sizeof(outfile));
	memset( prefix,  0, sizeof(prefix) );
	outmode = 0;

	/* コマンドファイル終了までのループ */
	fflg = 0;
	while(delm=Get_word(&fp, word, sizeof(word), SPACE_DELM), delm != EOF){
		if( delm == EOF ){
			break;
		}
		if( word[0] == '\0' ){
			continue;
		}

		if( delm == '(' ){ /* '?('の形ならwordはコマンド	*/
			com = word[0];
			switch( com ){
			case 'v':	/* v(動画ファイル名 ラフレ−ト,ソフトネス,	*/
			case 'V':	/*   左上X, 左上Y, 右下X, 右下Y) */
				/* 出力モード ラフレ−ト ソフトネス 録画範囲の初期値セット */
				outmode = 2;
				svar[0] = 0 ;
				svar[1] = 0 ;
				svar[2] = pacRough ;
				svar[3] = idouMode * 8 ;
				svar[4] = 0 ;
				svar[5] = 0 ;
				svar[6] = 319 ;
				svar[7] = 239 ;
				svar[11] = pacFilter ;
				rbuf = malloc(153600);
				memset( rbuf, 0, 153600);
				bbuf = malloc(524288);
				memset( rbuf, 0, 524288);
				guiEgbPtr = gwork;

				/* 出力動画ファイル名 */
				delm = Get_word( &fp, outfile,  sizeof(outfile)-5, SPACE_SKIP);
				if( NULL == memchr(outfile, '.',sizeof(outfile)) ){
					strcat( outfile, ".mov");
				}
				sprintf(tracetext, "movfilename=%s\n", outfile);
				trace(tracetext);
				if( delm == ')' ){
					break;
				} else if( delm != ','){
					sprintf(tracetext,"m(動画ファイル名の次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}

				/* ラフレ−ト */
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] != '\0' ){ /* 省略されていなければ変更 */
					pacRough = atoi(word);
					svar[2] = pacRough ;
				}
				if( delm == ')' ){
					break;
				} else if( delm != ','){
					sprintf(tracetext,"m(動画ファイル名,ラフレートの次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}

				/* ソフトネス */
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] != '\0' ){ /* 省略されていなければ変更 */
					pacFilter = atoi(word);
					svar[11] = pacFilter ;
				}
				if( delm == ')' ){
					break;
				} else if( delm != ','){
					sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネスの次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}

				/* 録画範囲(左上x) */
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] != '\0' ){ /* 省略されていなければ変更 */
					svar[4] = atoi(word);
				}
				if( delm == ')' ){
					break;
				} else if( delm != ','){
					sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上xの次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}

				/* 録画範囲(左上y) */
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] != '\0' ){ /* 省略されていなければ変更 */
					svar[5] = atoi(word);
				}
				if( delm == ')' ){
					break;
				} else if( delm != ','){
					sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上x, 左上yの次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}

				/* 録画範囲(右下x) */
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] != '\0' ){ /* 省略されていなければ変更 */
					svar[6] = atoi(word);
				}
				if( delm == ')' ){
					break;
				} else if( delm != ','){
					sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上x,左上y,右下xの次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}

				/* 録画範囲(右下y) */
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] != '\0' ){ /* 省略されていなければ変更 */
					svar[7] = atoi(word);
				}
				if( delm != ')' ){
					sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上x,左上y,右下x,右下yの次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}
				break;

			case 'o':	/* o(出力TIFFファイル名)	*/
			case 'O':
				outmode = 1;
				delm = Get_word( &fp, outfile,  sizeof(outfile)-5, SPACE_SKIP);
				if( NULL == memchr(outfile, '.',sizeof(outfile)) ){
					strcat( outfile, ".tif");
				}
				if(delm != ')'){
					sprintf(tracetext,"o(出力TIFFファイル名の次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}
				break;

			case 'p':	/* 入力TIFFファイル名のプレフィックス */
			case 'P':
				delm = Get_word( &fp, prefix,  sizeof(prefix), SPACE_SKIP);
				if(delm != ')'){
					sprintf(tracetext,"p(入力TIFFファイル名プレフィックス の次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}
				break;

			case 'l':	/* 濃度 */
			case 'L':
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if(delm != ')'){
					sprintf(tracetext,"l(濃度 の次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}

				ovr = atoi( word );
				if( ovr < 0 || ovr > 256 ){
					sprintf(tracetext, "l(濃度の値が異常です0-256の範囲にして下さい 異常な値=%d)\n", ovr);
					trace( tracetext );
					exit( -1 );
				}
				break;

			case 'm':	/* 移動量	*/
			case 'M':
				/* Ｘ */
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] == '\0'){
					trace("m(移動量のXが指定されていません\n");
					exit(-1);
				}
				if( delm == ')'){
					trace("m(移動量のYが指定されていません\n");
					exit(-1);
				}
				ix = atoi(word);

				/* Ｙ	*/
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] == '\0'){
					trace("m(移動量のYが指定されていません\n");
					exit(-1);
				}
				if( delm != ')'){
					sprintf(tracetext, "m(移動量のYの次の文字が誤りです 文字=%d\n", delm);
					trace( tracetext);
					exit(-1);
				}
				iy = atoi(word);
				break;

			case 'z':	/* 拡大／縮小 */
			case 'Z':
				/* Ｘ */
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] == '\0'){
					trace("z(拡大/縮小量のXが指定されていません\n");
					exit(-1);
				}
				if( delm == ')'){
					trace("z(拡大/縮小量のYが指定されていません\n");
					exit(-1);
				}
				sx = atoi(word);

				/* Ｙ	*/
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] == '\0'){
					trace("z(拡大/縮小量のYが指定されていません\n");
					exit(-1);
				}
				if( delm != ')'){
					sprintf(tracetext, "z(拡大/縮小量のYの次の文字が誤りです 文字=%d\n", delm);
					trace( tracetext);
					exit(-1);
				}
				sy = atoi(word);
				break;

			case 'w':
			case 'W':
				twflag = 1;

				/* 強さ */
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] == '\0'){
					trace("w(透過光の強さが指定されていません\n");
					exit(-1);
				}
				if( delm == ')'){
					trace("w(透過光の大きさが指定されていません\n");
					exit(-1);
				}
				twvalue = atoi(word);

				/* 大きさ */
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if( word[0] == '\0'){
					trace("w(透過光の大きさが指定されていません\n");
					exit(-1);
				}
				if( delm != ')'){
					sprintf(tracetext, "w(透過光の強さ,大きさの次の文字が誤りです 文字=%d\n", delm);
					trace( tracetext);
					exit(-1);
				}
				twrange = atoi(word);
				break;

			case 'a':
			case 'A':
				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if(delm != ')'){
					sprintf(tracetext,"a(加算合成フラグ の次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}

				aflg = atoi( word );
				if( aflg != 0 || aflg != 1 ){
					sprintf(tracetext, "a(０又は１以外の値が指定されています 異常な値=%d)\n", aflg);
					trace( tracetext );
					exit( -1 );
				}
				break;

			case 'b':
			case 'B':
				twflag = 2;

				delm = Get_word( &fp, word,  sizeof(word), SPACE_SKIP);
				if(delm != ')'){
					sprintf(tracetext,"b(暈しの程度 の次の文字が誤りです 文字=%c\n", delm);
					trace(tracetext);
					exit(-1);
				}

				twvalue = atoi(word);
				if( twvalue < 0 || twvalue > 256 ){
					sprintf(tracetext, "l(暈しの程度の値が異常です.0-256の範囲にして下さい 異常な値=%d)\n", twvalue);
					trace( tracetext );
					exit( -1 );
				}
				break;

			}
		} else { /* デリミタが'('以外なら wordがファイル名	*/
			/***************************************************
			  ファイル->GVRAM
			  ****************************************************/
			memset( infile, 0, sizeof(infile));
			strcpy( infile, prefix );
			strcat( infile, word );
			
			FileToGvram( infile, &mode, ix, iy );

			/***************************************************
			  GVRAM -> 重ね合わせ用バッファ
			  ***************************************************/
			switch( twflag ){
			case 0:	/* 普通の処理 */
				GvramToBuf( kbuf );
				break;
			case 1:	/* クロスフィルタ−付き透過光	*/
				twbuf = (short int*)malloc( KBUF_SIZE );
				if( kbuf == NULL){
					trace("Fail to malloc twbuf");
					exit( -1 );
				}
				_fill_char( twbuf, KBUF_SIZE, 0 );
				GvramToBuf( twbuf );

				twinkle( twbuf, kbuf, twvalue, twrange );

				twflag = 0;
				free( twbuf );
				break;
			case 2:	/* 暈し処理	*/
				twbuf = (short int*)malloc( KBUF_SIZE );
				if( kbuf == NULL){
					trace("Fail to malloc twbuf");
					exit( -1 );
				}
				_fill_char( twbuf, KBUF_SIZE, 0 );
				GvramToBuf( twbuf );

				Gradate( twvalue, kbuf );

				twflag = 0;
				free( twbuf );
				break;
			}
		}

		if( delm == ';'){
			/***************************************************
			  GVRAM -> ファイル
			  ****************************************************/
			sprintf(tracetext, "before BufToFile=%s\n", outfile);
			trace(tracetext);
			BufToFile(outmode, outfile, kbuf);
			sprintf(tracetext, "after BufToFile=%s\n", outfile);
			trace(tracetext);

			fflg = 1;
			aflg = 0;
			ovr  = 256;
			ix = 0;
			iy = 0;
			_fill_char( kbuf, KBUF_SIZE, 0 );
		}
	}
	fclose(fp);
	return fflg;
}

/***************************************************************************
  ファイルから単語を切り出す
**************************************************************************/
int Get_word( fp, word, size, smode )
FILE		**fp;
char		*word;
unsigned int size;	/* word配列の大きさ */
int			smode;	/* 1..スペース,改行で単語が終ったら次に現れたスペース以外の文字を探してその文字をデミリタとして返す 0..スペース,改行は普通のデミリタ */
{
	int inp, tmp;
	int i;
	char tracetext[160];
	int  delm;
	
	/* スペースをスキップ */
	do{
		inp = fgetc( *fp );
	}while( inp == ' ' );
   
	/* デミリタ又が現れるまで単語とみなす */
	i = 0;
	while(i < size){
		switch(inp){
		case '/':
			tmp = inp;
			inp = fgetc( *fp );
			switch( inp ){
			case '/':
				/* コメント読み飛ばす処理(行末まで) */
				do{
					inp = fgetc( *fp );
				}while( inp != '\n' );
				continue;
			case '*':
				/* コメント読み飛ばす処理(コメントおわりまで) */
				SKIP_LOOP:
				do{
					inp = fgetc( *fp );
				}while( inp != '*' );
				inp = fgetc( *fp );
				if( inp != '/'){
					goto SKIP_LOOP;
				}
				inp = fgetc( *fp );
				continue;
			default:
				word[i] = (char)tmp;
				i ++;
				word[i] = (char)inp;
				i ++;
				inp = fgetc(*fp);
				continue;
			}

		case ' ':
		case '\n':
			if (smode == 1){
				/*スペース,改行をスキップして見付けた文字をデミリタとして返す*/
				do{
					inp = fgetc( *fp );
				}while( inp == ' ' );
			}
		case '(':
		case ')':
		case ',':
		case ';':
		case EOF:
			delm = inp;
			word[i] = '\0';
trace("Get_word return:");
trace(word);
			return delm;
		}
		word[i] = (char )inp;
		i ++;
		inp = fgetc(*fp); 
	}

	/* 1単語がsize以上ならエラー */
	*(word + size) = '\0';
	sprintf(tracetext, "単語の長さが長過ぎます 単語=%s\n", word);
	trace( tracetext );
	exit( -1 );
	return '\0';
}
