rnd-20060727-2-src
[rocksndiamonds.git] / src / libgame / misc.c
index 6c8734405b33080dfae098d5128b23de904c531c..9125a4e142740346420966d5957ed6711463a27c 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);
 
   fprintf(stream, "%s", newline);
 }
 
-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
-
-  if (print_newline)
-    vfprintf_newline(error, format, ap);
-  else
-    vfprintf(error, format, ap);
-
-  if (error != stderr)
-    fclose(error);
-}
-
-static void vprintf_error(char *format, va_list ap)
-{
-  vprintf_error_ext(format, ap, FALSE);
-}
-
-static void vprintf_error_newline(char *format, va_list ap)
-{
-  vprintf_error_ext(format, ap, TRUE);
-}
-
-static void printf_error(char *format, ...)
-{
-  if (format)
-  {
-    va_list ap;
-
-    va_start(ap, format);
-    vprintf_error(format, ap);
-    va_end(ap);
-  }
-}
-
-static void printf_error_newline(char *format, ...)
-{
-  if (format)
-  {
-    va_list ap;
-
-    va_start(ap, format);
-    vprintf_error_newline(format, ap);
-    va_end(ap);
-  }
-}
-
 static void fprintf_newline(FILE *stream, char *format, ...)
 {
   if (format)
@@ -118,26 +62,14 @@ static void fprintf_newline(FILE *stream, char *format, ...)
   }
 }
 
-static char *get_line_string(char *line_chars, int line_length)
+void fprintf_line(FILE *stream, char *line_chars, int line_length)
 {
-  static char *buffer = NULL;
-  int line_chars_length = strlen(line_chars);
   int i;
 
-  if (buffer != NULL)
-    checked_free(buffer);
-
-  buffer = checked_malloc(line_chars_length * line_length + 1);
-
   for (i = 0; i < line_length; i++)
-    strcpy(&buffer[i * line_chars_length], line_chars);
+    fprintf(stream, "%s", line_chars);
 
-  return buffer;
-}
-
-void fprintf_line(FILE *stream, char *line_chars, int line_length)
-{
-  fprintf_newline(stream, get_line_string(line_chars, line_length));
+  fprintf_newline(stream, "");
 }
 
 void printf_line(char *line_chars, int line_length)
@@ -145,11 +77,6 @@ void printf_line(char *line_chars, int line_length)
   fprintf_line(stdout, line_chars, line_length);
 }
 
-void printf_line_error(char *line_chars, int line_length)
-{
-  printf_error_newline(get_line_string(line_chars, line_length));
-}
-
 void printf_line_with_prefix(char *prefix, char *line_chars, int line_length)
 {
   fprintf(stdout, "%s", prefix);
@@ -562,12 +489,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 +532,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;
 }
@@ -852,45 +779,6 @@ void GetOptions(char *argv[], void (*print_usage_function)(void))
       /* when doing batch processing, always enable verbose mode (warnings) */
       options.verbose = TRUE;
     }
-#if 1
-#if DEBUG
-#if defined(TARGET_SDL)
-    else if (strncmp(option, "-SDL_ListModes", option_len) == 0)
-    {
-      SDL_Rect **modes;
-      int i;
-
-      SDL_Init(SDL_INIT_VIDEO);
-
-      /* get available fullscreen/hardware modes */
-      modes=SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE);
-
-      /* check if there are any modes available */
-      if (modes == (SDL_Rect **)0)
-      {
-       printf("No modes available!\n");
-
-       exit(-1);
-      }
-
-      /* check if our resolution is restricted */
-      if (modes == (SDL_Rect **)-1)
-      {
-       printf("All resolutions available.\n");
-      }
-      else
-      {
-       /* print valid modes */
-       printf("Available Modes:\n");
-       for(i = 0; modes[i]; i++)
-         printf("  %d x %d\n", modes[i]->w, modes[i]->h);
-      }
-
-      exit(0);
-    }
-#endif
-#endif
-#endif
     else if (*option == '-')
     {
       Error(ERR_EXIT_HELP, "unrecognized option '%s'", option_str);
@@ -948,7 +836,7 @@ void Error(int mode, char *format, ...)
   if (mode == ERR_RETURN_LINE)
   {
     if (!last_line_was_separator)
-      printf_line_error(format, 79);
+      fprintf_line(program.error_file, format, 79);
 
     last_line_was_separator = TRUE;
 
@@ -968,23 +856,25 @@ void Error(int mode, char *format, ...)
   {
     va_list ap;
 
-    printf_error("%s%s: ", program.command_basename, process_name);
+    fprintf(program.error_file, "%s%s: ", program.command_basename,
+           process_name);
 
     if (mode & ERR_WARN)
-      printf_error("warning: ");
+      fprintf(program.error_file, "warning: ");
 
     va_start(ap, format);
-    vprintf_error_newline(format, ap);
+    vfprintf_newline(program.error_file, format, ap);
     va_end(ap);
   }
   
   if (mode & ERR_HELP)
-    printf_error_newline("%s: Try option '--help' for more information.",
-                        program.command_basename);
+    fprintf_newline(program.error_file,
+                   "%s: Try option '--help' for more information.",
+                   program.command_basename);
 
   if (mode & ERR_EXIT)
-    printf_error_newline("%s%s: aborting",
-                        program.command_basename, process_name);
+    fprintf_newline(program.error_file, "%s%s: aborting",
+                   program.command_basename, process_name);
 
   if (mode & ERR_EXIT)
   {
@@ -2907,48 +2797,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()
+void openErrorFile()
 {
-  if (error_filename == NULL)
-    error_filename = ERROR_BASENAME;
+  /* always start with reliable default values */
+  program.error_file = stderr;
 
-  unlink(error_filename);
+#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS)
+  if ((program.error_file = fopen(program.error_filename, MODE_WRITE)) == NULL)
+    fprintf_newline(stderr, "ERROR: cannot open file '%s' for writing!",
+                   program.error_filename);
+#endif
 }
 
-#endif /* PLATFORM_MSDOS */
-
-FILE *openErrorFile()
+void closeErrorFile()
 {
-  FILE *error_file = fopen(error_filename, MODE_APPEND);
-
-  if (error_file == NULL)
-    fprintf_newline(stderr, "ERROR: cannot open file '%s' for appending!",
-                   error_filename);
-
-  return error_file;
+  if (program.error_file != stderr)    /* do not close stream 'stderr' */
+    fclose(program.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 +2833,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
+}
 
 
 /* ------------------------------------------------------------------------- */