- consolidated I_FatalError functions

This also removes the handling from thr Posix backend and will not compile on non-Windows.
This commit is contained in:
Christoph Oelckers 2019-10-07 00:20:07 +02:00
parent cd086ae1da
commit b5fa08bf15
7 changed files with 66 additions and 177 deletions

View file

@ -2290,6 +2290,42 @@ void I_Error(const char *error, ...)
throw CRecoverableError(errortext); throw CRecoverableError(errortext);
} }
//==========================================================================
//
// I_FatalError
//
// Throw an error that will end the game.
//
//==========================================================================
extern FILE *Logfile;
void I_FatalError(const char *error, ...)
{
static bool alreadyThrown = false;
gameisdead = true;
if (!alreadyThrown) // ignore all but the first message -- killough
{
alreadyThrown = true;
char errortext[MAX_ERRORTEXT];
va_list argptr;
va_start(argptr, error);
myvsnprintf(errortext, MAX_ERRORTEXT, error, argptr);
va_end(argptr);
I_DebugPrint(errortext);
// Record error to log (if logging)
if (Logfile)
{
fprintf(Logfile, "\n**** DIED WITH FATAL ERROR:\n%s\n", errortext);
fflush(Logfile);
}
throw CFatalError(errortext);
}
std::terminate(); // recursive I_FatalErrors must immediately terminate.
}
//========================================================================== //==========================================================================
// //
// I_Quit // I_Quit

View file

@ -90,48 +90,6 @@ void I_Init(void)
DumpCPUInfo(&CPU); DumpCPUInfo(&CPU);
} }
extern FILE* Logfile;
bool gameisdead;
static void I_FatalError(const char* const error, va_list ap)
{
static bool alreadyThrown = false;
gameisdead = true;
if (!alreadyThrown) // ignore all but the first message -- killough
{
alreadyThrown = true;
char errortext[MAX_ERRORTEXT];
int index;
index = vsnprintf(errortext, MAX_ERRORTEXT, error, ap);
extern void Mac_I_FatalError(const char*);
Mac_I_FatalError(errortext);
// Record error to log (if logging)
if (Logfile)
{
fprintf(Logfile, "\n**** DIED WITH FATAL ERROR:\n%s\n", errortext);
fflush(Logfile);
}
fprintf(stderr, "%s\n", errortext);
exit(-1);
}
std::terminate();
}
void I_FatalError(const char* const error, ...)
{
va_list argptr;
va_start(argptr, error);
I_FatalError(error, argptr);
va_end(argptr);
}
void I_SetIWADInfo() void I_SetIWADInfo()
{ {
} }

View file

@ -188,11 +188,6 @@ int main (int argc, char **argv)
printf("\n"); printf("\n");
try
{
Args = new FArgs(argc, argv);
atexit (call_terms);
// Should we even be doing anything with progdir on Unix systems? // Should we even be doing anything with progdir on Unix systems?
char program[PATH_MAX]; char program[PATH_MAX];
@ -211,42 +206,5 @@ int main (int argc, char **argv)
I_StartupJoysticks(); I_StartupJoysticks();
D_DoomMain (); D_DoomMain ();
}
catch (std::exception &error)
{
I_ShutdownJoysticks();
const char *const message = error.what();
if (strcmp(message, "NoRunExit"))
{
if (CVMAbortException::stacktrace.IsNotEmpty())
{
Printf("%s", CVMAbortException::stacktrace.GetChars());
}
if (batchrun)
{
Printf("%s\n", message);
}
else
{
#ifdef __APPLE__
Mac_I_FatalError(message);
#endif // __APPLE__
#ifdef __linux__
Linux_I_FatalError(message);
#endif // __linux__
}
}
return -1;
}
catch (...)
{
call_terms ();
throw;
}
return 0; return 0;
} }

View file

@ -64,7 +64,7 @@ extern "C"
#ifndef NO_GTK #ifndef NO_GTK
bool I_GtkAvailable (); bool I_GtkAvailable ();
int I_PickIWad_Gtk (WadStuff *wads, int numwads, bool showwin, int defaultiwad); int I_PickIWad_Gtk (WadStuff *wads, int numwads, bool showwin, int defaultiwad);
void I_FatalError_Gtk(const char* errortext); void I_ShowFatalError_Gtk(const char* errortext);
#elif defined(__APPLE__) #elif defined(__APPLE__)
int I_PickIWad_Cocoa (WadStuff *wads, int numwads, bool showwin, int defaultiwad); int I_PickIWad_Cocoa (WadStuff *wads, int numwads, bool showwin, int defaultiwad);
#endif #endif
@ -140,47 +140,19 @@ void Linux_I_FatalError(const char* errortext)
} }
#endif #endif
void I_FatalError (const char *error, va_list ap)
void I_ShowFatalError(const char *message)
{ {
static bool alreadyThrown = false;
gameisdead = true;
if (!alreadyThrown) // ignore all but the first message -- killough
{
alreadyThrown = true;
char errortext[MAX_ERRORTEXT];
int index;
index = vsnprintf (errortext, MAX_ERRORTEXT, error, ap);
#ifdef __APPLE__ #ifdef __APPLE__
Mac_I_FatalError(errortext); Mac_I_FatalError(message);
#endif // __APPLE__ #elif defined __linux__
Linux_I_FatalError(message);
#ifdef __linux__ #else
Linux_I_FatalError(errortext); // ???
#endif #endif
// Record error to log (if logging)
if (Logfile)
{
fprintf (Logfile, "\n**** DIED WITH FATAL ERROR:\n%s\n", errortext);
fflush (Logfile);
}
// throw CFatalError (errortext);
fprintf (stderr, "%s\n", errortext);
exit(-1);
}
std::terminate();
} }
void I_FatalError(const char* const error, ...)
{
va_list argptr;
va_start(argptr, error);
I_FatalError(error, argptr);
va_end(argptr);
}
void I_SetIWADInfo () void I_SetIWADInfo ()
{ {

View file

@ -417,7 +417,7 @@ int I_PickIWad_Gtk (WadStuff *wads, int numwads, bool showwin, int defaultiwad)
return Gtk::PickIWad (wads, numwads, showwin, defaultiwad); return Gtk::PickIWad (wads, numwads, showwin, defaultiwad);
} }
void I_FatalError_Gtk(const char* errortext) { void I_ShowFatalError_Gtk(const char* errortext) {
Gtk::ShowError(errortext); Gtk::ShowError(errortext);
} }

View file

@ -123,6 +123,7 @@ public:
int Reason() const { return m_reason; } int Reason() const { return m_reason; }
}; };
void I_ShowFatalError(const char *message);
void I_Error (const char *error, ...) GCCPRINTF(1,2); void I_Error (const char *error, ...) GCCPRINTF(1,2);
void I_FatalError (const char *error, ...) GCCPRINTF(1,2); void I_FatalError (const char *error, ...) GCCPRINTF(1,2);

View file

@ -339,42 +339,6 @@ void I_Init()
} }
//==========================================================================
//
// I_FatalError
//
// Throw an error that will end the game.
//
//==========================================================================
void I_FatalError(const char *error, ...)
{
static BOOL alreadyThrown = false;
gameisdead = true;
if (!alreadyThrown) // ignore all but the first message -- killough
{
alreadyThrown = true;
char errortext[MAX_ERRORTEXT];
va_list argptr;
va_start(argptr, error);
myvsnprintf(errortext, MAX_ERRORTEXT, error, argptr);
va_end(argptr);
OutputDebugStringA(errortext);
// Record error to log (if logging)
if (Logfile)
{
fprintf(Logfile, "\n**** DIED WITH FATAL ERROR:\n%s\n", errortext);
fflush(Logfile);
}
throw CFatalError(errortext);
}
std::terminate();
}
//========================================================================== //==========================================================================
// //
// I_PrintStr // I_PrintStr