X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=17072d87cf249b43c38bbd21ebe0b27783dbef21;hb=7719feee76dac64d8f6153d4c379c44db1d89f7d;hp=fedc30487786287ea3e99dc75cb4aab57243e1af;hpb=34dc736661e297f75d604335a7d85ea34d14c55d;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index fedc3048..17072d87 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -4,7 +4,7 @@ // (c) 1995-2014 by Artsoft Entertainment // Holger Schemel // info@artsoft.org -// http://www.artsoft.org/ +// https://www.artsoft.org/ // ---------------------------------------------------------------------------- // misc.c // ============================================================================ @@ -251,6 +251,110 @@ void PrintLineWithPrefix(char *prefix, char *line_chars, int line_length) } +// ---------------------------------------------------------------------------- +// generic logging functions +// ---------------------------------------------------------------------------- + +enum log_levels +{ + LOG_UNKNOWN = 0, + LOG_DEBUG, + LOG_INFO, + LOG_WARN, + LOG_ERROR, + LOG_FATAL +}; + +static char *log_tokens[] = +{ + "UNKNOWN", + "DEBUG", + "INFO", + "WARN", + "ERROR", + "FATAL" +}; + +static void printf_log_prefix(int log_level, char *mode) +{ + if (log_level < 0 || log_level > LOG_FATAL) + return; + + char *log_token = log_tokens[log_level]; + + if (log_level == LOG_DEBUG) + printf_log_nonewline("[%s] [%s] ", log_token, mode); + else + printf_log_nonewline("[%s] ", log_token); +} + +static void Log(int log_level, char *mode, char *format, va_list ap) +{ + if (log_level < 0 || log_level > LOG_FATAL) + return; + + static boolean last_line_was_separator = FALSE; + char *log_token = log_tokens[log_level]; + + if (strEqual(format, "===") || + strEqual(format, "---")) + { + static char *mode_last = NULL; + char line_char[2] = { format[0], '\0' }; + int line_length = 80 - strlen(log_token) - 3; + + if (log_level == LOG_DEBUG) + line_length -= strlen(mode) + 3; + + if (last_line_was_separator && strEqual(mode, mode_last)) + return; + + printf_log_prefix(log_level, mode); + printf_log_line(line_char, line_length); + + if (!strEqual(mode, mode_last)) + setString(&mode_last, mode); + + last_line_was_separator = TRUE; + + return; + } + + last_line_was_separator = FALSE; + + printf_log_prefix(log_level, mode); + + vprintf_log(format, ap); +} + +void Debug(char *mode, char *format, ...) +{ + va_list ap; + + va_start(ap, format); + Log(LOG_DEBUG, mode, format, ap); + va_end(ap); +} + +void Info(char *format, ...) +{ + va_list ap; + + va_start(ap, format); + Log(LOG_INFO, NULL, format, ap); + va_end(ap); +} + +void Warn(char *format, ...) +{ + va_list ap; + + va_start(ap, format); + Log(LOG_WARN, NULL, format, ap); + va_end(ap); +} + + // ---------------------------------------------------------------------------- // string functions // ---------------------------------------------------------------------------- @@ -876,7 +980,7 @@ boolean strSuffix(char *s, char *suffix) s == NULL && suffix != NULL ? FALSE : s != NULL && suffix == NULL ? FALSE : strlen(s) < strlen(suffix) ? FALSE : - strncmp(&s[strlen(s) - strlen(suffix)], suffix, strlen(suffix)) == 0); + strcmp(&s[strlen(s) - strlen(suffix)], suffix) == 0); } boolean strPrefixLower(char *s, char *prefix) @@ -1002,8 +1106,8 @@ void GetOptions(int argc, char *argv[], Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str); // this should be extended to separate options for ro and rw data - options.ro_base_directory = ro_base_path = option_arg; - options.rw_base_directory = rw_base_path = option_arg; + options.ro_base_directory = ro_base_path = getStringCopy(option_arg); + options.rw_base_directory = rw_base_path = getStringCopy(option_arg); if (option_arg == next_option) options_left++; @@ -1020,7 +1124,7 @@ void GetOptions(int argc, char *argv[], if (option_arg == NULL) Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str); - options.level_directory = option_arg; + options.level_directory = getStringCopy(option_arg); if (option_arg == next_option) options_left++; } @@ -1029,7 +1133,7 @@ void GetOptions(int argc, char *argv[], if (option_arg == NULL) Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str); - options.graphics_directory = option_arg; + options.graphics_directory = getStringCopy(option_arg); if (option_arg == next_option) options_left++; } @@ -1038,7 +1142,7 @@ void GetOptions(int argc, char *argv[], if (option_arg == NULL) Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str); - options.sounds_directory = option_arg; + options.sounds_directory = getStringCopy(option_arg); if (option_arg == next_option) options_left++; } @@ -1047,7 +1151,7 @@ void GetOptions(int argc, char *argv[], if (option_arg == NULL) Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str); - options.music_directory = option_arg; + options.music_directory = getStringCopy(option_arg); if (option_arg == next_option) options_left++; } @@ -1087,7 +1191,7 @@ void GetOptions(int argc, char *argv[], if (option_arg == NULL) Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str); - options.execute_command = option_arg; + options.execute_command = getStringCopy(option_arg); if (option_arg == next_option) options_left++; @@ -1480,7 +1584,7 @@ void WriteBytesToFile(FILE *file, byte *buffer, unsigned int bytes) { int i; - for(i = 0; i < bytes; i++) + for (i = 0; i < bytes; i++) fputc(buffer[i], file); }