rnd-20131120-1-src
authorHolger Schemel <info@artsoft.org>
Tue, 19 Nov 2013 23:54:55 +0000 (00:54 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 09:00:07 +0000 (11:00 +0200)
* improved error handling: display error message on screen (not only in
  the error file or on the console), and display path of the error file

ChangeLog
src/Makefile
src/conftime.h
src/init.c
src/init.h
src/libgame/misc.c
src/libgame/system.c
src/libgame/system.h
src/libgame/text.c
src/libgame/text.h
src/main.c

index 7a07f579f4d99e3bebb43bb100093e63b553edc4..65c1b09381da371ed68d8779c45bc76bec63e7cf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-11-20
+       * improved error handling: display error message on screen (not only in
+         the error file or on the console), and display path of the error file
+
 2013-11-13
        * fixed problem with R'n'D restarting with same level set that may have
          caused a problem (and therefore failing again and again); after an
index 854d6e2f7c4a63b3c5a04fb912e0a675c866113b..b8c53054d0ff4e4378443e1ad877ffa39c9eb3a6 100644 (file)
@@ -327,13 +327,13 @@ clean: clean-obj clean-ico clean-bin
 # run and test targets
 # -----------------------------------------------------------------------------
 
-run: all
+run:
        cd .. && ./$(PROGBASE) --verbose
 
-gdb: all
+gdb:
        cd .. && gdb -batch -x GDB_COMMANDS ./$(PROGBASE)
 
-valgrind: all
+valgrind:
        cd .. && valgrind -v --leak-check=yes ./$(PROGBASE) 2> valgrind.out
 
 
index 92f1b94c9168109294579888329709c8d3917e49..04d6ca998d4907336e362b529059cadda4eb953e 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2013-11-13 01:14"
+#define COMPILE_DATE_STRING "2013-11-20 00:53"
index 4735f046993612345e497337e7cf6e87e00ab436..b1e9920e12b718e49e99f46064c3777aa80959e4 100644 (file)
@@ -6274,6 +6274,59 @@ void KeyboardAutoRepeatOffUnlessAutoplay()
     KeyboardAutoRepeatOff();
 }
 
+void DisplayExitMessage(char *format, va_list ap)
+{
+  int font_1 = FC_RED;
+  int font_2 = FC_YELLOW;
+  int font_3 = FC_BLUE;
+  int font_width = getFontWidth(font_2);
+  int font_height = getFontHeight(font_2);
+  int sx = SX;
+  int sy = SY;
+  int sxsize = WIN_XSIZE - 2 * sx;
+  int sysize = WIN_YSIZE - 2 * sy;
+  int line_length = sxsize / font_width;
+  int max_lines = sysize / font_height;
+  int num_lines_printed;
+
+  gfx.sx = sx;
+  gfx.sy = sy;
+  gfx.sxsize = sxsize;
+  gfx.sysize = sysize;
+
+  sy = 20;
+
+  ClearRectangle(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
+
+  DrawTextSCentered(sy, font_1, "Fatal error:");
+  sy += 3 * font_height;;
+
+  num_lines_printed =
+    DrawTextBufferVA(sx, sy, format, ap, font_2,
+                    line_length, line_length, max_lines,
+                    0, BLIT_ON_BACKGROUND, TRUE, TRUE, FALSE);
+  sy += (num_lines_printed + 3) * font_height;
+
+  DrawTextSCentered(sy, font_1, "For details, see the following error file:");
+  sy += 3 * font_height;
+
+  num_lines_printed =
+    DrawTextBuffer(sx, sy, program.error_filename, font_2,
+                  line_length, line_length, max_lines,
+                  0, BLIT_ON_BACKGROUND, TRUE, TRUE, FALSE);
+
+  DrawTextSCentered(SYSIZE - 20, font_3, "Press any key or button to exit");
+
+  redraw_mask = REDRAW_ALL;
+
+  BackToFront();
+
+  /* deactivate toons on error message screen */
+  setup.toons = FALSE;
+
+  WaitForEventToContinue();
+}
+
 
 /* ========================================================================= */
 /* OpenAll()                                                                 */
index 42bc9f740525d79035a0abfdd5c8bbb1d6297b1a..d52aef4d9dce3fc139040d1b485bc6b51f4541fa 100644 (file)
@@ -46,6 +46,8 @@ void KeyboardAutoRepeatOffUnlessAutoplay();
 void InitGfxBuffers();
 void InitGadgets();
 
+void DisplayExitMessage(char *, va_list);
+
 void OpenAll(void);
 void CloseAllAndExit(int);
 
index 7e273adadc5269a8ef394975dc5bafb39d4e375a..b70545be4c64250590686719306b75eae4348609 100644 (file)
@@ -1045,6 +1045,13 @@ void Error(int mode, char *format, ...)
     va_start(ap, format);
     vfprintf_newline(program.error_file, format, ap);
     va_end(ap);
+
+    if ((mode & ERR_EXIT) && !(mode & ERR_FROM_SERVER))
+    {
+      va_start(ap, format);
+      program.exit_message_function(format, ap);
+      va_end(ap);
+    }
   }
   
   if (mode & ERR_HELP)
index da3797358cb263e72ba21da1ac2205024c9d1988..6d99c7c8cd11f346fb9bbe63f92cb735b114c958 100644 (file)
@@ -105,6 +105,11 @@ void InitProgramInfo(char *argv0,
   program.error_file = stderr;
 }
 
+void InitExitMessageFunction(void (*exit_message_function)(char *, va_list))
+{
+  program.exit_message_function = exit_message_function;
+}
+
 void InitExitFunction(void (*exit_function)(int))
 {
   program.exit_function = exit_function;
index b6c2ad3b465f74274944449c2886183a3b737731..5c1976917b04dd8c44d6790ec709fbddd1884645 100644 (file)
@@ -679,6 +679,7 @@ struct ProgramInfo
   int version_minor;
   int version_patch;
 
+  void (*exit_message_function)(char *, va_list);
   void (*exit_function)(int);
 };
 
@@ -1230,6 +1231,7 @@ extern int                        FrameCounter;
 void InitProgramInfo(char *, char *, char *, char *, char *, char *, char *,
                     char *, char *, char *, char *, char *, int);
 
+void InitExitMessageFunction(void (*exit_message_function)(char *, va_list));
 void InitExitFunction(void (*exit_function)(int));
 void InitPlatformDependentStuff(void);
 void ClosePlatformDependentStuff(void);
index 9d4d119300833f774017527494c7ef8b6343639c..dd926f62350be231f77e5640aea4d88d2b6b4dd5 100644 (file)
@@ -947,6 +947,24 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
   return current_line;
 }
 
+int DrawTextBufferVA(int x, int y, char *format, va_list ap, int font_nr,
+                    int line_length, int cut_length, int max_lines,
+                    int line_spacing, int mask_mode, boolean autowrap,
+                    boolean centered, boolean parse_comments)
+{
+  char text_buffer[MAX_OUTPUT_LINESIZE];
+  int text_length = vsnprintf(text_buffer, MAX_OUTPUT_LINESIZE, format, ap);
+
+  if (text_length >= MAX_OUTPUT_LINESIZE)
+    Error(ERR_WARN, "string too long in DrawTextBufferVA() -- truncated");
+
+  int num_lines_printed = DrawTextBuffer(x, y, text_buffer, font_nr,
+                                        line_length, cut_length, max_lines,
+                                        line_spacing, mask_mode, autowrap,
+                                        centered, parse_comments);
+  return num_lines_printed;
+}
+
 int DrawTextFile(int x, int y, char *filename, int font_nr,
                 int line_length, int cut_length, int max_lines,
                 int line_spacing, int mask_mode, boolean autowrap,
index 1d54a716d22d64b47eae590f88b9ed39a35cafea..17d350a0210cef008e061780d64233dfe4d26e5f 100644 (file)
@@ -91,6 +91,8 @@ void DrawTextExt(DrawBuffer *, int, int, char *, int, int);
 char *GetTextBufferFromFile(char *, int);
 int DrawTextBuffer(int, int, char *, int, int, int, int, int, int,
                   boolean, boolean, boolean);
+int DrawTextBufferVA(int, int, char *, va_list, int, int, int, int, int, int,
+                    boolean, boolean, boolean);
 int DrawTextFile(int, int, char *, int, int, int, int, int, int,
                 boolean, boolean, boolean);
 
index 94c5c3ace7cdc47034b96f86ae1989d38d4545d1..aaa3a5ba9b93412d8aeb104e3e48929611747fe8 100644 (file)
@@ -5594,6 +5594,7 @@ int main(int argc, char *argv[])
                  MSDOS_POINTER_FILENAME,
                  COOKIE_PREFIX, FILENAME_PREFIX, GAME_VERSION_ACTUAL);
 
+  InitExitMessageFunction(DisplayExitMessage);
   InitExitFunction(CloseAllAndExit);
   InitPlatformDependentStuff();