rnd-20060726-6-src
authorHolger Schemel <info@artsoft.org>
Wed, 26 Jul 2006 19:24:50 +0000 (21:24 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:52:25 +0000 (10:52 +0200)
* added Windows message box to direct to "stderr.txt" after error aborts

ChangeLog
src/conftime.h
src/init.c
src/libgame/misc.c
src/libgame/misc.h
src/libgame/system.c
src/libgame/system.h

index b00e1c84460fd4999ef7a80fa26d708661f34bd5..54ede52f5f94fd9de60643b7290a2774d745c01a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,7 @@
          holding "Ctrl" button pressed while scrolling the wheel
        * changed output file "stderr.txt" on Windows platform now always to be
          created in the R'n'D sub-directory of the personal documents directory
+       * added Windows message box to direct to "stderr.txt" after error aborts
 
 2006-07-25
        * improved general scrollbar handling (when jump-scrolling scrollbars)
index c354faf78d76fcee9681812c552bf414e615f52b..2ceed3b04a36a233902b5e93a7e7938b094c1ccf 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2006-07-26 19:58]"
+#define COMPILE_DATE_STRING "[2006-07-26 21:19]"
index c975ec616a5d194cf485ef238d3027fd15c7f362..79e183edea5ba353dd878b24524a4636b06421b3 100644 (file)
@@ -4874,5 +4874,8 @@ void CloseAllAndExit(int exit_value)
   CloseVideoDisplay();
   ClosePlatformDependentStuff();
 
+  if (exit_value != 0)
+    NotifyUserAboutErrorFile();
+
   exit(exit_value);
 }
index 6c8734405b33080dfae098d5128b23de904c531c..c671d4b7f3c2f0eee9d01c0c93faa34455de81bf 100644 (file)
 
 static void vfprintf_newline(FILE *stream, char *format, va_list ap)
 {
-#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS)
-  char *newline = "\r\n";
-#else
-  char *newline = "\n";
-#endif
+  char *newline = STRING_NEWLINE;
 
   vfprintf(stream, format, ap);
 
@@ -56,20 +52,15 @@ static void vfprintf_newline(FILE *stream, char *format, va_list ap)
 
 static void vprintf_error_ext(char *format, va_list ap, boolean print_newline)
 {
-  FILE *error = stderr;
-
-#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS)
-  if ((error = openErrorFile()) == NULL)
-    program.exit_function(1);
-#endif
+  FILE *error_file = openErrorFile();  /* this returns at least 'stderr' */
 
   if (print_newline)
-    vfprintf_newline(error, format, ap);
+    vfprintf_newline(error_file, format, ap);
   else
-    vfprintf(error, format, ap);
+    vfprintf(error_file, format, ap);
 
-  if (error != stderr)
-    fclose(error);
+  if (error_file != stderr)            /* do not close stream 'stderr' */
+    fclose(error_file);
 }
 
 static void vprintf_error(char *format, va_list ap)
@@ -562,12 +553,10 @@ char *getHomeDir()
 
 static char *getLastPathSeparatorPtr(char *filename)
 {
-  char *last_separator = strrchr(filename, '/');
+  char *last_separator = strrchr(filename, CHAR_PATH_SEPARATOR_UNIX);
 
-#if !defined(PLATFORM_UNIX)
   if (last_separator == NULL)  /* also try DOS/Windows variant */
-    last_separator = strrchr(filename, '\\');
-#endif
+    last_separator = strrchr(filename, CHAR_PATH_SEPARATOR_DOS);
 
   return last_separator;
 }
@@ -607,21 +596,23 @@ char *getBasePath(char *filename)
 
 char *getPath2(char *path1, char *path2)
 {
+  char *sep = STRING_PATH_SEPARATOR;
   char *complete_path = checked_malloc(strlen(path1) + 1 +
                                       strlen(path2) + 1);
 
-  sprintf(complete_path, "%s/%s", path1, path2);
+  sprintf(complete_path, "%s%s%s", path1, sep, path2);
 
   return complete_path;
 }
 
 char *getPath3(char *path1, char *path2, char *path3)
 {
+  char *sep = STRING_PATH_SEPARATOR;
   char *complete_path = checked_malloc(strlen(path1) + 1 +
                                       strlen(path2) + 1 +
                                       strlen(path3) + 1);
 
-  sprintf(complete_path, "%s/%s/%s", path1, path2, path3);
+  sprintf(complete_path, "%s%s%s%s%s", path1, sep, path2, sep, path3);
 
   return complete_path;
 }
@@ -2907,48 +2898,32 @@ void FreeCustomArtworkLists(struct ArtworkListInfo *artwork_info)
 /* (now also added for Windows, to create files in user data directory)      */
 /* ------------------------------------------------------------------------- */
 
-#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS)
-
-#define ERROR_BASENAME         "stderr.txt"
-
-static char *error_filename = NULL;
-
-#if defined(PLATFORM_WIN32)
-
-void initErrorFile()
+char *getErrorFilename(char *basename)
 {
-  if (error_filename == NULL)
-    error_filename = getPath2(getUserDataDir(), ERROR_BASENAME);
-
-  unlink(error_filename);
+  return getPath2(getUserDataDir(), basename);
 }
 
-#elif defined(PLATFORM_MSDOS)
-
 void initErrorFile()
 {
-  if (error_filename == NULL)
-    error_filename = ERROR_BASENAME;
-
-  unlink(error_filename);
+  unlink(program.error_filename);
 }
 
-#endif /* PLATFORM_MSDOS */
-
 FILE *openErrorFile()
 {
-  FILE *error_file = fopen(error_filename, MODE_APPEND);
+  FILE *error_file = stderr;
 
-  if (error_file == NULL)
+#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS)
+  if ((error_file = fopen(program.error_filename, MODE_APPEND)) == NULL)
     fprintf_newline(stderr, "ERROR: cannot open file '%s' for appending!",
-                   error_filename);
+                   program.error_filename);
+#endif
 
   return error_file;
 }
 
 void dumpErrorFile()
 {
-  FILE *error_file = fopen(error_filename, MODE_READ);
+  FILE *error_file = fopen(program.error_filename, MODE_READ);
 
   if (error_file != NULL)
   {
@@ -2959,7 +2934,17 @@ void dumpErrorFile()
   }
 }
 
-#endif /* PLATFORM_WIN32 || PLATFORM_MSDOS */
+void NotifyUserAboutErrorFile()
+{
+#if defined(PLATFORM_WIN32)
+  char *title_text = getStringCat2(program.program_title, " Error Message");
+  char *error_text = getStringCat2("The program was aborted due to an error; "
+                                  "for details, see the following error file:"
+                                  STRING_NEWLINE, program.error_filename);
+
+  MessageBox(NULL, error_text, title_text, MB_OK);
+#endif
+}
 
 
 /* ------------------------------------------------------------------------- */
index 63ecf7848caeaf48888ef87148528993a852c4af..cc3ecf0a3349e03333c177504aaae465136e7d7b 100644 (file)
@@ -188,11 +188,11 @@ void LoadArtworkConfig(struct ArtworkListInfo *);
 void ReloadCustomArtworkList(struct ArtworkListInfo *);
 void FreeCustomArtworkLists(struct ArtworkListInfo *);
 
-#if !defined(PLATFORM_UNIX)
+char *getErrorFilename(char *);
 void initErrorFile();
 FILE *openErrorFile();
 void dumpErrorFile();
-#endif
+void NotifyUserAboutErrorFile();
 
 void debug_print_timestamp(int, char *);
 
index 1bc35d68cc55852748482c2b4efea814bf90d9fa..5aac42f888b26a257973d6c8b44b790e7db7163b 100644 (file)
@@ -93,6 +93,8 @@ void InitProgramInfo(char *argv0,
   program.version_major = VERSION_MAJOR(program_version);
   program.version_minor = VERSION_MINOR(program_version);
   program.version_patch = VERSION_PATCH(program_version);
+
+  program.error_filename = getErrorFilename(ERROR_BASENAME);
 }
 
 void InitExitFunction(void (*exit_function)(int))
index 9d90cd9969e29540aa0548cec0a51b01435dcd88..8fe22e2ddd7767e4fb0e849844e44666c1c0946a 100644 (file)
 #define SCOREFILE_EXTENSION    "sco"
 #endif
 
+#define ERROR_BASENAME         "stderr.txt"
+
+#define CHAR_PATH_SEPARATOR_UNIX       '/'
+#define CHAR_PATH_SEPARATOR_DOS                '\\'
+
+#define STRING_PATH_SEPARATOR_UNIX     "/"
+#define STRING_PATH_SEPARATOR_DOS      "\\"
+
+#define STRING_NEWLINE_UNIX            "\n"
+#define STRING_NEWLINE_DOS             "\r\n"
+
+#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS)
+#define CHAR_PATH_SEPARATOR    CHAR_PATH_SEPARATOR_DOS
+#define STRING_PATH_SEPARATOR  STRING_PATH_SEPARATOR_DOS
+#define STRING_NEWLINE         STRING_NEWLINE_DOS
+#else
+#define CHAR_PATH_SEPARATOR    CHAR_PATH_SEPARATOR_UNIX
+#define STRING_PATH_SEPARATOR  STRING_PATH_SEPARATOR_UNIX
+#define STRING_NEWLINE         STRING_NEWLINE_UNIX
+#endif
+
 
 /* areas in bitmap PIX_DOOR */
 /* meaning in PIX_DB_DOOR: (3 PAGEs)
@@ -508,6 +529,8 @@ struct ProgramInfo
   char *cookie_prefix;
   char *filename_prefix;       /* prefix to cut off from DOS filenames */
 
+  char *error_filename;                /* used instead of 'stderr' on some systems */
+
   int version_major;
   int version_minor;
   int version_patch;