Added a "log_file" cvar to control the log file name (default: "" which means no...
authormolivier <molivier@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 8 Apr 2004 13:11:51 +0000 (13:11 +0000)
committermolivier <molivier@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 8 Apr 2004 13:11:51 +0000 (13:11 +0000)
Note that we now need to wait until the cvars are initialized to start logging the console, so the logging system puts every message printed before that in a logging queue that is proceed when the log file is actually opened.
Renamed "Con_LogPrint" and "Con_LogPrintf" to "Log_Print" and "Log_Printf" respectively. Added "FS_VPrintf"

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@4090 d7cf8633-e32d-0410-b094-e92efae38249

cl_demo.c
common.c
console.c
console.h
fs.c
fs.h
host.c
todo

index 85efe35..ec3f65d 100644 (file)
--- a/cl_demo.c
+++ b/cl_demo.c
@@ -376,7 +376,7 @@ void CL_FinishTimeDemo (void)
        fpsmax = cls.td_minframetime > 0 ? 1.0 / cls.td_minframetime : 0;
        // LordHavoc: timedemo now prints out 7 digits of fraction, and min/avg/max
        Con_Printf("%i frames %5.7f seconds %5.7f fps\nmin/avg/max: %5.7f/%5.7f/%5.7f\n", frames, time, fpsavg, fpsmin, fpsavg, fpsmax);
-       Con_LogPrintf("benchmark.log", "date %s | enginedate %s | demo %s | commandline %s | result %i frames %5.7f seconds %5.7f fps min/avg/max: %5.7f/%5.7f/%5.7f\n", Sys_TimeString("%Y-%m-%d %H:%M:%S"), buildstring, cls.demoname, cmdline.string, frames, time, fpsavg, fpsmin, fpsavg, fpsmax);
+       Log_Printf("benchmark.log", "date %s | enginedate %s | demo %s | commandline %s | result %i frames %5.7f seconds %5.7f fps min/avg/max: %5.7f/%5.7f/%5.7f\n", Sys_TimeString("%Y-%m-%d %H:%M:%S"), buildstring, cls.demoname, cmdline.string, frames, time, fpsavg, fpsmin, fpsavg, fpsmax);
        if (COM_CheckParm("-benchmark"))
                Host_Quit_f();
 }
index 06d51a4..aa940a5 100644 (file)
--- a/common.c
+++ b/common.c
@@ -844,7 +844,7 @@ void COM_Init (void)
        Mathlib_Init();
 
        FS_Init ();
-       Con_InitLogging();
+       Log_Init ();
        COM_CheckRegistered ();
 
        COM_InitGameType();
index e27c3d7..ead9ffd 100644 (file)
--- a/console.c
+++ b/console.c
@@ -50,8 +50,6 @@ float con_times[MAX_NOTIFYLINES];
 
 int con_vislines;
 
-qboolean con_debuglog;
-
 #define MAXCMDLINE     256
 extern char key_lines[32][MAXCMDLINE];
 extern int edit_line;
@@ -63,7 +61,158 @@ qboolean con_initialized;
 
 mempool_t *console_mempool;
 
-extern void M_Menu_Main_f (void);
+
+/*
+==============================================================================
+
+LOGGING
+
+==============================================================================
+*/
+
+cvar_t log_file = {0, "log_file",""};
+cvar_t log_sync = {0, "log_sync","0"};
+qfile_t* logfile = NULL;
+
+qbyte* logqueue = NULL;
+size_t logq_ind = 0;
+size_t logq_size = 0;
+
+/*
+====================
+Log_Init
+====================
+*/
+void Log_Init (void)
+{
+       Cvar_RegisterVariable (&log_file);
+       Cvar_RegisterVariable (&log_sync);
+
+       // support for the classic Quake option
+       if (COM_CheckParm ("-condebug") != 0)
+       {
+               Cvar_SetQuick (&log_file, "qconsole.log");
+               Cvar_SetValueQuick (&log_sync, 1);
+       }
+
+       // Allocate a log queue
+       logq_size = 4;
+       logqueue = Mem_Alloc (tempmempool, logq_size);
+       logq_ind = 0;
+}
+
+
+/*
+====================
+Log_Start
+====================
+*/
+void Log_Start (void)
+{
+       if (log_file.string[0] != '\0')
+               logfile = FS_Open (log_file.string, "wt", false);
+
+       // Dump the contents of the log queue into the log file and free it
+       if (logqueue != NULL)
+       {
+               if (logfile != NULL && logq_ind != 0)
+                       FS_Write (logfile, logqueue, logq_ind);
+               Mem_Free (logqueue);
+               logqueue = NULL;
+               logq_ind = 0;
+               logq_size = 0;
+       }
+}
+
+
+/*
+================
+Log_ConPrint
+================
+*/
+void Log_ConPrint (const char *msg)
+{
+       // Easy case: a log has been started
+       if (logfile != NULL)
+       {
+               FS_Print (logfile, msg);
+               if (log_sync.integer)
+                       FS_Flush (logfile);
+               return;
+       }
+
+       // Until the host is completely initialized, we maintain a log queue
+       // to store the messages, since the log can't be started before
+       if (logqueue != NULL)
+       {
+               size_t remain = logq_size - logq_ind;
+               size_t len = strlen (msg);
+
+               // If we need to enlarge the log queue
+               if (len > remain)
+               {
+                       unsigned int factor = ((logq_ind + len) / logq_size) + 1;
+                       qbyte* newqueue;
+
+                       logq_size *= factor;
+                       newqueue = Mem_Alloc (tempmempool, logq_size);
+                       memcpy (newqueue, logqueue, logq_ind);
+                       Mem_Free (logqueue);
+                       logqueue = newqueue;
+                       remain = logq_size - logq_ind;
+               }
+               memcpy (&logqueue[logq_ind], msg, len);
+               logq_ind += len;
+       }
+}
+
+
+/*
+================
+Log_Print
+================
+*/
+void Log_Print (const char *logfilename, const char *msg)
+{
+       qfile_t *file;
+       file = FS_Open(logfilename, "at", true);
+       if (file)
+       {
+               FS_Print(file, msg);
+               FS_Close(file);
+       }
+}
+
+/*
+================
+Log_Printf
+================
+*/
+void Log_Printf (const char *logfilename, const char *fmt, ...)
+{
+       qfile_t *file;
+
+       file = FS_Open (logfilename, "at", true);
+       if (file != NULL)
+       {
+               va_list argptr;
+
+               va_start (argptr, fmt);
+               FS_VPrintf (file, fmt, argptr);
+               va_end (argptr);
+
+               FS_Close (file);
+       }
+}
+
+
+/*
+==============================================================================
+
+CONSOLE
+
+==============================================================================
+*/
 
 /*
 ================
@@ -187,24 +336,6 @@ void Con_CheckResize (void)
        con_current = con_totallines - 1;
 }
 
-
-void Con_InitLogging (void)
-{
-#define MAXGAMEDIRLEN 1000
-       char temp[MAXGAMEDIRLEN+1];
-       char *t2 = "/qconsole.log";
-
-       con_debuglog = COM_CheckParm("-condebug");
-       if (con_debuglog)
-       {
-               if (strlen (fs_gamedir) < (MAXGAMEDIRLEN - strlen (t2)))
-               {
-                       sprintf (temp, "%s%s", fs_gamedir, t2);
-                       unlink (temp);
-               }
-       }
-}
-
 /*
 ================
 Con_Init
@@ -220,12 +351,11 @@ void Con_Init (void)
 
        Con_Print("Console initialized.\n");
 
-//
-// register our commands
-//
+       // register our cvars
        Cvar_RegisterVariable (&con_notifytime);
        Cvar_RegisterVariable (&con_notify);
 
+       // register our commands
        Cmd_AddCommand ("toggleconsole", Con_ToggleConsole_f);
        Cmd_AddCommand ("messagemode", Con_MessageMode_f);
        Cmd_AddCommand ("messagemode2", Con_MessageMode2_f);
@@ -336,42 +466,6 @@ void Con_PrintToHistory(const char *txt)
        }
 }
 
-// LordHavoc: increased from 4096 to 16384
-#define        MAXPRINTMSG     16384
-
-/*
-================
-Con_LogPrint
-================
-*/
-void Con_LogPrint(const char *logfilename, const char *msg)
-{
-       qfile_t *file;
-       file = FS_Open(logfilename, "at", true);
-       if (file)
-       {
-               FS_Print(file, msg);
-               FS_Close(file);
-       }
-}
-
-/*
-================
-Con_LogPrintf
-================
-*/
-void Con_LogPrintf(const char *logfilename, const char *fmt, ...)
-{
-       va_list argptr;
-       char msg[MAXPRINTMSG];
-
-       va_start(argptr,fmt);
-       vsprintf(msg,fmt,argptr);
-       va_end(argptr);
-
-       Con_LogPrint(logfilename, msg);
-}
-
 /*
 ================
 Con_Print
@@ -385,8 +479,7 @@ void Con_Print(const char *msg)
        Sys_Print(msg);
 
        // log all messages to file
-       if (con_debuglog)
-               Con_LogPrint("qconsole.log", msg);
+       Log_ConPrint (msg);
 
        if (!con_initialized)
                return;
@@ -398,6 +491,10 @@ void Con_Print(const char *msg)
        Con_PrintToHistory(msg);
 }
 
+
+// LordHavoc: increased from 4096 to 16384
+#define        MAXPRINTMSG     16384
+
 /*
 ================
 Con_Printf
index d8b56ed..9f41518 100644 (file)
--- a/console.h
+++ b/console.h
@@ -30,7 +30,6 @@ extern qboolean con_initialized;
 extern qbyte *con_chars;
 
 void Con_CheckResize (void);
-void Con_InitLogging (void);
 void Con_Init (void);
 void Con_DrawConsole (int lines);
 void Con_Print(const char *txt);
@@ -39,8 +38,6 @@ void Con_DPrint(const char *msg);
 void Con_DPrintf(const char *fmt, ...);
 void Con_SafePrint(const char *msg);
 void Con_SafePrintf(const char *fmt, ...);
-void Con_LogPrint(const char *logfilename, const char *msg);
-void Con_LogPrintf(const char *logfilename, const char *fmt, ...);
 void Con_Clear_f (void);
 void Con_DrawNotify (void);
 void Con_ClearNotify (void);
@@ -56,5 +53,15 @@ void Con_CompleteCommandLine(void);
 // formatted in columns on the console
 void Con_DisplayList(const char **list);
 
+
+//
+// log
+//
+void Log_Init (void);
+void Log_Start (void);
+// Log_Print and Log_Printf can be used as soon as the FS initialization is done
+void Log_Print(const char *logfilename, const char *msg);
+void Log_Printf(const char *logfilename, const char *fmt, ...);
+
 #endif
 
diff --git a/fs.c b/fs.c
index a3a633a..3ecac69 100644 (file)
--- a/fs.c
+++ b/fs.c
@@ -1449,6 +1449,19 @@ int FS_Printf(qfile_t* file, const char* format, ...)
 }
 
 
+/*
+====================
+FS_VPrintf
+
+Print a string into a file
+====================
+*/
+int FS_VPrintf(qfile_t* file, const char* format, va_list ap)
+{
+       return vfprintf (file->stream, format, ap);
+}
+
+
 /*
 ====================
 FS_Getc
diff --git a/fs.h b/fs.h
index 228b75b..7911535 100644 (file)
--- a/fs.h
+++ b/fs.h
@@ -51,6 +51,7 @@ size_t FS_Read (qfile_t* file, void* buffer, size_t buffersize);
 int FS_Flush (qfile_t* file);
 int FS_Print(qfile_t* file, const char *msg);
 int FS_Printf(qfile_t* file, const char* format, ...);
+int FS_VPrintf(qfile_t* file, const char* format, va_list ap);
 int FS_Getc (qfile_t* file);
 int FS_Seek (qfile_t* file, long offset, int whence);
 long FS_Tell (qfile_t* file);
diff --git a/host.c b/host.c
index a432abd..8a90463 100644 (file)
--- a/host.c
+++ b/host.c
@@ -906,6 +906,9 @@ void Host_Init (void)
                Cbuf_InsertText(va("timedemo %s\n", com_argv[i + 1]));
 
        Cbuf_Execute();
+
+       // We must wait for the log_file cvar to be initialized to start the log
+       Log_Start ();
 }
 
 
diff --git a/todo b/todo
index e513474..3392723 100644 (file)
--- a/todo
+++ b/todo
@@ -263,7 +263,7 @@ f darkplaces: pointcontents crash when building harvester in gvb2? (yummyluv)
 1 darkplaces: add findflag and findchainflag builtins (SeienAbunae)
 1 darkplaces: add gettimestamp builtin (returns a string) for logging purposes (SeienAbunae)
 1 darkplaces: add in_bindmap support to bind menu; a selector for which bindmap is actively being shown and bound in the menu, and add bind entries for some bindmap commands (sajt)
-1 darkplaces: add log cvar to set console logging target (default "", or default "qconsole.log" if -condebug is used)
+-n darkplaces: add log cvar to set console logging target (default "", or default "qconsole.log" if -condebug is used)
 1 darkplaces: add md3 mesh name reporting to qc somehow when traceline does model tracing and hits the model
 1 darkplaces: add palette conversion capabilities to Image_CopyMux
 1 darkplaces: add r_displayrefresh cvar for windows video refresh settings (Willis)