/*

8086|Printman/POSTCARD 「その他」メニューモジュール
Copyright (c) 1993,94 Delmonta

*/

#include<dos.h>
#include<string.h>
#include<jstring.h>
#include<stdlib.h>
#include<errno.h>
#include"dprint.h"

#define	DFLVER_MAJOR	1
#define	DFLVER_MINOR	0

static	char	Dfl_header[] =  "8086|Printman/POSTCARD デフォルト設定ファイル"
				" Version ";
static	char	Dflver_str[] =  "1.00\x1a";

char	Dflfilename[64];

/*---------------------------------------------------------------------------*/

static	bool	dp_writedefault(void)
{
	FILE	*fp = fopen(Dflfilename,"wb");

	if	(fp==NULL)
	{
		dp_errmes("定義ファイルがオープンできません");
		return FALSE;
	}
					/* -1するのは文字列末の'\0'の分 */
	if	(fwrite(Dfl_header,sizeof(char),sizeof(Dfl_header)-1,fp)==0)
		goto wdfl_errexit;
	if	(fwrite(Dflver_str,sizeof(char),sizeof(Dflver_str)-1,fp)==0)
		goto wdfl_errexit;

	if	(fwrite(&Dflfile,sizeof(struct DFLFILE),1,fp)==0)
		goto wdfl_errexit;

	fclose(fp);
	return TRUE;

wdfl_errexit:
	dp_errmes("書き込みエラーです.");
	printf("errno=%d\n",errno);
	fclose(fp);
	return FALSE;
}

static	bool	dp_readdefault(void)
{
	FILE		*fp = fopen(Dflfilename,"rb");
	char		buf[sizeof(Dfl_header)];
	int		c;		/* getc()の仕様に合わせてint型 */
	unsigned	i;

	if	(fp==NULL)
		return FALSE;

	buf[sizeof(Dfl_header)-1] = '\0';

	if	(  fread(buf,sizeof(char),sizeof(Dfl_header)-1,fp) < sizeof(Dfl_header)-1
		|| strcmp(Dfl_header,buf) )
	{
		dp_errmes("定義ファイルヘッダが不正です");
		goto rdfl_exit;
	}

	i = 0;

	while	((c=getc(fp))!=EOF)
	{
		if	(c==0x1a)
		{
			buf[i] = '\0';
			break;
		}
		else
			buf[i++] = (char)c;
	}

	if	(c==EOF || (c=dpatoi(buf))==DPATOI_ERROR)
	{
		dp_errmes("定義ファイルのバージョンが不正です");
		goto rdfl_exit;
	}
/*
 *	else if	(c<DFLVER_MAJOR*100)
 *	{
 *		dp_errmes("\a定義ﾌｧｲﾙのﾊﾞｰｼﾞｮﾝが古すぎます. SETDFLﾕｰﾃｨﾘﾃｨで"
 *					"新しいものに変換してください.");
 *		goto rdfl_exit;
 *	}
 */
	else if	(c>=(DFLVER_MAJOR+1)*100)
	{
		dp_errmes("\a定義ファイルのバージョンが新しすぎます. 新版ソフトを入手してください.");
		goto rdfl_exit;
	}

	fread(&Dflfile,sizeof(struct DFLFILE),1,fp);

	fclose(fp);
	return TRUE;

rdfl_exit:
	fclose(fp);
	return FALSE;
}
/*---------------------------------------------------------------------------*/
void	dflfile_init(char *argv0)
{
	char	*p;

	strcpy(Dflfilename,argv0);
	p = jstrrchr(Dflfilename,'\\');
	strcpy(p+1,"DPRINT.DFL");
	dp_readdefault();
}
/*---------------------------------------------------------------------------*/
static	void	putstatus(void)
{
static	char	ERASELINE[] = "\033[%u;1f\033[2K";
	int	i;

	for	(i=13 ; i<=22 ; i++)
		printf(ERASELINE,i);

	printf( "\033[%d;1f\033[37m"
		"空きメモリ      : \033[33m%7ld \033[37mバイト\n"
		"MS-DOSﾊﾞｰｼﾞｮﾝ   : \033[33m%u.%02u\033[37m\n",
			SYSLINE_START,farcoreleft(),_osmajor,_osminor);

	if	(dp_getch()==EXTKEY_H)
		dp_getch();

	for	(i=13 ; i<=22 ; i++)
		printf(ERASELINE,i);
}

void	dp_othersmenu(void)
{
static	struct	MENUDAT	menu[] =
	{
		{'D',"更新","定義ファイルを更新します"},
		{'S',"現在の状態","現在の各種状態を表示します"},
		{'L',"デフォルトに戻す","定義ファイルを読み込み、設定をデフォルトに戻します"},
	};

	int	a;

othersmenu_rep:

	a = dp_menuselect("F8:その他",3,menu);

	switch	(a)
	{
	case -1:	return;
	case  0:
		if	(dp_writedefault())
			dp_errmes("定義ファイルを更新しました.");
		break;
	case  1:
		putstatus();
		break;
	case  2:
		if	(dp_readdefault())
			dp_errmes("定義ファイルを読み込みました.");
		break;
	}

	goto	othersmenu_rep;
}
