]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - console.c
now checks that a lightmap surfacechain is not NULL before dereferencing it
[xonotic/darkplaces.git] / console.c
index ead9ffd42ebe41410513b82ee59e419bfe7e54c6..d49bcd6a32e0129e588e6877a404ab691219df0f 100644 (file)
--- a/console.c
+++ b/console.c
@@ -19,9 +19,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
 // console.c
 
-#ifndef WIN32
+#if !defined(WIN32) || defined(__MINGW32__)
 # include <unistd.h>
 #endif
+#include <time.h>
 #include "quakedef.h"
 
 int con_linewidth;
@@ -72,12 +73,41 @@ LOGGING
 
 cvar_t log_file = {0, "log_file",""};
 cvar_t log_sync = {0, "log_sync","0"};
+char crt_log_file [MAX_OSPATH] = "";
 qfile_t* logfile = NULL;
 
 qbyte* logqueue = NULL;
 size_t logq_ind = 0;
 size_t logq_size = 0;
 
+void Log_ConPrint (const char *msg);
+
+/*
+====================
+Log_Timestamp
+====================
+*/
+const char* Log_Timestamp (const char *desc)
+{
+       static char timestamp [128];
+       time_t crt_time;
+       const struct tm *crt_tm;
+       char timestring [64];
+
+       // Build the time stamp (ex: "Wed Jun 30 21:49:08 1993");
+       time (&crt_time);
+       crt_tm = localtime (&crt_time);
+       strftime (timestring, sizeof (timestring), "%a %b %d %H:%M:%S %Y", crt_tm);
+
+       if (desc != NULL)
+               snprintf (timestamp, sizeof (timestamp), "====== %s (%s) ======\n", desc, timestring);
+       else
+               snprintf (timestamp, sizeof (timestamp), "====== %s ======\n", timestring);
+
+       return timestamp;
+}
+
+
 /*
 ====================
 Log_Init
@@ -85,20 +115,60 @@ Log_Init
 */
 void Log_Init (void)
 {
+       // Allocate a log queue
+       logq_size = 512;
+       logqueue = Mem_Alloc (tempmempool, logq_size);
+       logq_ind = 0;
+
        Cvar_RegisterVariable (&log_file);
        Cvar_RegisterVariable (&log_sync);
 
        // support for the classic Quake option
+// COMMANDLINEOPTION: Console: -condebug logs console messages to qconsole.log with sync on (so it keeps every message up to a crash), see also log_file and log_sync
        if (COM_CheckParm ("-condebug") != 0)
        {
                Cvar_SetQuick (&log_file, "qconsole.log");
                Cvar_SetValueQuick (&log_sync, 1);
+               unlink (va("%s/qconsole.log", fs_gamedir));
        }
+}
 
-       // Allocate a log queue
-       logq_size = 4;
-       logqueue = Mem_Alloc (tempmempool, logq_size);
-       logq_ind = 0;
+
+/*
+====================
+Log_Open
+====================
+*/
+void Log_Open (void)
+{
+       if (logfile != NULL || log_file.string[0] == '\0')
+               return;
+
+       logfile = FS_Open (log_file.string, "at", false);
+       if (logfile != NULL)
+       {
+               strlcpy (crt_log_file, log_file.string, sizeof (crt_log_file));
+               FS_Print (logfile, Log_Timestamp ("Log started"));
+       }
+}
+
+
+/*
+====================
+Log_Close
+====================
+*/
+void Log_Close (void)
+{
+       if (logfile == NULL)
+               return;
+
+       FS_Print (logfile, Log_Timestamp ("Log stopped"));
+       FS_Print (logfile, "\n");
+       FS_Close (logfile);
+
+       logfile = NULL;
+       crt_log_file[0] = '\0';
 }
 
 
@@ -109,8 +179,7 @@ Log_Start
 */
 void Log_Start (void)
 {
-       if (log_file.string[0] != '\0')
-               logfile = FS_Open (log_file.string, "wt", false);
+       Log_Open ();
 
        // Dump the contents of the log queue into the log file and free it
        if (logqueue != NULL)
@@ -132,15 +201,11 @@ 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);
+       static qboolean inprogress = false;
+       // don't allow feedback loops with memory error reports
+       if (inprogress)
                return;
-       }
-
+       inprogress = true;
        // 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)
@@ -163,7 +228,26 @@ void Log_ConPrint (const char *msg)
                }
                memcpy (&logqueue[logq_ind], msg, len);
                logq_ind += len;
+
+               inprogress = false;
+               return;
+       }
+
+       // Check if log_file has changed
+       if (strcmp (crt_log_file, log_file.string) != 0)
+       {
+               Log_Close ();
+               Log_Open ();
        }
+
+       // If a log file is available
+       if (logfile != NULL)
+       {
+               FS_Print (logfile, msg);
+               if (log_sync.integer)
+                       FS_Flush (logfile);
+       }
+       inprogress = false;
 }
 
 
@@ -343,7 +427,7 @@ Con_Init
 */
 void Con_Init (void)
 {
-       console_mempool = Mem_AllocPool("console");
+       console_mempool = Mem_AllocPool("console", 0, NULL);
        con_text = Mem_Alloc(console_mempool, CON_TEXTSIZE);
        memset (con_text, ' ', CON_TEXTSIZE);
        con_linewidth = -1;
@@ -371,6 +455,9 @@ Con_Linefeed
 */
 void Con_Linefeed (void)
 {
+       if (con_backscroll)
+               con_backscroll++;
+
        con_x = 0;
        con_current++;
        memset (&con_text[(con_current%con_totallines)*con_linewidth], ' ', con_linewidth);
@@ -390,12 +477,10 @@ void Con_PrintToHistory(const char *txt)
        int y, c, l, mask;
        static int cr;
 
-       con_backscroll = 0;
-
        if (txt[0] == 1)
        {
                mask = 128;             // go to colored text
-               S_LocalSound ("misc/talk.wav");
+               S_LocalSound ("sound/misc/talk.wav");
        // play talk wav
                txt++;
        }
@@ -603,6 +688,8 @@ Modified by EvilTypeGuy eviltypeguy@qeradiant.com
 */
 void Con_DrawInput (void)
 {
+       int             y;
+       int             i;
        char editlinecopy[257], *text;
 
        if (!key_consoleactive)
@@ -615,11 +702,17 @@ void Con_DrawInput (void)
        // use strlen of edit_line instead of key_linepos to allow editing
        // of early characters w/o erasing
 
+       y = strlen(text);
+
+// fill out remainder with spaces
+       for (i = y; i < 256; i++)
+               text[i] = ' ';
+
        // add the cursor frame
        if ((int)(realtime*con_cursorspeed) & 1)                // cursor is visible
                text[key_linepos] = 11 + 130 * key_insert;      // either solid or triangle facing right
 
-       text[key_linepos + 1] = 0;
+//     text[key_linepos + 1] = 0;
 
        // prestep if horizontally scrolling
        if (key_linepos >= con_linewidth)
@@ -629,7 +722,7 @@ void Con_DrawInput (void)
        DrawQ_String(0, con_vislines - 16, text, con_linewidth, 8, 8, 1, 1, 1, 1, 0);
 
        // remove cursor
-       key_lines[edit_line][key_linepos] = 0;
+//     key_lines[edit_line][key_linepos] = 0;
 }
 
 
@@ -653,7 +746,10 @@ void Con_DrawNotify (void)
                Cvar_SetValueQuick(&con_notify, 0);
        if (con_notify.integer > MAX_NOTIFYLINES)
                Cvar_SetValueQuick(&con_notify, MAX_NOTIFYLINES);
-       v = 0;
+       if (gamemode == GAME_TRANSFUSION)
+               v = 8;
+       else
+               v = 0;
        for (i= con_current-con_notify.integer+1 ; i<=con_current ; i++)
        {
                if (i < 0)
@@ -666,8 +762,6 @@ void Con_DrawNotify (void)
                        continue;
                text = con_text + (i % con_totallines)*con_linewidth;
 
-               clearnotify = 0;
-
                DrawQ_String(0, v, text, con_linewidth, 8, 8, 1, 1, 1, 1, 0);
 
                v += 8;
@@ -676,8 +770,6 @@ void Con_DrawNotify (void)
 
        if (key_dest == key_message)
        {
-               clearnotify = 0;
-
                x = 0;
 
                // LordHavoc: speedup, and other improvements