/********************************************************************
 *																	*
 *							ＤＩＳＫＤＵＰ							*
 *																	*
 *						オンメモリ型 DISKCOPY						*
 *																	*
 *							diskdup.exp								*
 *																	*
 *							for	FM-TOWNS							*
 *																	*
 *			Copyright (c) ちにゃと ＆ Ｔｙｍｉｃ 1992. 1993.		*
 *																	*
 *						ＯＰＴＩＯＮ ソース							*
 *																	*
 ********************************************************************/

#define __OPT__					/* ﾌｧｲﾙ ID */


/********************************************************************
	インクルードファイル
*********************************************************************/

/* HI-C ﾗｲﾌﾞﾗﾘ ﾍｯﾀﾞｰ */
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <stat.h>
#include <string.h>
#include <memory.h>

/* ｿｰｽ ﾍｯﾀﾞｰ */
#include "diskdup.h"
#include "ddupgui.h"
#include "option.h"


/********************************************************************
	変数
*********************************************************************/

static ulong pan;
static ulong dtlong;
static char fname[256];				/* ﾌｧｲﾙ 名 ﾊﾞｯﾌｧ */
static char Headdata[32];			/* ﾌｧｲﾙ ﾍｯﾀﾞｰ ﾊﾞｯﾌｧ	*/

static char Disk_2HD_120[32] = "DISKDUP MFM 2HD 1024B/S 8S 154T ";
static char Disk_2DD_720[32] = "DISKDUP MFM 2DD  720B/S 9S 160T ";
static char Disk_2DD_640[32] = "DISKDUP MFM 2DD  640B/S 8S 160T ";
static char Disk_2HC_120[32] = "DISKDUP MFM 2HC  512B/S15S 160T ";

int flagld = 0;						/* ﾛｰﾄﾞ 指定 ﾌﾗｸﾞ */
int flagsv = 0;						/* ｾｰﾌﾞ 指定 ﾌﾗｸﾞ */
int flagfmt = 0;					/* ﾌｫｰﾏｯﾄ 指定 ﾌﾗｸﾞ */
int flagipt = 0;					/* ｴﾗｰ無視 指定 ﾌﾗｸﾞ */
int flagerr = 0;					/* ｵﾌﾟｼｮﾝ ｴﾗｰ ﾌﾗｸﾞ */


/************************************************************
【オプション解析】

		概要	ｵﾌﾟｼｮﾝﾊﾟﾗﾒ-ﾀの解析を行い結果を返す
		用法	optionset( argc, argv );
		引数	int		argc
				char	*argv[]
		戻り値 	int		0	ｵﾌﾟｼｮﾝ無し
						-1	ｵﾌﾟｼｮﾝの指定が正しくない
						-2	ﾍﾙﾌﾟを表示
							  ﾋﾞｯﾄが立っていない場合   立っている場合
						bit 0	ﾃﾞ-ﾀﾌｧｲﾙをﾛ-ﾄﾞしない / ﾃﾞ-ﾀﾌｧｲﾙをﾛ-ﾄﾞする
							1	ﾃﾞ-ﾀﾌｧｲﾙを作成しない / ﾃﾞ-ﾀﾌｧｲﾙを作成する
							2*	ﾌｫ-ﾏｯﾄを選択する	 / ﾌｫ-ﾏｯﾄをしない
							3*	ﾌｫ-ﾏｯﾄを選択する	 / ﾌｫ-ﾏｯﾄをする
							4	入力を求める		 / ｴﾗ-時以外は入力を求めない
		注意	bit2 = 0 && bit3 = 0 の時のみﾌｫ-ﾏｯﾄを選択する
************************************************************/

int optionset( int argc, char *argv[] )
{
	int		ret = 0;
	int		count;
	char	c;

	/* ｵﾌﾟｼｮﾝ ﾊﾟﾗﾒｰﾀ 解析 */
	if ( argc > 1 ) {
		for ( count = 1; count < argc; count++ ) {
			if ( ( ret != -1 ) && (ret != -2 ) ) {
				c = *argv[count];
				/* debug ****
				strcpy( str, argv[count] );
				putmessage();
				ready();
				/****/
				if ( c == '/' || c == '-' ) {
					c = *(argv[count] + 1);
					switch ( c ) {
						case 'h':
						case 'H':
						case '?':
							ret = -2;
							break;

						case 'l':
						case 'L':
							flagld = 1;
							ret |= 1;
							break;

						case 's':
						case 'S':
							flagsv = 1;
							ret |= 2;
							break;

						case 'f':
						case 'F':
							flagfmt = 2;
							ret |= 8;
							break;

						case 'd':
						case 'D':
							flagfmt = 1;
							ret |= 4;
							break;

						case 'i':
						case 'I':
							flagipt = 1;
							ret |= 16;
							break;

						/* 無効 ﾊﾟﾗﾒｰﾀ */
						default:
							ret = -1;
					}
				}
				else {
					strcpy(fname, argv[count] );
					/* debug ****
					strcpy( str, fname );
					putmessage();
					/****/
				}
			}		/* if  ret */
		}		/* for count */
	} 		/* if  argc */
	return ret;
}


/***************************************************************
【ﾃﾞ-ﾀﾌｧｲﾙを読み込む】

		概要	
		用法	loaddata();
		引数	char	*Data
		戻り値	int		0			: 成功
						-1			: 失敗
						!0 or !-1	: diskのﾌｫ-ﾏｯﾄの種類
		注意	無し
***************************************************************/

int loaddata ( char *Data )
{
	int		ret = 0;
	int		rsize;

	if ( access( fname, 0 ) != 0 ) {
		flagerr = 1;
		strcpy( str, "デ−タファイルが見つかりません｡" );
		putmessage();
		ready();
		ret = -1;
		flagerr = 0;
	}
	else {
		pan = _open( fname, _O_BINARY | _O_RDWR );
		if ( pan == -1 ) {
			flagerr = 1;
			strcpy( str, "ファイルのオ−プンに失敗しました。" );
			putmessage();
			ready();
			ret = -1;
			flagerr = 0;
		}

		rsize = _read( pan, Headdata, 32 );
		if ( rsize == -1 || rsize != 32 ) {
			flagerr = 1;
			strcpy( str, "ﾍｯﾀﾞの読み込みに失敗しました。" );
			putmessage();
			ready();
			_close( pan );
			ret = -1;
			flagerr = 0;
		}

		if ( strncmp( Headdata, "DISKDUP ", 8 ) != 0 ) {
			flagerr = 1;
			strcpy( str, "DISKDUPのﾃﾞ-ﾀﾌｧｲﾙではありません｡" );
			putmessage();
			ready();
			_close( pan );
			ret = -1;
			flagerr = 0;
		}
		else {
			if (( ret = gethead() ) != -1 ) {
				rsize = _read( pan, Data, dtlong );
			}
			if ( rsize == -1 || rsize != dtlong || ret == -1 ) {
				flagerr = 1;
				_close( pan );
				strcpy( str, "ﾃﾞ-ﾀﾌｧｲﾙの読み込みに失敗しました。" );
				putmessage();
				ready();
				ret = -1;
				flagerr = 0;
			}
			else {
				_close(pan);
			}
		}
	}
	return ret;
}


/***************************************************************
【ﾃﾞ-ﾀﾌｧｲﾙを作成する】

		概要	
		用法	savedata();
		引数	無し
		戻り値	int			0 	: 成功
							-1	: 失敗
		注意	無し
***************************************************************/

int savedata ( char *Data, int sw )
{
	int		ret = 0;
	int		wsize;

	if ( _access( fname, 0 ) == 0 ) {
		flagerr = 1;
		strcpy( str, "同名のファイルがあります。上書きして良いですか。" );
		putmessage();
		if ( select() == 1 ) {
			ret = -1;
		}
	}

	flagerr = 0;
	if ( ret == 0 ) {
		pan = _open( fname,_O_BINARY | _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE );
		if ( pan == -1 ) {
			ret = -1;
		}
		if ( ret == 0 ) {
			makehead( sw );
			wsize = _write( pan, Headdata, 32 );
			if ( wsize == -1 || wsize != 32 ) {
				flagerr = 1;
				strcpy( str, "ﾍｯﾀﾞの書き込みに失敗しました。" );
				putmessage();
				ready();
				_close( pan );
				ret = -1;
				flagerr = 0;
			}
		}
		if ( ret == 0 ) {
			wsize = _write( pan, Data, dtlong );
			if ( wsize == -1 || wsize != dtlong ) {
				flagerr = 1;
				strcpy( str, "ﾃﾞ-ﾀの書き込みに失敗しました。" );
				putmessage();
				ready();
				_close( pan );
				_unlink( fname );
				ret = -1;
				flagerr = 0;
			}
			else {
				_close( pan );
			}
		}
	}
	return ret;
}


/**********************************************************
【ﾍｯﾄﾞﾃﾞ-ﾀを作る】

		概要	
		用法	makehead( sw );
		引数	int		sw		: ﾍｯﾀﾞｰ ﾀｲﾌﾟ	TYPE_2HD_12
												TYPE_2DD_720
												TYPE_2DD_640
												TYPE_2HC_12
		戻り値	無し
		注意	変化する変数 char Headdata[]
**********************************************************/

void makehead( int sw )
{
	switch ( sw ) {
		case TYPE_2DD_720:
			strncpy( Headdata, Disk_2DD_720, 32 );
			dtlong = SECLEN512 * MAXSEC_720 * MAXCYL_2DD * MAXHEAD;
			break;

		case TYPE_2DD_640:
			strncpy( Headdata, Disk_2DD_640, 32 );
			dtlong = SECLEN512 * MAXSEC_640 * MAXCYL_2DD * MAXHEAD;
			break;

		case TYPE_2HC_12:
			strncpy( Headdata, Disk_2HC_120, 32 );
			dtlong = SECLEN512 * MAXSEC_12C * MAXCYL_2HC * MAXHEAD;
			break;

		case TYPE_2HD_12:
		default:
			strncpy( Headdata, Disk_2HD_120, 32 );
			dtlong = SECLEN1024 * MAXSEC_12 * MAXCYL_2HD * MAXHEAD;
			break;
	}
}


/**********************************************************
【ﾍｯﾄﾞﾃﾞ-ﾀからﾃﾞｨｽｸﾀｲﾌﾟを得る】

		概要	
		用法	gethead();
		引数	無し
		戻り値	int		-1				: エラ−
						TYPE_2HD_12		: 1.2M 2HD
						TYPE_2DD_720	: 720K 2DD
						TYPE_2DD_640	: 640K 2DD
						TYPE_2HC_12		: 1.2M 2HC
		注意	無し
**********************************************************/

int gethead( void )
{
	int disktypes;

	if ( strncmp( Headdata, Disk_2HD_120, 32 ) == 0 ) {
		disktypes = TYPE_2HD_12;
		dtlong = SECLEN1024 * MAXSEC_12 * MAXCYL_2HD * MAXHEAD;
		flagerr = 1;
		strcpy( str, "1.2M 2HD" );
		putmessage();
		flagerr = 0;
	} else if ( strncmp( Headdata, Disk_2DD_720, 32 ) == 0 ) {
		disktypes = TYPE_2DD_720;
		dtlong = SECLEN512 * MAXSEC_720 * MAXCYL_2DD * MAXHEAD;
		flagerr = 1;
		strcpy( str, "720K 2DD" );
		putmessage();
		flagerr = 0;
	} else if ( strncmp( Headdata, Disk_2DD_640, 32 ) == 0 ) {
		disktypes = TYPE_2DD_640;
		dtlong = SECLEN512 * MAXSEC_640 * MAXCYL_2DD * MAXHEAD;
		flagerr = 1;
		strcpy( str, "640K 2DD" );
		putmessage();
		flagerr = 0;
	} else if ( strncmp( Headdata, Disk_2HC_120, 32 ) == 0 ) {
		disktypes = TYPE_2HC_12;
		dtlong = SECLEN512 * MAXSEC_12C * MAXCYL_2HC * MAXHEAD;
		flagerr = 1;
		strcpy( str, "1.2M 2HC" );
		putmessage();
		flagerr = 0;
	} else {
		disktypes = -1;
	}

	return disktypes;
}


/* end of file */
