/**********************************************************

                       FAX ADAPTER PCF9600
                               TO
                           TOWNS TIFF
                           <CONVERTOR>

**********************************************************/



 
/********************************************************************
    プロトタイプ
*********************************************************************/

int optionset( int, char** );

 
static unsigned long ret,pan;

#include <io.h>
#include <fcntl.h>
#include <stat.h>
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include <mos.h>
#include <math.h>
#include <stat.h>

/* T-BIOS C ﾗｲﾌﾞﾗﾘ ﾍｯﾀﾞｰ */
#include <fmcfrb.h>
char str[256];
char extname[256];
char fname[256];
char lsfname[7][256];
char filepath[256];
char namehead[256];
static char Pcfdata[16+304*3380];
/*static char cmpdata[16+304*3000];*/
/*static char Tifdata[3*512*512];*/
static char Monodata[8][2500];
static char Tifhead[512];
static char Workdata[2500];
char wildfname[100][256];
unsigned int 	i,moji,encode;
unsigned long   j;
unsigned int 	ext;
unsigned int 	faxtotif = 2;
unsigned int 	flong = 0;
unsigned int 	mix = 0;
unsigned long 	pcfpoint = 0;
unsigned long	savesize;
unsigned int 	tifline = 0;
unsigned int 	pcfline = 0;
unsigned char 	tifpage =0;
unsigned long	faxwidth;
unsigned long	pcfwidth;
unsigned long	tifwidth;
unsigned long	tifylong;
unsigned long	tifny;
unsigned long	tifypoint;
unsigned long	tifp;
unsigned long	cmpct =0;
static struct find_t wildfbuf;
int wildcard;
int w_ret;
int mode;
int fileno;
int joint = 0;
int option = 0;						/* ｵﾌﾟｼｮﾝ ﾃﾞｰﾀ */
int comic = 0;
unsigned long	sx,ex,x,xx,dd;
unsigned char d1,d2;
int findflag;
int wildct;
int namelen;
char *Tifdata;
int mag;
/**************************************************************

					メイン処理

**************************************************************/


int chgmain( void ){
cmpct =0;
faxtotif = 2;
flong = 0;
pcfpoint = 0;
tifline = 0;
pcfline = 0;
tifpage =0;
ret=0;

/*	option = optionset( argc, argv );

	if ( option == -1 ){
		printf ("fail read=%s write=%s \n", lsfname[0],lsfname[1] );
		exit (-1);
	}
*/
	printf ("INPUT FILE=%s  \n", lsfname[0] );
	/*printf (" B/S CHECK = %d \n",mix );
	*/
	/*KYB_init();
	KYB_setcode( 0 );
	*/
	KYB_clrbuf();
	strcpy(fname,"mno16tif.hed"); 
	if (_access(fname,0) !=0 ){
		printf("no tifheaddata file \n");
		exit(-1);
	}
	else{
		pan=_open(fname,_O_BINARY | _O_RDWR );
		if (pan== -1 ){
			printf("open error! \n");
			exit(-1);
		}
		ret=_read(pan,Tifhead,512);
		if (ret== -1){
			printf("read error! \n");
			_close(pan);
			exit (-1);
		}
	}

	strncat( lsfname[1],extname,3 );
	printf ("OUTPUT FILE=%s \n", lsfname[1] );

/*	printf (" rrs= %x \n",Faxhead[0x3f] );
*/

	
	arccmp ();
	chgtiff ();
	printf("TIFFの最終ペ−ジは %d \n ",tifpage );
	ret=0;
	return ret;
}
/*****************************************************************

						圧縮展開ル−チン


*****************************************************************/


int arccmp ( void ){
char cmpdata[16+304*2000];

strcpy(fname,lsfname[0]); 

	if (_access(fname,0) !=0 ){
		printf("no faxdata file \n");
		exit(-1);
	}
	else{
		pan=_open(fname,_O_BINARY | _O_RDWR );
		if (pan== -1 ){
		printf("open error! %s \n",fname);
			exit(-1);
		}
		else{
			ret = _read(pan,cmpdata,16+304*3380 );
			if (ret == -1 ){
				_close(pan);
				printf("読み込みエラ−が発生しました。\n");
				exit (-1);
			}
			else {
				_close(pan);
				printf("読み込み終了  file size= %d \n",ret);
			}
		}
		if (cmpdata[0] != 0xa3 && cmpdata[0] != 0xa4 && cmpdata[0] != 0xb4 ){
			printf(" Not PCF data file ! <%x>\n",cmpdata[0]);
			exit(-1);
		}
		faxtotif = cmpdata[9];
		tifny = (cmpdata[5]+cmpdata[6]*256)*2;
		if (mag==1 && cmpdata[0]==0xa4){
			tifny = 2400;
		} 
		printf("Y方向ライン数 %d \n",tifny);		
		switch ( cmpdata[0] ) {
			case 0xa4:
				faxwidth = 1728;
				pcfwidth = 216;
				ex = 1728;
				sx = 0;
				if (mix == 1 ){
					sx=0;
					ex=640;
				}
				if (comic == 1 ){
					mix = 3;
				}
				if (mag == 1 ){
					
					mix = 3;
				}
				if (comic == 2 ){
					mix = 5;
					
				}
				break;
			case 0xa3:
				faxwidth = 2432;
				pcfwidth = 304;
				ex = 2432;
				sx = 0;
				if (comic == 1 ){
					mix = 4;
				}
				if (comic == 2 ){
					mix = 8;
				}
				if (mix == 1 ){
					sx=0;
					ex=640;
				}
				if (mix == 2){
					printf("A3の縮小率は1/3からです \n");
					exit(-1);
				}
				break;
			case 0xb4:
				faxwidth = 2048;
				pcfwidth = 256;
				ex = 2048;
				sx = 0;
				if (comic == 1 ){
					mix = 3;
					sx = 64;
					ex = 1984;
				}
				if (mix == 1 ){
					sx=0;
					ex=640;
				}
				if (comic == 2 ){
					mix = 6;
				}
				break;
			default:
				printf("UNKNOWN FORMAT PCF FILE! \n");
				exit(-1);
				break;
		}
	

		for (i=0;i<16;i++){
			Pcfdata[i] = cmpdata[i];
		}
		pcfpoint=0;
		savesize = cmpdata[10]+cmpdata[11]*256+cmpdata[12]*256*256;
		printf("datasize %x \n",savesize);
		if( cmpdata[14]==1){
		  for (i=16;i<savesize;i++){
			d1 = cmpdata[i];
			if ( cmpdata[i] ==0 ){
				i++;
				if( cmpdata[i] ==0 && cmpdata[i+1] == 0xff ){
					i++;
					for( j=0; j<256;j++ ){
						Pcfdata[16+pcfpoint]=0;
						pcfpoint++;
					}
				}	
				else{
					
					cmpct = cmpdata[i];
					for (j=0; j<cmpct; j++ ){
						Pcfdata[16+pcfpoint] = 0;
						pcfpoint++;
					}
				}
			}
			else{
				Pcfdata[16+pcfpoint] = cmpdata[i];
				pcfpoint++;
			}
		  }
		}
		else{
			for (i=16;i<savesize;i++){
				Pcfdata[i] = cmpdata[i];
			}
		}
			
		printf("i= %x pcfpoint= %x \n",i,pcfpoint);
	}
/*	for( x=0x400; x<0x500; x+=0x100 ){
		for (i=0; i<0x100; i+=16){
			for (j=0;j<16;j++ ){
				printf("%x ",Pcfdata[x+i+j]);
			}
			printf("\n");
		}
		moji = KYB_read( 1, &encode );
		if ( moji == 0x71 || moji == 0x1b){
			printf("moji = %x \n ",moji );
			printf("BREAK at TIFLINE= %d  \n",tifline);
			exit(-1);
		}
		printf("\n");
	}
*/

return(0);
}

/*****************************************************************

						デ−タ変換ル−チン


*****************************************************************/


int chgtiff ( void ){

tifwidth = (ex-sx) / mix;
if ( tifwidth<640 ){
	tifwidth = 640;
}

/*char Tifdata[3*512*512];*/
printf("Tifwidth= %d\n",tifwidth );
printf("Tifny= %d\n",tifny );
printf("mix= %d\n",mix );


	/* ﾒﾓﾘ ｱﾛｹ-ｼｮﾝ */
	if ( (Tifdata = malloc( tifwidth/2*(tifny+mix)/mix ) ) == NULL ) {
		strcpy( str, "ごめんなさいメモリ不足です" );
		putmessage();
		exit(-1);
	}



	pcfline=0;
	for (i=0; i < (tifny+mix)/mix-1 ; i++){
		for (j=0; j<(mix+1)/2;j++){
			for (x=0; x<pcfwidth; x++ ){
				for(xx=0; xx<8; xx++ ){
					d1=Pcfdata[16+(pcfline/2+j)*pcfwidth+x];
					d2=Pcfdata[16+(pcfline/2+j+1)*pcfwidth+x];
					if((pcfline % 2) == 0){
						Monodata[j*2][x*8+xx] = ( d1 >>(7-xx) ) & 1;
						Monodata[j*2+1][x*8+xx] = ( d1 >>(7-xx) ) & 1;
					}
					else{
						Monodata[j*2][x*8+xx] = ( d1 >>(7-xx) ) & 1;
						Monodata[j*2+1][x*8+xx] = ( d2 >>(7-xx) ) & 1;
					}
				}
			}
		}
		pcfline += mix;
		cmpct=0;
		for (j=sx;j<ex; j+=mix){
			dd =0;
			for (x=0; x< mix; x++ ){
				for (xx=0; xx<mix; xx++ ){
					dd += Monodata[x][j+xx];
				}
			}
			d2 = dd * 15 / mix / mix;
			d1 = (255-d2) % 16;
			Workdata[cmpct]=d1;
			cmpct++;
		}
		for (j=0;j<cmpct;j+=2 ){
			Tifdata[tifline*tifwidth/2+j/2]= (Workdata[j+1]<<4)+Workdata[j];
		}
		tifline++;
		if(tifline==480 && comic==1 && joint != 1 ){
			break;
		}
		moji = KYB_read( 1, &encode );
		if ( moji == 0x71 || moji == 0x1b){
			printf("moji = %x \n ",moji );
			printf("BREAK at TIFLINE= %d  \n",tifline);
			free(Tifdata);
			exit(-1);
		}
	}
	printf("展開が終了しました｡ TIFの総ライン数 %d \n", tifline );
	tifsave (Tifdata);
	free(Tifdata);
	return (0);
}

/*******************************************************

						TIFF save

*******************************************************/

int tifsave ( Tifdata1 )
	char Tifdata1[];
{

	if (comic==1 && joint==0 ){  /*  comic  */
		tifylong = 480;
	}
	else{
		if (joint==0){
			if (tifline>480 && tifwidth >640 ){
				tifylong = 512;
			}
			else{
				tifylong = 480;
			}
		}
		else{
			tifylong = tifline;
		}
	}
	tifypoint=tifline;
	if (tifypoint <= tifylong ){
		tifpage=1;
	}
	else{
		tifpage=tifline/tifylong+1;
	}
	tifp=0;
	for (i=0;i<tifpage ;i++){	
		Tifhead[30]= tifwidth % 256;
		Tifhead[31]= tifwidth / 256;
		Tifhead[42]= tifylong % 256;
		Tifhead[43]= tifylong / 256;
		Tifhead[126]= tifylong % 256;
		Tifhead[127]= tifylong / 256;
		if(tifylong<480){
			savesize = tifwidth*480/2;
		}
		else{
			savesize = tifwidth*tifylong/2;
		}
		Tifhead[138]= savesize % 256;
		Tifhead[139]= (savesize / 256) % 256;
		Tifhead[140]= (savesize / 256) / 256;

		printf("i=%d,tifwidth=%d tifylong=%d tifypoint=%d tifline=%d \n",i,tifwidth,tifylong,tifypoint,tifline);
		strcpy( fname, lsfname[i+1] );
		savedata(Tifdata1);
		tifp+= savesize;
		tifypoint-=tifylong;
		if (tifypoint <= tifylong ){
			tifylong = tifypoint;
		}
	}
return (0);
}

/***************************************************************
【ﾃﾞ-ﾀﾌｧｲﾙを作成する】

		概要	
		用法	savedata();
		引数	無し
***************************************************************/

int savedata ( Tifdata2 )
char Tifdata2[];
{
	int		wsize;

	if ( _access( fname, 0 ) == 0 ) {
		printf( "同名のファイルがあります。上書きします。\n" );
		ret = _unlink ( fname );
	}
	ret = 0;
	pan = _open( fname,_O_BINARY | _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE );
	if ( pan == -1 ) {
		printf("書き込みのオ−プンに失敗しました。\n" );
		ret = -1;
	}
	if ( ret == 0 ) {
		wsize = _write( pan, &Tifhead[0], 512  );
		if ( wsize == -1 || wsize != 512 ) {
			printf("ヘッダの書き込みに失敗しました。\n" );
			_close( pan );
			exit (-1);
		}
		else{
			wsize = _write( pan, &Tifdata2[tifp], savesize  );
			if ( wsize == -1 || wsize != ( savesize ) ) {
				printf("書き込みに失敗しました。\n" );
				_close( pan );
				exit (-1);
			}
			else{
				printf("書き込みました \n" );
			}
		}
	}
	return (0);
}
/************************************************************
【オプション解析】

		概要	ｵﾌﾟｼｮﾝﾊﾟﾗﾒ-ﾀの解析を行い結果を返す
		用法	optionset( argc, *argv[] );
		引数	int		argc
				char	*argv[]
		戻り値 	int		0	正常終了
						-1	ｵﾌﾟｼｮﾝの指定が正しくない
************************************************************/

int optionset( int argc, char *argv[] ){

	ret = 0;
	int		count;
	char	c;
	int		ii = 0;

	/* ｵﾌﾟｼｮﾝ ﾊﾟﾗﾒｰﾀ 解析 */
/*	printf ( "argc= %d \n",argc );*/
	if ( argc == 1 ) {
		printf(" no input file name \n ");
		exit (-1);
	} 
	else{
/*		printf("argc > 1 \n ");*/
	}
/*	for ( i=0; i<argc; i++){
		printf("para %d = %s \n",i,argv[i]);
	}
*/	for ( count = 1; count < argc; count++ ) {
		c = *argv[count];

/*		strcpy( str, argv[count] );
		putmessage();
*/
/*		printf("argv %d : %s \n ",count,argv[count] );
*/		if ( (  c == '-' ) || (c == '/' ) ) {
			/*printf (" option - find \n "); */
			mix = 0;
			c = *(argv[count] + 1);
			switch ( c ) {
				case 'h':
				case 'H':
				case '?':
					strcpy(str,"*************** FAX-ADAPTER I/O PCF9600 CONVERTER <PCF2TIF>************** \n");
					putmessage();
					strcpy(str,"用法) \n");
					putmessage();
					
					strcpy(str,"RUN386 -nocrt PCF2TIF.EXP [-h/-2/-3/-4/-5/-6/-8/-c] inputfile output file \n");
					putmessage();
					strcpy(str," -h ヘルプを表示 \n");
					putmessage();
					strcpy(str," -l 縦を480ライン以内にする \n");
					putmessage();
					strcpy(str," -j 縦方向を分割しない \n");
					putmessage();
					strcpy(str," -m A4サイズでは縦800ラインにする \n");
					putmessage();
					strcpy(str," -2 .. -8 縮小率 (1/2 .. 1/8 ) \n");
					putmessage();
					strcpy(str," -c 漫画原稿用紙として処理 \n");
					putmessage();
					exit(-1);
					break;
				case 'c':
				case 'C':
					comic=1;
					break;
				case 'm':
				case 'M':
					mag=1;
					joint=1;
					break;
				case 'l':
				case 'L':
					comic=2;
					break;
				case '1':
					mix = 1;
					break;

				case '2':
					mix = 2;
					break;

				case '3':
					mix = 3;
					break;

				case '4':
					mix = 4;
					break;

				case '5':
					mix = 5;
					break;

				case '6':
					mix = 6;
					break;

				case '7':
					mix = 7;
					break;

				case '8':
					mix = 8;
					break;

				case 'J':
				case 'j':
					joint = 1;
					break;


						/* 無効 ﾊﾟﾗﾒｰﾀ */
				default:
					printf("error option \n");
						
			}/* switch  */
		}/* if end */
			
		else{
/*			printf( "argv no. %d : %s \n ",count,argv[count] );*/
			strcpy(fname, argv[count] );
/*			strcpy( str, lsfname[ii] );
*/			putmessage();
/*			ii += 1;*/
		}
	}		/* for count */

/*	printf("read file = %s \n",lsfname[0] );
	printf("write file = %s \n",lsfname[1] );
*/

	namelen=strlen(fname);
	flong=namelen;
	for ( i =namelen-1; (i+1)>0 ;i-- ){
		fname[i]=toupper(fname[i]);
	}
	for ( i =namelen-1; (i+1)>0 ;i-- ){		/* "\"検索 */
		if ( fname[i] != 0x5c ){
			flong -= 1;
		}
		else {
			findflag=1;
			break;
		}
	}
	if(findflag==0){
		flong=1;
		for ( i = 0; i <2 ;i ++ ){	/* ":"検索 */
			if ( fname[i] != 0x3a ){
				flong += 1;
			}
			else {
				findflag=2;
				break;
			}
		}
	}
	if(findflag!=0){

		printf( "Drive/Dir name find \n");
		strncpy( filepath,fname,flong );
		for (i=flong;i<namelen;i++){
			namehead[i-flong]=fname[i];
		}
	}
	else{
		for (i=0; i<namelen-1;i++){
			strcpy(namehead,fname);
		} 
	}
	for ( i = 0; i <254 ;i ++ ){
		if ( namehead[i] == 0x2e ){ 	/*  "."検索  */
			namehead[i] = 0;
			break;
		}
	}
	strcpy( str,"filepath=");
	strcat( str, filepath);
	putmessage();
	strcpy( str, "fnamehead=");
	strcat( str, namehead);
	putmessage();

	flong =strlen(fname);
	if(	fname[flong-2]!=0x41 && fname[flong-2]!=0x61 && 
		fname[flong-2]!=0x42 && fname[flong-2]!=0x62 &&
		fname[flong-1]!=0x33 && fname[flong-1]!=0x34 && 
		fname[flong-1]!=0x35 
		
	){
		printf("拡張子が 正しくありません｡\n");
		return(-1);
	}




	ret = 0;
	return ret;
}







int getname( void ){
	ret = 0;
	ext = 0;
	flong = strlen (lsfname[0]); 
	for ( i = 0; i < flong ;i ++ ){
		if ( lsfname[0][i] == 0x2e ){   /*  "."検索  */
			ret = 1;
			break; 
			
		}
		else{
			ext++;
		}
	}
	for (i = 1; i<4; i++ ){
		strcpy(lsfname[i],extname );
	}
		
	strcat( lsfname[1],"_0.TIF");
	strcat( lsfname[2],"_1.TIF");
	strcat( lsfname[3],"_2.TIF");

	if(lsfname[0][ext+1] !=0x41 && lsfname[0][ext+1]!=0x61 &&  lsfname[0][ext+1]!=0x42 && lsfname[0][ext+1]!=0x62){
		printf("BAD ext1! <%x> \n ",lsfname[0][ext+1]);
		exit(-1);
	}		
	
	if(lsfname[0][ext+2]!=0x33 && lsfname[0][ext+2]!=0x34){
		printf("BAD ext2! <%x> \n ",lsfname[0][ext+2]);
		exit(-1);
	}		

/*	printf("%s \n",lsfname[1]);
*/
	ret = 0;
	return ret;
}

/*********************************************************

					PUT MESSAGE

*********************************************************/

int putmessage ( void ){

printf (" %s \n ",str );
return (0);
}
/*********************************************************

			  			メイン

*********************************************************/


void main( int argc, char *argv[] ){
	fileno=0;
	mode=0x16;
	if(optionset( argc, argv )!=0){
		exit(-1);
	}
	for ( i = 0; i <251 ;i ++ ){
		if ( fname[i] != 0x2a ){ 	/*  "*"検索  */
			flong += 1;
		}
		else {
			wildcard=1;
			break;
		}
	}
	if(wildcard==1){
/*		strcpy(fname,filepath);
		strcat(fname,namehead);
*/
		w_ret=_dos_findfirst((char*)fname,mode,&wildfbuf);
		if(w_ret){
			printf("指定のワイルドカ−ドが見つかりません\n");
			exit(-1);
		}
		else{
			strcpy(wildfname[fileno],wildfbuf.name);
			fileno++;
			for (;;){
				w_ret=_dos_findnext(&wildfbuf);
				if(w_ret){
					printf("指定のワイルドカ−ドを %d 発見しました\n",fileno);
					break;
				}
				strcpy(wildfname[fileno],wildfbuf.name);
				fileno++;
			}
		}
		for(wildct=0;wildct<fileno;wildct++){
			strcpy(lsfname[0],filepath);
			strcat(lsfname[0],wildfname[wildct]);

			ret = 0;
			for ( i = 0; i < 6 ;i ++ ){
				if ( wildfname[wildct][i] == 0x2e ){
					break;
				}
				else{
					extname[i]=wildfname[wildct][i];
				}
			}
			extname[i+1]=0;
			getname();
 			if(chgmain()!=0){
				exit(-1);
			}
		}
	}
/*******************************************************************

                       ここからワイルドカ−ドでない場合

*******************************************************************/


	else{
		namelen=strlen(fname);
		strcpy(lsfname[0],fname);
		for ( i = 0; i < 6 ;i ++ ){
			if ( lsfname[0][i] == 0x2e ){
				break;
			}
			else{
				extname[i]=lsfname[0][i];
			}
		}
		extname[i+1]=0;
		getname();
		if(chgmain()!=0){
			exit(-1);
		}
	}
	exit(0);
}
