about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2008-03-10 00:48:45 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2008-03-10 00:48:45 +0000
commit89eea17ead1ce1e777f7fc87c4869b3547f86867 (patch)
tree41e2c7154d25ef8e0ffa052db617081a2f1252cd
parent78155fa6d766d4529e8f602cb36457bce55cb17d (diff)
downloadzcatch-89eea17ead1ce1e777f7fc87c4869b3547f86867.tar.gz
zcatch-89eea17ead1ce1e777f7fc87c4869b3547f86867.zip
added option to log to file
-rw-r--r--src/engine/e_config_variables.h2
-rw-r--r--src/engine/e_engine.c12
-rw-r--r--src/engine/e_system.c91
-rw-r--r--src/engine/e_system.h19
4 files changed, 88 insertions, 36 deletions
diff --git a/src/engine/e_config_variables.h b/src/engine/e_config_variables.h
index 66684f86..c5624444 100644
--- a/src/engine/e_config_variables.h
+++ b/src/engine/e_config_variables.h
@@ -6,6 +6,8 @@ MACRO_CONFIG_STR(player_name, 32, "nameless tee")
 MACRO_CONFIG_STR(clan_name, 32, "")
 MACRO_CONFIG_STR(password, 32, "")
 
+MACRO_CONFIG_STR(logfile, 128, "")
+
 MACRO_CONFIG_INT(cl_cpu_throttle, 0, 0, 1)
 /*MACRO_CONFIG_STR(cl_connect, 32, "")*/
 MACRO_CONFIG_INT(cl_editor, 0, 0, 1)
diff --git a/src/engine/e_engine.c b/src/engine/e_engine.c
index 04094573..0f6fad06 100644
--- a/src/engine/e_engine.c
+++ b/src/engine/e_engine.c
@@ -37,6 +37,10 @@ int engine_stress(float probability)
 
 void engine_init(const char *appname)
 {
+	dbg_logger_stdout();
+	dbg_logger_debugger();
+	
+	/* */
 	dbg_msg("engine", "running on %s-%s-%s", CONF_FAMILY_STRING, CONF_PLATFORM_STRING, CONF_ARCH_STRING);
 #ifdef CONF_ARCH_ENDIAN_LITTLE
 	dbg_msg("engine", "arch is little endian");
@@ -63,12 +67,12 @@ void engine_init(const char *appname)
 		}
 	}
 
-	/* init console */
+	/* init console and add the console logger */
 	console_init();
+	dbg_logger(console_print);
 
 	MACRO_REGISTER_COMMAND("dbg_dumpmem", "", con_dbg_dumpmem, 0x0);
 	
-	
 	/* reset the config */
 	config_reset();
 }
@@ -102,6 +106,10 @@ void engine_parse_arguments(int argc, char **argv)
 			console_execute_line(argv[i]);
 	}
 	
+	/* open logfile if needed */
+	if(config.logfile[0])
+		dbg_logger_file(config.logfile);
+	
 	/* set default servers and load from disk*/
 	mastersrv_default();
 	mastersrv_load();
diff --git a/src/engine/e_system.c b/src/engine/e_system.c
index 044b48a2..72d131cb 100644
--- a/src/engine/e_system.c
+++ b/src/engine/e_system.c
@@ -51,7 +51,13 @@ IOHANDLE io_stdin() { return (IOHANDLE)stdin; }
 IOHANDLE io_stdout() { return (IOHANDLE)stdout; }
 IOHANDLE io_stderr() { return (IOHANDLE)stderr; }
 
-IOHANDLE logfile = 0;
+static DBG_LOGGER loggers[16];
+static int num_loggers = 0;
+
+void dbg_logger(DBG_LOGGER logger)
+{
+	loggers[num_loggers++] = logger;
+}
 
 void dbg_assert_imp(const char *filename, int line, int test, const char *msg)
 {
@@ -67,52 +73,65 @@ void dbg_break()
 	*((unsigned*)0) = 0x0;
 }
 
-int dbg_log_to_file(const char *filename)
-{
-	logfile = io_open(filename, IOFLAG_WRITE);
-	if(logfile)
-		return 1;
-	return 0;
-}
-
 void dbg_msg(const char *sys, const char *fmt, ...)
 {
 	va_list args;
-#if defined(CONF_FAMILY_WINDOWS)
 	char str[1024];
+	char *msg;
+	int i, len;
+	
+	str_format(str, sizeof(str), "[%08x][%s]: ", (int)time(0), sys);
+	len = strlen(str);
+	msg = (char *)str + len;
+	
 	va_start(args, fmt);
-	_vnsprintf(str, sizeof(str), fmt, args);
-	va_end(args);
-	OutputDebugString(str);
-	OutputDebugString("\n");
+#if defined(CONF_FAMILY_WINDOWS)
+	_vnsprintf(msg, sizeof(str)-len, fmt, args);
+#else
+	vsnprintf(msg, sizeof(str)-len, fmt, args);
 #endif
-
-	va_start(args, fmt);
-	printf("[%08x][%s]: ", (int)time(0), sys);
-	vprintf(fmt, args);
 	va_end(args);
-	printf("\n");
-	fflush(stdout);
-
-	{
-		char str[2048];
-		int len;
+	
+	for(i = 0; i < num_loggers; i++)
+		loggers[i](str);
+}
 
-		str_format(str, sizeof(str), "[%s]: ", sys);
+static void logger_stdout(const char *line)
+{
+	printf("%s\n", line);
+}
 
-		va_start(args, fmt);
-		len = strlen(str);
+static void logger_debugger(const char *line)
+{
 #if defined(CONF_FAMILY_WINDOWS)
-		_vsnprintf(str+len, sizeof(str)-len, fmt, args);
-#else
-		vsnprintf(str+len, sizeof(str)-len, fmt, args);
+	OutputDebugString(line);
+	OutputDebugString("\n");
 #endif
-		va_end(args);
+}
 
-		console_print(str);
-	}
+
+IOHANDLE logfile = 0;
+static void logger_file(const char *line)
+{
+	io_write(logfile, line, strlen(line));
+	io_write(logfile, "\n", 1);
+	io_flush(logfile);
 }
 
+void dbg_logger_stdout() { dbg_logger(logger_stdout); }
+void dbg_logger_debugger() { dbg_logger(logger_debugger); }
+void dbg_logger_file(const char *filename)
+{
+	logfile = io_open(filename, IOFLAG_WRITE);
+	if(logfile)
+		dbg_logger(logger_file);
+	else
+		dbg_msg("dbg/logger", "failed to open '%s' for logging", filename);
+
+}
+
+/* */
+
 int memory_alloced = 0;
 
 struct memheader
@@ -278,6 +297,12 @@ int io_close(IOHANDLE io)
 	return 1;
 }
 
+int io_flush(IOHANDLE io)
+{
+	fflush((FILE*)io);
+	return 0;
+}
+
 void *thread_create(void (*threadfunc)(void *), void *u)
 {
 #if defined(CONF_FAMILY_UNIX)
diff --git a/src/engine/e_system.h b/src/engine/e_system.h
index d524382b..0f79908d 100644
--- a/src/engine/e_system.h
+++ b/src/engine/e_system.h
@@ -9,7 +9,6 @@ extern "C" {
 #endif
 
 /* Group: Debug */
-
 /**********
 	Function: dbg_assert
 	
@@ -266,6 +265,18 @@ long int io_length(IOHANDLE io);
 *****/
 int io_close(IOHANDLE io);
 
+/*****
+	Function: io_flush
+		Empties all buffers and writes all pending data.
+	
+	Parameters:
+		io - Handle to the file.
+		
+	Returns:
+		Returns 0 on success.
+*****/
+int io_flush(IOHANDLE io);
+
 /**** Group: Threads ****/
 
 /*****
@@ -529,6 +540,12 @@ void str_format(char *buffer, int buffer_size, const char *format, ...);
 void str_sanitize_strong(char *str);
 void str_sanitize(char *str);
 
+typedef void (*DBG_LOGGER)(const char *line);
+void dbg_logger(DBG_LOGGER logger);
+void dbg_logger_stdout();
+void dbg_logger_debugger();
+void dbg_logger_file(const char *filename);
+
 IOHANDLE io_stdin();
 IOHANDLE io_stdout();
 IOHANDLE io_stderr();