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


/* fatal - print message and die */
void _cdecl
#ifdef VAR_ARGS
fatal(err, format, va_alist)
	int	err;
	CharPtr	format;
	va_dcl
#else
fatal(int err, char *format, ...)
#endif
{
	va_list args;
	extern int	errno;
	int		errno_orig;
	extern char	*module;
	char	buf[4096], mod[FILENAME_MAX+10];
#ifdef OS_UNIX
	extern char	*sys_errlist[];
#endif
 
	errno_orig = errno;

	if (module != NULL)
		sprintf(mod, "FATAL:  %s Error #%d:  ", module, err);
	else
		sprintf(mod, "FATAL:  Error #%d:  ", err);
#ifdef VAR_ARGS
	va_start(args);
#else
	va_start(args, format);
#endif
	(void) vsprintf(buf, format, args);
	va_end(args);

	if (!SameFp(stderr, stdout)) {
		fflush(stdout);
		(void) wrap(stderr, mod, buf, -1, 78, 8);
		(void) fflush(stderr);
	}
	fputc('\n', stdout);
	(void) wrap(stdout, mod, buf, -1, 78, 8);
	fputc('\n', stdout);
	if (errno_orig != 0) {
#ifdef OS_UNIX
		sprintf(buf, "        Last system error:  #%d %s\n",
			errno_orig, sys_errlist[errno_orig]);
#else
		sprintf(buf, "        Last system error:  #%d\n", errno_orig);
#endif
		if (!SameFp(stderr, stdout))
			(void) wrap(stderr, NULL, buf, -1, 78, 8);
		(void) wrap(stdout, NULL, buf, -1, 78, 8);
	}
	fflush(stdout);
	exit(err);
	/*NOTREACHED*/
}
