/*

8086|Printman/POSTCARD エラー対策ルーチン
Copyright (c) 1993,94 Delmonta

*/

#include"dprint.h"
#include<conio.h>
#include<dos.h>
#include<signal.h>

/*---------------------------------------------------------------------------*/

enum	PRNHERR	prn_harderr(void)
{
prnherr_rep:
	switch(dp_errmes("プリンタエラーです A:中止／R:再試行／I:無視して続行 "))
	{
	case 'A':
	case 'a':
	case 'F':	/* 本来はAbortではなくFailなので、Fキーも受け付ける */
	case 'f':
		return PRNHERR_FAIL;
	case 'R':
	case 'r':
		return PRNHERR_RETRY;
	case 'I':
	case 'i':
		return PRNHERR_IGNORE;
	default:
		putchar('\7');
		goto prnherr_rep;
	}
}

/*---------------------------------------------------------------------------*/

static int far	dp_dosharderr(deverr,errcode,devhdr)
unsigned	deverr,errcode,far *devhdr;
{
	static	char	*errname[13] = 
	{
		"書き込み禁止です",
		"存在しないユニットです",
		"準備ができていません",
		"デバイスの要求が違います",
		"ＣＲＣエラーです",
		"ﾃﾞﾊﾞｲｽの要求ﾊﾟﾗﾒｰﾀが違います"
		"シークエラーです",
		"存在しないメディアタイプです",
		"セクタが見つかりません",
		"プリンタ用紙切れです",
		"書き込みに失敗しました",
		"読み込みに失敗しました",
		"ディスクエラーです",
	};

	char	c;

	if	(errcode > 12)
		errcode = 12;

harderr_rep:
						/* printf()は使えない */
	cprintf("\033[%d;1f\033[33m\007%s A:中止／ R:再試行／I:無視して続行 ",
					ERRMES_LINE,errname[errcode&0xff]);

	c = dp_getch();

	cprintf("\033[2K");

	switch	(c)
	{
	case 'A':
	case 'a':
	case 'F':	/* 元々AbortではなくFailなので、Fキーも受け付ける */
	case 'f':
		return _HARDERR_FAIL;
	case 'R':
	case 'r':
		return _HARDERR_RETRY;
	case 'I':
	case 'i':
		return _HARDERR_IGNORE;

	case EXTKEY_H:
		dp_getch();		/* このままbreakせずに下に進む */
	default:
		putch('\7');
		goto harderr_rep;
	}
}

/*---------------------------------------------------------------------------*/

void	dp_seterrhandler(void)
{
	freopen("con","r",stdin);	/* リダイレクトを抑止する */
	freopen("con","w",stdout);

	signal(SIGINT,SIG_IGN);
	_harderr(dp_dosharderr);
}
