edivc/ediv/src/stub/error.c

130 lines
4.3 KiB
C

/*
* eDiv Compiler
* Copyleft (C) 2000-2002 Sion Entertainment
* http://www.sion-e.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Errores en tiempo de ejecución */
/* POR HACER: En Windows se muestra un MsgBox para los errores, pero en Linux se hace
* un simple printf. Esto no es problema en los errores no críticos de la versión debug
* (ya que los errores los muestra la DLL de Delphi), o si siempre ejecutamos los juegos
* desde una consola, pero el usuario final los ejecutará haciendo doble clic sobre el
* programa. Por tanto en Linux también tenemos que mostrar una MsgBox, y no podemos usar
* el propio buffer de SDL para imprimirlos (ya que uno de los errores no críticos es la
* falta de memoria), así que habrá que tirar de X a lo basto, recomiendo mirar el código
* fuente de XBill ya que implementa MsgBoxes de una forma reducida usando Motif o Athena
* (basada en Xaw). XBill también puede usar GTK pero esa librería ya es demasiado grande
* (la librería a usar debe ser linkada de forma estática)
*/
#ifdef _WIN32
#include <windows.h>
#else
#include <stdarg.h>
#endif
#include <stdio.h>
#include "main.h"
#include "language.h"
/* Error ( numero, parametros [...] )
*
* Genera un error en tiempo de ejecución, no crítico (en debug se llama al trazador)
* ATENCIÓN: Ahora mismo está en forma de RELEASE, para la versión DEBUG del stub se deberá
* invocar al trazador (llamando a la función adecuada, que aún no está hecha, en debug.dll)
* Otra nota: he puesto exactamente los mismos errores de DIV2, ya que tenemos que mantener
* la compatibilidad con el ignore_error... 100% compatible, recordad.. :P
*/
// POR HACER: ignore_errors, ignore_error()
void error(int num, ...)
{
#ifdef _WIN32
HWND ventanuka;
#endif
va_list opparam;
char mensaje[256];
va_start(opparam, num);
sprintf(mensaje, get_translate(0), num);
vsprintf(mensaje, translate_runtime_error(num - 100), opparam);
#ifdef _WIN32
ventanuka = GetActiveWindow();
//MessageBox(
MessageBox(ventanuka, mensaje, print_translate(1), MB_ICONERROR);
#else
printf("%s\n", mensaje);
#endif
stub_quit(num);
}
/* critical_error ( numero, parametros [...] )
*
* Interrumpe el programa con un mensaje de error. No es posible trazar.
* Esta función es igual para release que para debug, ya que no se puede trazar en el punto
* en que se produce un error de este tipo.
*/
void critical_error(int num, ...)
{
va_list opparam;
char mensaje[256];
va_start(opparam, num);
sprintf(mensaje, get_translate(0), num);
vsprintf(mensaje, translate_critical_error(num), opparam);
#ifdef WIN32
MessageBox(0, mensaje, print_translate(2), MB_ICONERROR);
#else
printf("%s\n", mensaje);
#endif
stub_quit(num);
}
/* custom_error (tipo, mensaje)
*
* Permite a las DLLs generar sus propios errores, para que no dependan de los
* que hay definidos en el stub. El parámetro tipo permite indicar si se trata de
* un error crítico (que debe interrumpir la ejecución del programa) o un error
* runtime (que llama al trazador si estamos en modo debug). A ser posible hay
* que usar los que incluye el stub, ya que estos errores no pueden usarse con
* ignore_error (no tienen un código asociado), aunque sí se ven afectados por
* compiler_options _ignore_errors.
* NOTA: una DLL puede incluir su propio sistema de gestión de errores, por tanto
* puede asignar códigos a sus propios errores e incluso incluir su propia versión
* de ignore_error.
* DESVENTAJA: se pierde la capacidad multilingüe, a menos que la incluya la propia DLL.
*/
void custom_error(tipoerror tipo, char *mensaje)
{
#ifdef WIN32
MessageBox(0, mensaje, print_translate(tipo), MB_ICONERROR);
#else
printf("%s\n", mensaje);
#endif
stub_quit(500 + tipo);
}