]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/error.cpp
Remove -Wno-reorder
[xonotic/netradiant.git] / radiant / error.cpp
1 /*
2    Copyright (C) 1999-2006 Id Software, Inc. and contributors.
3    For a list of contributors, see the accompanying CONTRIBUTORS file.
4
5    This file is part of GtkRadiant.
6
7    GtkRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    GtkRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GtkRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 #include "error.h"
23
24 #include "debugging/debugging.h"
25 #include "igl.h"
26
27 #include "gtkutil/messagebox.h"
28 #include "console.h"
29 #include "preferences.h"
30
31
32 #ifdef WIN32
33 #define UNICODE
34 #include <windows.h>
35 #else
36 #include <errno.h>
37 #include <unistd.h>
38 #endif
39
40
41
42 /*
43    =================
44    Error
45
46    For abnormal program terminations
47    =================
48  */
49
50 /*!
51    \todo
52    FIXME the prompt wether to do prefs dialog, may not even be possible
53    if the crash happens before the game is loaded
54  */
55
56 void Error( const char *error, ... ){
57         va_list argptr;
58         char text[4096];
59
60         va_start( argptr,error );
61         vsprintf( text, error,argptr );
62         va_end( argptr );
63
64         strcat( text, "\n" );
65
66 #ifdef WIN32
67         if ( GetLastError() != 0 ) {
68                 LPVOID lpMsgBuf;
69                 FormatMessage(
70                         FORMAT_MESSAGE_ALLOCATE_BUFFER |
71                         FORMAT_MESSAGE_FROM_SYSTEM |
72                         FORMAT_MESSAGE_IGNORE_INSERTS,
73                         0,
74                         GetLastError(),
75                         MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language
76                         (LPTSTR) &lpMsgBuf,
77                         0,
78                         0
79                         );
80                 strcat( text, "GetLastError: " );
81                 /*
82                    Gtk will only crunch 0<=char<=127
83                    this is a bit hackish, but I didn't find useful functions in win32 API for this
84                    http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=516
85                  */
86                 TCHAR *scan, *next = (TCHAR*)lpMsgBuf;
87                 do
88                 {
89                         scan = next;
90                         text[strlen( text ) + 1] = '\0';
91                         if ( ( scan[0] >= 0 ) && ( scan[0] <= 127 ) ) {
92                                 text[strlen( text )] = char(scan[0]);
93                         }
94                         else{
95                                 text[strlen( text )] = '?';
96                         }
97                         next = CharNext( scan );
98                 } while ( next != scan );
99                 strcat( text, "\n" );
100                 LocalFree( lpMsgBuf );
101         }
102 #else
103         if ( errno != 0 ) {
104                 strcat( text, "errno: " );
105                 strcat( text, strerror( errno ) );
106                 strcat( text, "\n" );
107         }
108 #endif
109
110
111 #if 0
112         // we need to have a current context to call glError()
113         if ( g_glwindow_globals.d_glBase != 0 ) {
114                 // glGetError .. can record several errors, clears after calling
115                 //++timo TODO: be able to deal with several errors if necessary, for now I'm just warning about pending error messages
116                 // NOTE: forget that, most boards don't seem to follow the OpenGL standard
117                 GLenum iGLError = glGetError();
118                 if ( iGLError != GL_NO_ERROR ) {
119                         // use our own gluErrorString
120                         strcat( text, "gluErrorString: " );
121                         strcat( text, (char*)gluErrorString( iGLError ) );
122                         strcat( text, "\n" );
123                 }
124         }
125 #endif
126
127         strcat( text, "An unrecoverable error has occured.\n" );
128
129         ERROR_MESSAGE( text );
130
131         // force close logging if necessary
132         Sys_LogFile( false );
133
134         _exit( 1 );
135 }