X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=9125a4e142740346420966d5957ed6711463a27c;hb=2a1101854ff7336e35d52f76a3114870c8a6b15d;hp=6c8734405b33080dfae098d5128b23de904c531c;hpb=8a7afb2e699aa06f01070fce0c446545e2efc0a3;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 6c873440..9125a4e1 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -43,69 +43,13 @@ 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 +} /* ------------------------------------------------------------------------- */