/* vi: set ts=2: +-------------------+ Christian Schlittchen | | Enno Rehling | Eressea PBEM host | Katja Zedel | (c) 1998 - 2003 | Henning Peters | | Ingo Wilken +-------------------+ Stefan Reich This program may not be used, modified or distributed without prior permission by the authors of Eressea. */ #include #include "log.h" #include #include #include #include #include /* TODO: set from external function */ int log_flags = LOG_FLUSH|LOG_CPERROR|LOG_CPWARNING; static FILE * logfile; void log_flush(void) { fflush(logfile); } void log_puts(const char * str) { fflush(stdout); if (!logfile) logfile = stderr; fputs(str, logfile); } void log_printf(const char * format, ...) { va_list marker; if (!logfile) logfile = stderr; va_start(marker, format); vfprintf(logfile, format, marker); va_end(marker); if (log_flags & LOG_FLUSH) { log_flush(); } } void log_open(const char * filename) { if (logfile) log_close(); logfile = fopen(filename, "a"); if (logfile) { /* Get UNIX-style time and display as number and string. */ time_t ltime; time( <ime ); log_printf( "===\n=== Logfile started at %s===\n", ctime( <ime ) ); } } void log_close(void) { if (!logfile || logfile == stderr || logfile == stdout) return; if (logfile) { /* Get UNIX-style time and display as number and string. */ time_t ltime; time( <ime ); log_printf("===\n=== Logfile closed at %s===\n\n", ctime( <ime ) ); } fclose(logfile); logfile = 0; } static int check_dupe(const char * format, const char * type) { static const char * last_type; static char last_message[32]; static int dupes = 0; if (strncmp(last_message, format, sizeof(last_message))==0) { ++dupes; return 1; } if (dupes) { fprintf(logfile, "%s: last error repeated %d times\n", last_type, dupes+1); if (logfile!=stderr) { if (log_flags & LOG_CPERROR) { fprintf(stderr, "%s: last error repeated %d times\n", last_type, dupes+1); } } dupes = 0; } strncpy(last_message, format, sizeof(last_message)); last_type = type; return 0; } void _log_warn(const char * format, ...) { fflush(stdout); if (!logfile) logfile = stderr; if (!check_dupe(format, "WARNING")) { va_list marker; fputs("WARNING: ", logfile); va_start(marker, format); vfprintf(logfile, format, marker); va_end(marker); if (logfile!=stderr) { if (log_flags & LOG_CPWARNING) { fputs("WARNING: ", stderr); va_start(marker, format); vfprintf(stderr, format, marker); va_end(marker); } if (log_flags & LOG_FLUSH) { log_flush(); } } } } void _log_error(const char * format, ...) { fflush(stdout); if (!logfile) logfile = stderr; if (!check_dupe(format, "ERROR")) { va_list marker; fputs("ERROR: ", logfile); va_start(marker, format); vfprintf(logfile, format, marker); va_end(marker); if (logfile!=stderr) { if (log_flags & LOG_CPERROR) { fputs("ERROR: ", stderr); va_start(marker, format); vfprintf(stderr, format, marker); va_end(marker); } log_flush(); } } } void _log_info(unsigned int flag, const char * format, ...) { va_list marker; fflush(stdout); if (!logfile) logfile = stderr; fprintf(logfile, "INFO[%u]: ", flag); va_start(marker, format); vfprintf(logfile, format, marker); va_end(marker); if (logfile!=stderr) { if (log_flags & flag) { fprintf(stderr, "INFO[%u]: ", flag); va_start(marker, format); vfprintf(stderr, format, marker); va_end(marker); } if (log_flags & LOG_FLUSH) { log_flush(); } } }