File: newfatal.cpp

package info (click to toggle)
sludge 2.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 6,844 kB
  • ctags: 2,981
  • sloc: cpp: 31,952; sh: 1,259; xml: 874; makefile: 672
file content (120 lines) | stat: -rw-r--r-- 3,102 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <SDL/SDL.h>

#include "platform-dependent.h"
#include "allfiles.h"
#include "version.h"

#include <string.h>
#include <stdlib.h>

#include "sound.h"

#include "stringy.h"
#include "errors.h"
#include "graphics.h"

const char emergencyMemoryMessage[]	= "Out of memory displaying error message!";

static char * fatalMessage = NULL;
static char * fatalInfo = joinStrings ("Initialisation error! Something went wrong before we even got started!", "");

extern int numResourceNames /* = 0*/;
extern char * * allResourceNames /*= NULL*/;

int resourceForFatal = -1;

const char * resourceNameFromNum (int i) {
	if (i == -1) return NULL;
	if (numResourceNames == 0) return "RESOURCE";
	if (i < numResourceNames) return allResourceNames[i];
	return "Unknown resource";
}

bool hasFatal () {
	if (fatalMessage) return true;
	return false;
}

void displayFatal () {
	if (fatalMessage) {
		msgBox ("SLUDGE v" TEXT_VERSION " fatal error!", fatalMessage);
	}
}

void warning (const char * l) {
	setGraphicsWindow(false);
	msgBox ("SLUDGE v" TEXT_VERSION " non-fatal indigestion report", l);
}

void registerWindowForFatal () {
	delete fatalInfo;
	fatalInfo = joinStrings ("There's an error with this SLUDGE game! If you're designing this game, please turn on verbose error messages in the project manager and recompile. If not, please contact the author saying where and how this problem occured.", "");
}

extern SDL_Event quit_event;

int inFatal (const char * str) {

	FILE * fatFile = fopen ("fatal.txt", "wt");
	if (fatFile) {
		fprintf (fatFile, "FATAL:\n%s\n", str);
		fclose (fatFile);
	}

	fatalMessage = copyString (str);
	if (fatalMessage == NULL) fatalMessage = copyString ("Out of memory");

	killSoundStuff ();
#if defined(HAVE_GLES2)
	EGL_Close();
#endif
	SDL_Quit();
		
	atexit (displayFatal);
	exit (1);
}

int checkNew (const void * mem) {
	if (mem == NULL) {
		inFatal (ERROR_OUT_OF_MEMORY);
		return 0;
	}
	return 1;
}

void setFatalInfo (const char * userFunc, const char * BIF) {
	delete fatalInfo;
	fatalInfo = new char [strlen (userFunc) + strlen (BIF) + 38];
	if (fatalInfo) sprintf (fatalInfo, "Currently in this sub: %s\nCalling: %s", userFunc, BIF);
}

void setResourceForFatal (int n) {
	resourceForFatal = n;
}

int fatal (const char * str1) {
	if (numResourceNames && resourceForFatal != -1) {
		const char * r = resourceNameFromNum(resourceForFatal);
		char * newStr = new char[strlen (str1) + strlen(r) + strlen (fatalInfo) + 14];
		if (checkNew (newStr)) {
			sprintf (newStr, "%s\nResource: %s\n\n%s", fatalInfo, r, str1);
			inFatal (newStr);
		} else fatal (emergencyMemoryMessage);
	} else {
		char * newStr = new char[strlen (str1) + strlen (fatalInfo) + 3];
		if (checkNew (newStr)) {
			sprintf (newStr, "%s\n\n%s", fatalInfo, str1);
			inFatal (newStr);
		} else fatal (emergencyMemoryMessage);
	}
	return 0;
}

int fatal (const char * str1, const char * str2) {
	char * newStr = new char[strlen (str1) + strlen (str2) + 2];
	if (checkNew (newStr)) {
		sprintf (newStr, "%s %s", str1, str2);
		fatal (newStr);
	} else fatal (emergencyMemoryMessage);
	return 0;
}