X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=39a55435f9720611e17fa1b04218f7e4bee349ab;hb=97f03ad86e7458be79933d91363a38c4d2e35deb;hp=81ec00e7a1cc2245f1dd573d100a3c6e38296f48;hpb=a8816d6e5319f9ec26a45346b08250f61e95c011;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 81ec00e7..39a55435 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -65,6 +65,22 @@ static void fPrintLog(FILE *stream, char *format, va_list ap) } #endif +static void vfprintf_nonewline(FILE *stream, char *format, va_list ap) +{ +#if defined(PLATFORM_ANDROID) + // (prefix text of logging output is currently skipped on Android) + //__android_log_vprint(android_log_prio, program.program_title, format, ap); +#else + va_list ap2; + va_copy(ap2, ap); + + vfprintf(stream, format, ap); + vfprintf(stderr, format, ap2); + + va_end(ap2); +#endif +} + static void vfprintf_newline(FILE *stream, char *format, va_list ap) { #if defined(PLATFORM_ANDROID) @@ -72,11 +88,28 @@ static void vfprintf_newline(FILE *stream, char *format, va_list ap) #else char *newline = STRING_NEWLINE; + va_list ap2; + va_copy(ap2, ap); + vfprintf(stream, format, ap); fprintf(stream, "%s", newline); + + vfprintf(stderr, format, ap2); + fprintf(stderr, "%s", newline); + + va_end(ap2); #endif } +static void fprintf_nonewline(FILE *stream, char *format, ...) +{ + va_list ap; + + va_start(ap, format); + vfprintf_nonewline(stream, format, ap); + va_end(ap); +} + static void fprintf_newline(FILE *stream, char *format, ...) { va_list ap; @@ -91,7 +124,7 @@ void fprintf_line(FILE *stream, char *line_chars, int line_length) int i; for (i = 0; i < line_length; i++) - fprintf(stream, "%s", line_chars); + fprintf_nonewline(stream, "%s", line_chars); fprintf_newline(stream, ""); } @@ -190,18 +223,6 @@ boolean getTokenValueFromString(char *string, char **token, char **value) /* counter functions */ /* ------------------------------------------------------------------------- */ -#if defined(PLATFORM_MSDOS) -volatile unsigned int counter = 0; - -void increment_counter() -{ - counter++; -} - -END_OF_FUNCTION(increment_counter); -#endif - - /* maximal allowed length of a command line option */ #define MAX_OPTION_LEN 256 @@ -212,20 +233,7 @@ static unsigned int getCurrentMS() { return SDL_GetTicks(); } - -#else /* !TARGET_SDL */ - -#if defined(PLATFORM_UNIX) -static unsigned int getCurrentMS() -{ - struct timeval current_time; - - gettimeofday(¤t_time, NULL); - - return current_time.tv_sec * 1000 + current_time.tv_usec / 1000; -} -#endif /* PLATFORM_UNIX */ -#endif /* !TARGET_SDL */ +#endif static unsigned int mainCounter(int mode) { @@ -262,50 +270,18 @@ static unsigned int mainCounter(int mode) return counter_ms; /* return milliseconds since last init */ } - -#else /* !TARGET_SDL */ - -#if defined(PLATFORM_UNIX) -static unsigned int mainCounter(int mode) -{ - static struct timeval base_time = { 0, 0 }; - struct timeval current_time; - unsigned int counter_ms; - - gettimeofday(¤t_time, NULL); - - /* reset base time in case of counter initializing or wrap-around */ - if (mode == INIT_COUNTER || current_time.tv_sec < base_time.tv_sec) - base_time = current_time; - - counter_ms = (current_time.tv_sec - base_time.tv_sec) * 1000 - + (current_time.tv_usec - base_time.tv_usec) / 1000; - - return counter_ms; /* return milliseconds since last init */ -} -#endif /* PLATFORM_UNIX */ -#endif /* !TARGET_SDL */ +#endif #endif void InitCounter() /* set counter back to zero */ { -#if !defined(PLATFORM_MSDOS) mainCounter(INIT_COUNTER); -#else - LOCK_VARIABLE(counter); - LOCK_FUNCTION(increment_counter); - install_int_ex(increment_counter, BPS_TO_TIMER(100)); -#endif } unsigned int Counter() /* get milliseconds since last call of InitCounter() */ { -#if !defined(PLATFORM_MSDOS) return mainCounter(READ_COUNTER); -#else - return (counter * 10); -#endif } static void sleep_milliseconds(unsigned int milliseconds_delay) @@ -329,8 +305,6 @@ static void sleep_milliseconds(unsigned int milliseconds_delay) { #if defined(TARGET_SDL) SDL_Delay(milliseconds_delay); -#elif defined(TARGET_ALLEGRO) - rest(milliseconds_delay); #else struct timeval delay; @@ -441,7 +415,7 @@ unsigned int get_random_number(int nr, int max) /* system info functions */ /* ------------------------------------------------------------------------- */ -#if !defined(PLATFORM_MSDOS) +#if !defined(PLATFORM_ANDROID) static char *get_corrected_real_name(char *real_name) { char *real_name_new = checked_malloc(MAX_USERNAME_LEN + 1); @@ -675,7 +649,7 @@ char *getPath3(char *path1, char *path2, char *path3) return getStringCat3WithSeparator(path1, path2, path3, STRING_PATH_SEPARATOR); } -char *getStringCopy(char *s) +char *getStringCopy(const char *s) { char *s_copy; @@ -688,7 +662,7 @@ char *getStringCopy(char *s) return s_copy; } -char *getStringCopyN(char *s, int n) +char *getStringCopyN(const char *s, int n) { char *s_copy; int s_len = MAX(0, n); @@ -703,7 +677,18 @@ char *getStringCopyN(char *s, int n) return s_copy; } -char *getStringToLower(char *s) +char *getStringCopyNStatic(const char *s, int n) +{ + static char *s_copy = NULL; + + checked_free(s_copy); + + s_copy = getStringCopyN(s, n); + + return s_copy; +} + +char *getStringToLower(const char *s) { char *s_copy = checked_malloc(strlen(s) + 1); char *s_ptr = s_copy; @@ -1024,15 +1009,17 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) /* error handling functions */ /* ------------------------------------------------------------------------- */ +#define MAX_INTERNAL_ERROR_SIZE 1024 + /* used by SetError() and GetError() to store internal error messages */ -static char internal_error[1024]; /* this is bad */ +static char internal_error[MAX_INTERNAL_ERROR_SIZE]; void SetError(char *format, ...) { va_list ap; va_start(ap, format); - vsprintf(internal_error, format, ap); + vsnprintf(internal_error, MAX_INTERNAL_ERROR_SIZE, format, ap); va_end(ap); } @@ -1083,11 +1070,11 @@ void Error(int mode, char *format, ...) { va_list ap; - fprintf(program.error_file, "%s%s: ", program.command_basename, - process_name); + fprintf_nonewline(program.error_file, "%s%s: ", program.command_basename, + process_name); if (mode & ERR_WARN) - fprintf(program.error_file, "warning: "); + fprintf_nonewline(program.error_file, "warning: "); va_start(ap, format); vfprintf_newline(program.error_file, format, ap); @@ -1208,11 +1195,22 @@ inline void swap_number_pairs(int *x1, int *y1, int *x2, int *y2) of the (not yet written) chunk, write the correct chunk size and finally write the chunk itself */ +#if 1 + +int getFile8BitInteger(File *file) +{ + return getByteFromFile(file); +} + +#else + int getFile8BitInteger(FILE *file) { return fgetc(file); } +#endif + int putFile8BitInteger(FILE *file, int value) { if (file != NULL) @@ -1221,6 +1219,20 @@ int putFile8BitInteger(FILE *file, int value) return 1; } +#if 1 + +int getFile16BitInteger(File *file, int byte_order) +{ + if (byte_order == BYTE_ORDER_BIG_ENDIAN) + return ((getByteFromFile(file) << 8) | + (getByteFromFile(file) << 0)); + else /* BYTE_ORDER_LITTLE_ENDIAN */ + return ((getByteFromFile(file) << 0) | + (getByteFromFile(file) << 8)); +} + +#else + int getFile16BitInteger(FILE *file, int byte_order) { if (byte_order == BYTE_ORDER_BIG_ENDIAN) @@ -1231,6 +1243,8 @@ int getFile16BitInteger(FILE *file, int byte_order) (fgetc(file) << 8)); } +#endif + int putFile16BitInteger(FILE *file, int value, int byte_order) { if (file != NULL) @@ -1250,6 +1264,24 @@ int putFile16BitInteger(FILE *file, int value, int byte_order) return 2; } +#if 1 + +int getFile32BitInteger(File *file, int byte_order) +{ + if (byte_order == BYTE_ORDER_BIG_ENDIAN) + return ((getByteFromFile(file) << 24) | + (getByteFromFile(file) << 16) | + (getByteFromFile(file) << 8) | + (getByteFromFile(file) << 0)); + else /* BYTE_ORDER_LITTLE_ENDIAN */ + return ((getByteFromFile(file) << 0) | + (getByteFromFile(file) << 8) | + (getByteFromFile(file) << 16) | + (getByteFromFile(file) << 24)); +} + +#else + int getFile32BitInteger(FILE *file, int byte_order) { if (byte_order == BYTE_ORDER_BIG_ENDIAN) @@ -1264,6 +1296,8 @@ int getFile32BitInteger(FILE *file, int byte_order) (fgetc(file) << 24)); } +#endif + int putFile32BitInteger(FILE *file, int value, int byte_order) { if (file != NULL) @@ -1287,6 +1321,28 @@ int putFile32BitInteger(FILE *file, int value, int byte_order) return 4; } +#if 1 + +boolean getFileChunk(File *file, char *chunk_name, int *chunk_size, + int byte_order) +{ + const int chunk_name_length = 4; + + /* read chunk name */ + if (getStringFromFile(file, chunk_name, chunk_name_length + 1) == NULL) + return FALSE; + + if (chunk_size != NULL) + { + /* read chunk size */ + *chunk_size = getFile32BitInteger(file, byte_order); + } + + return (checkEndOfFile(file) ? FALSE : TRUE); +} + +#else + boolean getFileChunk(FILE *file, char *chunk_name, int *chunk_size, int byte_order) { @@ -1305,6 +1361,8 @@ boolean getFileChunk(FILE *file, char *chunk_name, int *chunk_size, return (feof(file) || ferror(file) ? FALSE : TRUE); } +#endif + int putFileChunk(FILE *file, char *chunk_name, int chunk_size, int byte_order) { @@ -1328,6 +1386,21 @@ int putFileChunk(FILE *file, char *chunk_name, int chunk_size, return num_bytes; } +#if 1 + +int getFileVersion(File *file) +{ + int version_major = getByteFromFile(file); + int version_minor = getByteFromFile(file); + int version_patch = getByteFromFile(file); + int version_build = getByteFromFile(file); + + return VERSION_IDENT(version_major, version_minor, version_patch, + version_build); +} + +#else + int getFileVersion(FILE *file) { int version_major = fgetc(file); @@ -1339,6 +1412,8 @@ int getFileVersion(FILE *file) version_build); } +#endif + int putFileVersion(FILE *file, int version) { if (file != NULL) @@ -1357,6 +1432,18 @@ int putFileVersion(FILE *file, int version) return 4; } +#if 1 + +void ReadBytesFromFile(File *file, byte *buffer, unsigned int bytes) +{ + int i; + + for (i = 0; i < bytes && !checkEndOfFile(file); i++) + buffer[i] = getByteFromFile(file); +} + +#else + void ReadBytesFromFile(FILE *file, byte *buffer, unsigned int bytes) { int i; @@ -1365,6 +1452,8 @@ void ReadBytesFromFile(FILE *file, byte *buffer, unsigned int bytes) buffer[i] = fgetc(file); } +#endif + void WriteBytesToFile(FILE *file, byte *buffer, unsigned int bytes) { int i; @@ -1373,12 +1462,24 @@ void WriteBytesToFile(FILE *file, byte *buffer, unsigned int bytes) fputc(buffer[i], file); } +#if 1 + +void ReadUnusedBytesFromFile(File *file, unsigned int bytes) +{ + while (bytes-- && !checkEndOfFile(file)) + getByteFromFile(file); +} + +#else + void ReadUnusedBytesFromFile(FILE *file, unsigned int bytes) { while (bytes-- && !feof(file)) fgetc(file); } +#endif + void WriteUnusedBytesToFile(FILE *file, unsigned int bytes) { while (bytes--) @@ -1453,7 +1554,11 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) { KSYM_End, "XK_End", "end" }, { KSYM_Page_Up, "XK_Page_Up", "page up" }, { KSYM_Page_Down, "XK_Page_Down", "page down" }, - { KSYM_Menu, "XK_Menu", "menu" }, /* Win-Menu */ + +#if defined(TARGET_SDL2) + { KSYM_Menu, "XK_Menu", "menu" }, /* menu key */ + { KSYM_Back, "XK_Back", "back" }, /* back key */ +#endif /* ASCII 0x20 to 0x40 keys (except numbers) */ { KSYM_space, "XK_space", "space" }, @@ -1493,8 +1598,7 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) { KSYM_braceright, "XK_braceright", "brace right" }, { KSYM_asciitilde, "XK_asciitilde", "~" }, -#if !defined(TARGET_SDL2) - /* special (non-ASCII) keys */ + /* special (non-ASCII) keys (ISO-Latin-1) */ { KSYM_degree, "XK_degree", "°" }, { KSYM_Adiaeresis, "XK_Adiaeresis", "Ä" }, { KSYM_Odiaeresis, "XK_Odiaeresis", "Ö" }, @@ -1503,6 +1607,34 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) { KSYM_odiaeresis, "XK_odiaeresis", "ö" }, { KSYM_udiaeresis, "XK_udiaeresis", "ü" }, { KSYM_ssharp, "XK_ssharp", "sharp s" }, + +#if defined(TARGET_SDL2) + /* special (non-ASCII) keys (UTF-8, for reverse mapping only) */ + { KSYM_degree, "XK_degree", "\xc2\xb0" }, + { KSYM_Adiaeresis, "XK_Adiaeresis", "\xc3\x84" }, + { KSYM_Odiaeresis, "XK_Odiaeresis", "\xc3\x96" }, + { KSYM_Udiaeresis, "XK_Udiaeresis", "\xc3\x9c" }, + { KSYM_adiaeresis, "XK_adiaeresis", "\xc3\xa4" }, + { KSYM_odiaeresis, "XK_odiaeresis", "\xc3\xb6" }, + { KSYM_udiaeresis, "XK_udiaeresis", "\xc3\xbc" }, + { KSYM_ssharp, "XK_ssharp", "\xc3\x9f" }, + + /* other keys (for reverse mapping only) */ + { KSYM_space, "XK_space", " " }, +#endif + +#if defined(TARGET_SDL2) + /* keypad keys are not in numerical order in SDL2 */ + { KSYM_KP_0, "XK_KP_0", "keypad 0" }, + { KSYM_KP_1, "XK_KP_1", "keypad 1" }, + { KSYM_KP_2, "XK_KP_2", "keypad 2" }, + { KSYM_KP_3, "XK_KP_3", "keypad 3" }, + { KSYM_KP_4, "XK_KP_4", "keypad 4" }, + { KSYM_KP_5, "XK_KP_5", "keypad 5" }, + { KSYM_KP_6, "XK_KP_6", "keypad 6" }, + { KSYM_KP_7, "XK_KP_7", "keypad 7" }, + { KSYM_KP_8, "XK_KP_8", "keypad 8" }, + { KSYM_KP_9, "XK_KP_9", "keypad 9" }, #endif /* end-of-array identifier */ @@ -1522,8 +1654,10 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) sprintf(name_buffer, "%c", 'a' + (char)(key - KSYM_a)); else if (key >= KSYM_0 && key <= KSYM_9) sprintf(name_buffer, "%c", '0' + (char)(key - KSYM_0)); +#if !defined(TARGET_SDL2) else if (key >= KSYM_KP_0 && key <= KSYM_KP_9) sprintf(name_buffer, "keypad %c", '0' + (char)(key - KSYM_KP_0)); +#endif else if (key >= KSYM_FKEY_FIRST && key <= KSYM_FKEY_LAST) sprintf(name_buffer, "F%d", (int)(key - KSYM_FKEY_FIRST + 1)); else if (key == KSYM_UNDEFINED) @@ -1559,8 +1693,10 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) sprintf(name_buffer, "XK_%c", 'a' + (char)(key - KSYM_a)); else if (key >= KSYM_0 && key <= KSYM_9) sprintf(name_buffer, "XK_%c", '0' + (char)(key - KSYM_0)); +#if !defined(TARGET_SDL2) else if (key >= KSYM_KP_0 && key <= KSYM_KP_9) sprintf(name_buffer, "XK_KP_%c", '0' + (char)(key - KSYM_KP_0)); +#endif else if (key >= KSYM_FKEY_FIRST && key <= KSYM_FKEY_LAST) sprintf(name_buffer, "XK_F%d", (int)(key - KSYM_FKEY_FIRST + 1)); else if (key == KSYM_UNDEFINED) @@ -1588,17 +1724,34 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) else if (mode == TRANSLATE_KEYNAME_TO_KEYSYM) { Key key = KSYM_UNDEFINED; + char *name_ptr = *name; - i = 0; - do + if (strlen(*name) == 1) { - if (strEqual(translate_key[i].name, *name)) + char c = name_ptr[0]; + + if (c >= 'A' && c <= 'Z') + key = KSYM_A + (Key)(c - 'A'); + else if (c >= 'a' && c <= 'z') + key = KSYM_a + (Key)(c - 'a'); + else if (c >= '0' && c <= '9') + key = KSYM_0 + (Key)(c - '0'); + } + + if (key == KSYM_UNDEFINED) + { + i = 0; + + do { - key = translate_key[i].key; - break; + if (strEqual(translate_key[i].name, *name)) + { + key = translate_key[i].key; + break; + } } + while (translate_key[++i].x11name); } - while (translate_key[++i].x11name); if (key == KSYM_UNDEFINED) Error(ERR_WARN, "getKeyFromKeyName(): not completely implemented"); @@ -1621,6 +1774,7 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) else if (c >= '0' && c <= '9') key = KSYM_0 + (Key)(c - '0'); } +#if !defined(TARGET_SDL2) else if (strPrefix(name_ptr, "XK_KP_") && strlen(name_ptr) == 7) { char c = name_ptr[6]; @@ -1628,6 +1782,7 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) if (c >= '0' && c <= '9') key = KSYM_KP_0 + (Key)(c - '0'); } +#endif else if (strPrefix(name_ptr, "XK_F") && strlen(name_ptr) <= 6) { char c1 = name_ptr[4]; @@ -1939,7 +2094,7 @@ int closeFile(File *file) if (file == NULL) return -1; - int result; + int result = 0; #if defined(PLATFORM_ANDROID) if (file->asset_file) @@ -1965,6 +2120,64 @@ int checkEndOfFile(File *file) return feof(file->file); } +size_t readFile(File *file, void *buffer, size_t item_size, size_t num_items) +{ +#if defined(PLATFORM_ANDROID) + if (file->file_is_asset) + { + if (file->end_of_file) + return 0; + + size_t num_items_read = + SDL_RWread(file->asset_file, buffer, item_size, num_items); + + if (num_items_read < num_items) + file->end_of_file = TRUE; + + return num_items_read; + } +#endif + + return fread(buffer, item_size, num_items, file->file); +} + +int seekFile(File *file, long offset, int whence) +{ +#if defined(PLATFORM_ANDROID) + if (file->file_is_asset) + { + int sdl_whence = (whence == SEEK_SET ? RW_SEEK_SET : + whence == SEEK_CUR ? RW_SEEK_CUR : + whence == SEEK_END ? RW_SEEK_END : 0); + + return (SDL_RWseek(file->asset_file, offset, sdl_whence) == -1 ? -1 : 0); + } +#endif + + return fseek(file->file, offset, whence); +} + +int getByteFromFile(File *file) +{ +#if defined(PLATFORM_ANDROID) + if (file->file_is_asset) + { + if (file->end_of_file) + return EOF; + + byte c; + size_t num_bytes_read = SDL_RWread(file->asset_file, &c, 1, 1); + + if (num_bytes_read < 1) + file->end_of_file = TRUE; + + return (file->end_of_file ? EOF : (int)c); + } +#endif + + return fgetc(file->file); +} + char *getStringFromFile(File *file, char *line, int size) { #if defined(PLATFORM_ANDROID) @@ -2041,7 +2254,7 @@ int closeDirectory(Directory *dir) if (dir == NULL) return -1; - int result; + int result = 0; #if defined(PLATFORM_ANDROID) if (dir->asset_toc_file) @@ -2090,7 +2303,7 @@ DirectoryEntry *readDirectory(Directory *dir) dir->dir_entry = checked_calloc(sizeof(DirectoryEntry)); dir->dir_entry->is_directory = FALSE; - if (line[strlen(line) - 1] = '/') + if (line[strlen(line) - 1] == '/') { dir->dir_entry->is_directory = TRUE; @@ -2144,23 +2357,53 @@ void freeDirectoryEntry(DirectoryEntry *dir_entry) /* functions for checking files and filenames */ /* ------------------------------------------------------------------------- */ +boolean directoryExists(char *dir_name) +{ + if (dir_name == NULL) + return FALSE; + + boolean success = (access(dir_name, F_OK) == 0); + +#if defined(PLATFORM_ANDROID) + if (!success) + { + // this might be an asset directory; check by trying to open toc file + char *asset_toc_filename = getPath2(dir_name, ASSET_TOC_BASENAME); + SDL_RWops *file = SDL_RWFromFile(asset_toc_filename, MODE_READ); + + checked_free(asset_toc_filename); + + success = (file != NULL); + + if (success) + SDL_RWclose(file); + } +#endif + + return success; +} + boolean fileExists(char *filename) { if (filename == NULL) return FALSE; + boolean success = (access(filename, F_OK) == 0); + #if defined(PLATFORM_ANDROID) - // workaround: check if file exists by opening and closing it - SDL_RWops *file = SDL_RWFromFile(filename, MODE_READ); - boolean success = (file != NULL); + if (!success) + { + // this might be an asset file; check by trying to open it + SDL_RWops *file = SDL_RWFromFile(filename, MODE_READ); - if (success) - SDL_RWclose(file); + success = (file != NULL); - return success; -#else - return (access(filename, F_OK) == 0); + if (success) + SDL_RWclose(file); + } #endif + + return success; } boolean fileHasPrefix(char *basename, char *prefix) @@ -2207,38 +2450,49 @@ boolean fileHasSuffix(char *basename, char *suffix) return FALSE; } +#if defined(TARGET_SDL) +static boolean FileCouldBeArtwork(char *basename) +{ + return (!strEqual(basename, ".") && + !strEqual(basename, "..") && + !fileHasSuffix(basename, "txt") && + !fileHasSuffix(basename, "conf")); +} +#endif + boolean FileIsGraphic(char *filename) { -#if 1 - return TRUE; -#else char *basename = getBaseNamePtr(filename); +#if defined(TARGET_SDL) + return FileCouldBeArtwork(basename); +#else return fileHasSuffix(basename, "pcx"); #endif } boolean FileIsSound(char *filename) { -#if 1 - return TRUE; -#else char *basename = getBaseNamePtr(filename); +#if defined(TARGET_SDL) + return FileCouldBeArtwork(basename); +#else return fileHasSuffix(basename, "wav"); #endif } boolean FileIsMusic(char *filename) { -#if 1 - return TRUE; -#else char *basename = getBaseNamePtr(filename); +#if defined(TARGET_SDL) + return FileCouldBeArtwork(basename); +#else if (FileIsSound(basename)) return TRUE; +#if 0 #if defined(TARGET_SDL) if ((fileHasPrefix(basename, "mod") && !fileHasSuffix(basename, "txt")) || fileHasSuffix(basename, "mod") || @@ -2250,6 +2504,7 @@ boolean FileIsMusic(char *filename) fileHasSuffix(basename, "mp3") || fileHasSuffix(basename, "ogg")) return TRUE; +#endif #endif return FALSE; @@ -3436,6 +3691,9 @@ void openErrorFile() Error(ERR_WARN, "cannot open file '%s' for writing: %s", program.error_filename, strerror(errno)); } + + /* error output should be unbuffered so it is not truncated in a crash */ + setbuf(program.error_file, NULL); } void closeErrorFile() @@ -3476,7 +3734,7 @@ void NotifyUserAboutErrorFile() #if DEBUG -#define DEBUG_PRINT_INIT_TIMESTAMPS TRUE +#define DEBUG_PRINT_INIT_TIMESTAMPS FALSE #define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH 10 #define DEBUG_NUM_TIMESTAMPS 10 @@ -3573,6 +3831,8 @@ void debug_print_parent_only(char *format, ...) } } +#endif /* DEBUG */ + void print_timestamp_ext(char *message, char *mode) { #if DEBUG_PRINT_INIT_TIMESTAMPS @@ -3636,5 +3896,3 @@ void print_timestamp_done(char *message) { print_timestamp_ext(message, "DONE"); } - -#endif /* DEBUG */