#include <ncbi.h>
#include <gishlib.h>
#include "blastapp.h"

#ifdef VAR_ARGS
#include <varargs.h>
#else
#include <stdarg.h>
#endif

enum blast_error	blastapp_errno;


/* bfatal - print message and die */
void
#ifdef VAR_ARGS
bfatal(err, format, va_alist)
	enum blast_error	err;
	char	*format;
	va_dcl
#else
bfatal(enum blast_error err, char *format, ...)
#endif
{
	FILE	*fp;
	va_list	args;
	char	buf[4096];
	static	unsigned	counter;

	if (counter++ != 0)
		_exit(1);

	blastapp_errno = err;
	if ((fp = b_out.fp) == NULL && b_out.aip == NULL)
		fp = b_out.fp = stdout;
	if (fp != NULL)
		fflush(fp);
#ifdef VAR_ARGS
	va_start(args);
#else
	va_start(args, format);
#endif
	vsprintf(buf, format, args);
	va_end(args);

	fatal_msg(fp, buf);

	ckwarnings();

	exit_code(blastapp_errno, buf);
}

int LIBCALL
fatal_msg(fp, msg)
	FILE	*fp;
	CharPtr	msg;
{
	if (fp != NULL) {
		putc('\n', fp);
		wrap(fp, "FATAL:  ", msg, -1, 78, 8);
		fflush(fp);
		if (!SameFp(stderr, fp)) {
			wrap(stderr, "FATAL:  ", msg, -1, 78, 8);
			fflush(stderr);
		}
	}
	return 0;
}

void
exit_code(errnum, reason)
	enum blast_error	errnum;
	CharPtr	reason;
{
	FILE	*fp;

	if (errnum != ERR_NONE)
		blastapp_errno = errnum;

#if defined(MPROC_AVAIL) && defined(SGI_MPROC_AVAIL)
	if (mproc_id() != 0)
		_exit(errnum);
	sys_signal(SIGTERM, SIG_IGN);
#endif
	if (errnum != ERR_NONE) {
		if ((fp = b_out.fp) == NULL && b_out.aip == NULL)
			fp = b_out.fp = stdout;
		if (fp != NULL) {
			fprintf(fp, "\nEXIT CODE %d\n", errnum);
			fflush(fp);
			if (!SameFp(stderr, fp)) {
				fprintf(stderr, "EXIT CODE %d\n", errnum);
			}
		}
	}
#ifdef BLASTASN
	Bio_StatusAsnWrite(&b_out, errnum, reason);
	Bio_Close(&b_out);
#endif
	exit(errnum);
	/*NOTREACHED*/
}

