/*

8086|Printman/POSTCARD Version 1.00a
ファイル操作メニューモジュール

Copyright (c) 1993 Delmonta

*/

#include<dos.h>
#include<string.h>
#include"dprint.h"

/*---------------------------------------------------------------------------*/

bool	Changedflag = FALSE;

bool	dp_isallsure(void)
{
	if	(!Changedflag)
		return TRUE;
	else
	{
		char	c;
	isallsure_rep:

		c = dp_errmes("カードを保存していません.よろしいですか(y/n):");

		if	(c=='y' || c=='Y')
			return TRUE;
		else if	(c=='n' || c=='N')
			return FALSE;
		else
		{
			if	(c==EXTKEY_H)
				dp_getch();

			putchar('\7');
			goto isallsure_rep;
		}
	}
}

/*---------------------------------------------------------------------------*/

void	dp_readfile(FILE *fp)
{
static	const	char	READERROR[] = "読み込みに失敗しました.";
	struct POSTCARD	readdata;
	char		buf[8];
	unsigned	i;

	while	(1)
	{
		if	(fgets(buf,8,fp)==NULL)
		{
			if	(!feof(fp))
				dp_errmes(READERROR);

			goto whilebreak;
		}

		switch	(sscanf(buf,"%u-%u",&readdata.zipcode[0],
							&readdata.zipcode[1]))
		{
		case  0:	readdata.zipcode[0] = -1;	break;
		case  1:	readdata.zipcode[1] = -1;	break;
		case -1:	goto whilebreak;
		}

		for	(i=0 ; i<5 ; i++)
		{
			char	*p;

			if	(fgets(readdata.data[i],25,fp)==NULL)
			{
				dp_errmes(READERROR);
				goto whilebreak;
			}

			p = strchr(readdata.data[i],'\n');
			if	(p!=NULL)
				*p = '\0';
		}

		if	(!addcard(Cardnum))
			goto whilebreak;	/* メモリ不足のエラーメッ  */
						/* セージはaddcard()が出す */

		*Card[Cardnum++] = readdata;
	}
whilebreak:
	fclose(fp);

	dp_putcardnum();
	card_reshow(63);
}

/*---------------------------------------------------------------------------*/

static	void	dp_fmergemenu(void)
{
	FILE	*fp = dp_fileselector("r");

	if	(fp!=NULL)
		dp_readfile(fp);

	Changedflag = TRUE;
}

/*---------------------------------------------------------------------------*/

static	void	dp_freadmenu(void)
{
	if	(!dp_isallsure())
		return;

	while	(Cardnum)
		farfree(Card[--Cardnum]);

	Cardpos = 0;

	dp_fmergemenu();
	Changedflag = FALSE;
}

/*---------------------------------------------------------------------------*/

static	void	dp_fwritemenu(void)
{
	int	s,e;
	FILE	*fp;

fwmenu_rep:
	if	(!input_st_ed("保存",&s,&e))
		return;

	fp = dp_fileselector("w");
	if	(fp==NULL)
		goto fwmenu_rep;

	for	( ; s<=e ; s++)
	{
		struct POSTCARD	writedata = *Card[s];
		unsigned	i;

	static	const	char	FWRITE_ERR[] = "書き込み中にエラーが"
					"発生しました. 書き込みを中止します.";


		if	(writedata.zipcode[0] == -1)
			i = fprintf(fp,"   -  \n");
		else if	(writedata.zipcode[1] == -1)
			i = fprintf(fp,"%03d-  \n",writedata.zipcode[0]);
		else
			i = fprintf(fp,"%03d-%02d\n",writedata.zipcode[0],
							writedata.zipcode[1]);

		if	(i==-1)
		{
			dp_errmes(FWRITE_ERR);
			goto fwmenu_break;
		}

		for	(i=0 ; i<5 ; i++)
		{
			if	(fprintf(fp,"%s\n",writedata.data[i])==-1)
			{
				dp_errmes(FWRITE_ERR);
				goto fwmenu_break;
			}
		}
	}
	dp_errmes("書き込みを終了しました.");
	Changedflag = FALSE;

fwmenu_break:

	fclose(fp);
}

/*---------------------------------------------------------------------------*/

void	dp_filemenu(void)
{
static	struct	MENUDAT	menu[]=
	{
		{'L',"読み込み","ファイルに保存したカードを読み込みます"},
		{'M',"追加読み込み","ファイルに保存したカードを現在のカードに追加します"},
		{'S',"保存","カードをファイルに保存します"},
	};

	int	a = dp_menuselect("コマンドを選択してください.",3,menu);

	switch	(a)
	{
	case -1:				break;
	case  0:	dp_freadmenu();		break;
	case  1:	dp_fmergemenu();	break;
	case  2:	dp_fwritemenu();	break;
	}
}
