From: molivier Date: Thu, 8 Apr 2004 13:11:51 +0000 (+0000) Subject: Added a "log_file" cvar to control the log file name (default: "" which means no... X-Git-Tag: xonotic-v0.1.0preview~5930 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=76fa048af00f95e290d0b90a8009a2a33aa5badd;p=xonotic%2Fdarkplaces.git Added a "log_file" cvar to control the log file name (default: "" which means no log, "-condebug" sets it to "qconsole.log"). Added a "log_sync" cvar to control whether or not the log output is flushed at each write (default: 0, "-condebug" sets it to 1). 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 --- diff --git a/cl_demo.c b/cl_demo.c index 85efe355..ec3f65d4 100644 --- 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(); } diff --git a/common.c b/common.c index 06d51a41..aa940a5f 100644 --- 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(); diff --git a/console.c b/console.c index e27c3d72..ead9ffd4 100644 --- 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 diff --git a/console.h b/console.h index d8b56ed3..9f415182 100644 --- 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 a3a633a7..3ecac691 100644 --- 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 228b75b6..79115351 100644 --- 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 a432abdb..8a90463d 100644 --- 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 e513474f..33927238 100644 --- 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)