moved almost all hardcoded constants to "define.dat"
[k8-i-v-a-n.git] / src / felib / feerror.cpp
blobf72c65d128160fd302db61052ae773f3141c98e2
1 /*
3 * Iter Vehemens ad Necem (IVAN)
4 * Copyright (C) Timo Kiviluoto
5 * Released under the GNU General
6 * Public License
8 * See LICENSING which should be included
9 * along with this file for more details
12 #include <cstdarg>
13 #include <cstring>
14 #include <cstdlib>
15 #include <cstdio>
17 #include <iostream>
19 #include <new>
20 #define set_new_handler std::set_new_handler
22 #include "feerror.h"
23 #include "fesave.h"
26 /* Shouldn't be initialized here! */
27 cchar *globalerrorhandler::BugMsg = "\n\nPlease don't send your bug reports, i cannot into coding!\n";
29 void (*globalerrorhandler::OldNewHandler) () = 0;
32 void globalerrorhandler::Install () {
33 static truth AlreadyInstalled = false;
34 if (!AlreadyInstalled) {
35 AlreadyInstalled = true;
36 OldNewHandler = set_new_handler(NewHandler);
37 atexit(globalerrorhandler::DeInstall);
42 void globalerrorhandler::DeInstall () {
43 set_new_handler(OldNewHandler);
47 void globalerrorhandler::Abort (cchar *Format, ...) {
48 char Buffer[2048];
49 char *bufptr = Buffer;
50 int bufsz = (int)sizeof(Buffer)-1;
52 for (;;) {
53 va_list ap;
54 int n;
55 char *np;
57 va_start(ap, Format);
58 n = vsnprintf(bufptr, bufsz, Format, ap);
59 va_end(ap);
60 if (n > -1 && n < bufsz) break;
61 if (n < -1) n = bufsz+4096;
62 np = (char *)realloc((bufptr == Buffer ? NULL : bufptr), n+1);
63 if (np == NULL) exit(4); //FIXME
66 fprintf(stderr, "%s%s", bufptr, BugMsg);
69 festring mydir = inputfile::GetMyDir();
70 mydir << "/" << "crash.log";
71 FILE *fo = fopen(mydir.CStr(), "a");
73 if (fo) {
74 fprintf(fo, "============================================================\n%s\n", bufptr);
75 fclose(fo);
78 exit(4);
82 void globalerrorhandler::NewHandler () {
83 const cchar *Msg = "Fatal Error: Memory depleted.\nGet more RAM and hard disk space.";
84 std::cout << Msg << std::endl;
85 exit(1);