X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=7047ba92d120b280eacbefa00c12289152982963;hb=1a41e7b2976c6486eb1412c55ed98c7fcc9f3e51;hp=ebac048d46f6b04ffa82af96fa62fdd6ad8aa944;hpb=e227a361d63ac92e9ed1ceb276f739fa3edc45be;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index ebac048d..7047ba92 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,115 @@ 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; + + // if optional debug mode specified, limit debug output accordingly + if (options.debug_mode != NULL && + !strEqual(options.debug_mode, mode)) + return; + + 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 +985,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) @@ -932,6 +1041,7 @@ void GetOptions(int argc, char *argv[], options.execute_command = NULL; options.special_flags = NULL; + options.debug_mode = NULL; options.mytapes = FALSE; options.serveronly = FALSE; @@ -1002,8 +1112,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 +1130,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 +1139,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 +1148,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 +1157,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++; } @@ -1066,6 +1176,10 @@ void GetOptions(int argc, char *argv[], else if (strncmp(option, "-debug", option_len) == 0) { options.debug = TRUE; + + // optionally, debug output can be limited to a specific debug mode + if (option_arg != next_option) + options.debug_mode = getStringCopy(option_arg); } else if (strncmp(option, "-verbose", option_len) == 0) { @@ -1087,7 +1201,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++;