X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=56978dccc9d3831e6af989f1f1ee1eaed15f955b;hb=4dad971280a07058d01449d5e6db2b036470015d;hp=39f015ff9f5a450ca7eb2564c1b09b13592b591a;hpb=e2dd0ba2fc28124e20345c5d45754a11ecc19b32;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 39f015ff..56978dcc 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -41,7 +41,8 @@ /* logging functions */ /* ------------------------------------------------------------------------- */ -#define DUPLICATE_LOG_OUTPUT_TO_STDERR TRUE +#define DUPLICATE_LOG_OUT_TO_STDOUT TRUE +#define DUPLICATE_LOG_ERR_TO_STDERR TRUE #if defined(PLATFORM_ANDROID) @@ -93,15 +94,15 @@ static void vprintf_log(char *format, va_list ap) static void vprintf_log_nonewline(char *format, va_list ap) { - FILE *file = program.error_file; + FILE *file = program.log_file[LOG_ERR_ID]; -#if DUPLICATE_LOG_OUTPUT_TO_STDERR - if (file != stderr) +#if DUPLICATE_LOG_ERR_TO_STDERR + if (file != program.log_file_default[LOG_ERR_ID]) { va_list ap2; va_copy(ap2, ap); - vfprintf(stderr, format, ap2); + vfprintf(program.log_file_default[LOG_ERR_ID], format, ap2); va_end(ap2); } @@ -112,17 +113,17 @@ static void vprintf_log_nonewline(char *format, va_list ap) static void vprintf_log(char *format, va_list ap) { - FILE *file = program.error_file; + FILE *file = program.log_file[LOG_ERR_ID]; char *newline = STRING_NEWLINE; -#if DUPLICATE_LOG_OUTPUT_TO_STDERR - if (file != stderr) +#if DUPLICATE_LOG_ERR_TO_STDERR + if (file != program.log_file_default[LOG_ERR_ID]) { va_list ap2; va_copy(ap2, ap); - vfprintf(stderr, format, ap2); - fprintf(stderr, "%s", newline); + vfprintf(program.log_file_default[LOG_ERR_ID], format, ap2); + fprintf(program.log_file_default[LOG_ERR_ID], "%s", newline); va_end(ap2); } @@ -193,6 +194,50 @@ void printf_line_with_prefix(char *prefix, char *line_chars, int line_length) fprintf_line_with_prefix(stdout, prefix, line_chars, line_length); } +static void vPrint(char *format, va_list ap) +{ + FILE *file = program.log_file[LOG_OUT_ID]; + +#if DUPLICATE_LOG_OUT_TO_STDOUT + if (file != program.log_file_default[LOG_OUT_ID]) + { + va_list ap2; + va_copy(ap2, ap); + + vfprintf(program.log_file_default[LOG_OUT_ID], format, ap2); + + va_end(ap2); + } +#endif + + vfprintf(file, format, ap); +} + +void Print(char *format, ...) +{ + va_list ap; + + va_start(ap, format); + vPrint(format, ap); + va_end(ap); +} + +void PrintLine(char *line_chars, int line_length) +{ + int i; + + for (i = 0; i < line_length; i++) + Print(line_chars); + + Print("\n"); +} + +void PrintLineWithPrefix(char *prefix, char *line_chars, int line_length) +{ + Print(prefix); + PrintLine(line_chars, line_length); +} + /* ------------------------------------------------------------------------- */ /* string functions */ @@ -648,9 +693,11 @@ char *getStringCat3(char *s1, char *s2, char *s3) char *getPath2(char *path1, char *path2) { #if defined(PLATFORM_ANDROID) - // workaround for reading from APK assets directory -- skip leading "./" + // workaround for reading from assets directory -- skip "." subdirs in path if (strEqual(path1, ".")) return getStringCopy(path2); + else if (strEqual(path2, ".")) + return getStringCopy(path1); #endif return getStringCat2WithSeparator(path1, path2, STRING_PATH_SEPARATOR); @@ -659,9 +706,13 @@ char *getPath2(char *path1, char *path2) char *getPath3(char *path1, char *path2, char *path3) { #if defined(PLATFORM_ANDROID) - // workaround for reading from APK assets directory -- skip leading "./" + // workaround for reading from assets directory -- skip "." subdirs in path if (strEqual(path1, ".")) return getStringCat2WithSeparator(path2, path3, STRING_PATH_SEPARATOR); + else if (strEqual(path2, ".")) + return getStringCat2WithSeparator(path1, path3, STRING_PATH_SEPARATOR); + else if (strEqual(path3, ".")) + return getStringCat2WithSeparator(path1, path2, STRING_PATH_SEPARATOR); #endif return getStringCat3WithSeparator(path1, path2, path3, STRING_PATH_SEPARATOR); @@ -1067,6 +1118,9 @@ void Error(int mode, char *format, ...) static boolean last_line_was_separator = FALSE; char *process_name = ""; + if (program.log_file[LOG_ERR_ID] == NULL) + return; + #if defined(PLATFORM_ANDROID) android_log_prio = (mode & ERR_DEBUG ? ANDROID_LOG_DEBUG : mode & ERR_INFO ? ANDROID_LOG_INFO : @@ -1959,6 +2013,10 @@ void addNodeToList(ListNode **node_first, char *key, void *content) node_new->key = getStringCopy(key); node_new->content = content; node_new->next = *node_first; + + if (*node_first) + (*node_first)->prev = node_new; + *node_first = node_new; } @@ -1971,8 +2029,15 @@ void deleteNodeFromList(ListNode **node_first, char *key, if (strEqual((*node_first)->key, key)) { checked_free((*node_first)->key); + if (destructor_function) destructor_function((*node_first)->content); + + if ((*node_first)->next) + (*node_first)->next->prev = (*node_first)->prev; + + checked_free(*node_first); + *node_first = (*node_first)->next; } else @@ -3465,44 +3530,53 @@ void FreeCustomArtworkLists(struct ArtworkListInfo *artwork_info) /* (now also added for Windows, to create files in user data directory) */ /* ------------------------------------------------------------------------- */ -char *getErrorFilename(char *basename) +char *getLogFilename(char *basename) { return getPath2(getUserGameDataDir(), basename); } -void openErrorFile() +void OpenLogFiles() { + int i; + InitUserDataDirectory(); - if ((program.error_file = fopen(program.error_filename, MODE_WRITE)) == NULL) + for (i = 0; i < NUM_LOGS; i++) { - program.error_file = stderr; + if ((program.log_file[i] = fopen(program.log_filename[i], MODE_WRITE)) + == NULL) + { + program.log_file[i] = program.log_file_default[i]; // reset to default - Error(ERR_WARN, "cannot open file '%s' for writing: %s", - program.error_filename, strerror(errno)); - } + Error(ERR_WARN, "cannot open file '%s' for writing: %s", + program.log_filename[i], strerror(errno)); + } - /* error output should be unbuffered so it is not truncated in a crash */ - setbuf(program.error_file, NULL); + /* output should be unbuffered so it is not truncated in a crash */ + setbuf(program.log_file[i], NULL); + } } -void closeErrorFile() +void CloseLogFiles() { - if (program.error_file != stderr) /* do not close file 'stderr' */ - fclose(program.error_file); + int i; + + for (i = 0; i < NUM_LOGS; i++) + if (program.log_file[i] != program.log_file_default[i]) + fclose(program.log_file[i]); } -void dumpErrorFile() +void DumpLogFile(int nr) { - FILE *error_file = fopen(program.error_filename, MODE_READ); + FILE *log_file = fopen(program.log_filename[nr], MODE_READ); - if (error_file != NULL) - { - while (!feof(error_file)) - fputc(fgetc(error_file), stderr); + if (log_file == NULL) + return; - fclose(error_file); - } + while (!feof(log_file)) + fputc(fgetc(log_file), stdout); + + fclose(log_file); } void NotifyUserAboutErrorFile() @@ -3511,7 +3585,8 @@ void NotifyUserAboutErrorFile() 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); + STRING_NEWLINE, + program.log_filename[LOG_ERR_ID]); MessageBox(NULL, error_text, title_text, MB_OK); #endif