#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
{
	va_list	args;
	char	buf[4096];

	blastapp_errno = err;
	(void) fflush(stdout);
#ifdef VAR_ARGS
	va_start(args);
#else
	va_start(args, format);
#endif
	(void) vsprintf(buf, format, args);
	va_end(args);

	(void) putc('\n', stdout);
	(void) wrap(stdout, "FATAL:  ", buf, -1, 78, 8);
	(void) putc('\n', stdout);
	(void) fflush(stdout);
	if (!SameFp(stderr, stdout)) {
		(void) wrap(stderr, "FATAL:  ", buf, -1, 78, 8);
		(void) fflush(stderr);
	}

	ckwarnings();

	exit_code(blastapp_errno);
}

void
exit_code(errnum)
	enum blast_error	errnum;
{
	if (errnum != ERR_NONE)
		blastapp_errno = errnum;

#ifdef MPROC_AVAIL
	if (nprocs > 0) {
#ifdef SGI_MPROC_AVAIL
		if (m_get_myid() == 0)
			signal(SIGTERM, SIG_IGN);
		else
			_exit(errnum);
#endif
	}
#endif
	if (errnum != ERR_NONE) {
		printf("\nEXIT CODE %d\n", errnum);
		fflush(stdout);
		if (!SameFp(stderr, stdout))
			fprintf(stderr, "EXIT CODE %d\n", errnum);
	}
	exit(errnum);
	/*NOTREACHED*/
}
