/*

$Id: err,v 1.5 2002/07/07 13:55:28 joseph Exp $

*/
#include <stdio.h>
#include <stdlib.h>
#include "memleak.h"

#include "swis.h"

#include "defines.h"
#include "CRstring.h"
#include "err.h"
#include "log.h"
#include "wimplib.h"

/*static char zak[252];*/
static char err_taskname[32] = TASK_NAME;

void err_set_taskname(const char *name)
{
  CRstrncpy(err_taskname, name, sizeof(err_taskname));
}

#ifndef POPNDEBUG
#define FORCE_POSTMORTEM ((exit)(( \
	fprintf(stderr, "Forcing postmortem\n"), \
	*(int * volatile) -4 = *(int * volatile) -4, 0)))
#endif

bool err_check(const _kernel_oserror *er)
{
  if (!er)
    return false;
  _swix(Hourglass_Smash, 0);
  xsyslogf(log_NAME, log_OSError, "Error: %s (0x%x)", er->errmess, er->errnum);
  if (wimp_report_error((_kernel_oserror *) er,
  		Wimp_ReportError_OK|Wimp_ReportError_Cancel, err_taskname)
  	== Wimp_ReportError_Cancel)
  {
  #ifndef POPNDEBUG
    FORCE_POSTMORTEM;
  #else
    (exit)(0);
  #endif
  }
  return true;
}

#ifdef NOT_USED
void err_check_fatal(const _kernel_oserror *er)
{
  if (!er)
    return;
  _swix(Hourglass_Smash, 0);
  xsyslogf(log_NAME, log_FatalError, "Fatal error: %s (0x%x)",
  	er->errmess, er->errnum);
  xsyslog_logmessage(log_NAME, er->errmess, log_FatalError);
  wimp_report_error((_kernel_oserror *) er, Wimp_ReportError_Cancel,
  		err_taskname);
#ifndef POPNDEBUG
  FORCE_POSTMORTEM;
#else
  (exit)(0);
#endif
}
#endif

#ifndef POPNDEBUG
bool err_debug_check(const _kernel_oserror * er,
	const char *file, int line, bool fatal)
{
  static char errmess[252];
  if (!er)
    return false;
  xsyslog_logmessage(log_NAME, er->errmess,
  	fatal ? log_FatalError : log_OSError);
  if (fatal)
    fprintf(stderr, "Fatal ");
  CRstrcpy(errmess, er->errmess);
  fprintf(stderr, "Error code 0x%x at line %d of file %s:\n  %s\n",
  	er->errnum, line, file, errmess);
  _swix(Hourglass_Smash, 0);
  switch (fatal)
  {
    case false:
      if (wimp_report_error((_kernel_oserror *) er,
      		Wimp_ReportError_OK|Wimp_ReportError_Cancel, err_taskname)
      	== Wimp_ReportError_Cancel)
      {
        #ifndef POPNDEBUG
          FORCE_POSTMORTEM;
        #else
          (exit)(0);
        #endif
      }
      return true;
    case true:
      wimp_report_error((_kernel_oserror *) er, Wimp_ReportError_Cancel,
      		err_taskname);
    #ifndef POPNDEBUG
      FORCE_POSTMORTEM;
    #else
      (exit)(0);
    #endif
  }
  return false;
}
#endif

#ifdef NOT_USED
void err_report(int num, const char *mess)
{
  static _kernel_oserror er;
  xsyslog_logmessage(log_NAME, mess, log_OSError);
  er.errnum = num;
  CRstrncpy(er.errmess, mess, sizeof(er.errmess));
  _swix(Hourglass_Smash, 0);
  wimp_report_error(&er, Wimp_ReportError_OK, err_taskname);
}
#endif

void err_complain(int num, const char *mess)
{
  static _kernel_oserror er;
  xsyslog_logmessage(log_NAME, mess, log_OSError);
  er.errnum = num;
  CRstrncpy(er.errmess, mess, sizeof(er.errmess));
  _swix(Hourglass_Smash, 0);
  if (wimp_report_error(&er,
  		Wimp_ReportError_OK|Wimp_ReportError_Cancel, err_taskname)
  	== Wimp_ReportError_Cancel)
  {
  #ifndef POPNDEBUG
    FORCE_POSTMORTEM;
  #else
    (exit)(0);
  #endif
  }
}

#ifdef NOT_USED
void err_complain_fatal(int num, const char *mess)
{
  _kernel_oserror er;
  xsyslog_logmessage(log_NAME, mess, log_FatalError);
  er.errnum = num;
  CRstrncpy(er.errmess, mess, sizeof(er.errmess));
  _swix(Hourglass_Smash, 0);
  wimp_report_error(&er, Wimp_ReportError_Cancel, err_taskname);
#ifndef POPNDEBUG
  FORCE_POSTMORTEM;
#else
  (exit)(0);
#endif
}
#endif
