]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - console.c
cl_capturevideo_raw* modes now use O_NONBLOCKING file access for more performance
[xonotic/darkplaces.git] / console.c
index 8bac0735464d854d605e2fc3853b912d0e4ed154..f36ca203efcbf0022f690ba4bf4e682531863639 100644 (file)
--- a/console.c
+++ b/console.c
@@ -72,7 +72,6 @@ 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;
 
@@ -100,9 +99,9 @@ const char* Log_Timestamp (const char *desc)
        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);
+               dpsnprintf (timestamp, sizeof (timestamp), "====== %s (%s) ======\n", desc, timestring);
        else
-               snprintf (timestamp, sizeof (timestamp), "====== %s ======\n", timestring);
+               dpsnprintf (timestamp, sizeof (timestamp), "====== %s ======\n", timestring);
 
        return timestamp;
 }
@@ -121,15 +120,11 @@ void Log_Init (void)
        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
+// COMMANDLINEOPTION: Console: -condebug logs console messages to qconsole.log, see also log_file
        if (COM_CheckParm ("-condebug") != 0)
-       {
                Cvar_SetQuick (&log_file, "qconsole.log");
-               Cvar_SetValueQuick (&log_sync, 1);
-       }
 }
 
 
@@ -143,7 +138,7 @@ void Log_Open (void)
        if (logfile != NULL || log_file.string[0] == '\0')
                return;
 
-       logfile = FS_Open (log_file.string, "at", false);
+       logfile = FS_Open (log_file.string, "ab", false, false);
        if (logfile != NULL)
        {
                strlcpy (crt_log_file, log_file.string, sizeof (crt_log_file));
@@ -201,10 +196,12 @@ Log_ConPrint
 void Log_ConPrint (const char *msg)
 {
        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)
@@ -241,31 +238,11 @@ void Log_ConPrint (const char *msg)
 
        // If a log file is available
        if (logfile != NULL)
-       {
                FS_Print (logfile, msg);
-               if (log_sync.integer)
-                       FS_Flush (logfile);
-       }
        inprogress = false;
 }
 
 
-/*
-================
-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
@@ -275,7 +252,7 @@ void Log_Printf (const char *logfilename, const char *fmt, ...)
 {
        qfile_t *file;
 
-       file = FS_Open (logfilename, "at", true);
+       file = FS_Open (logfilename, "ab", true, false);
        if (file != NULL)
        {
                va_list argptr;
@@ -660,7 +637,7 @@ void Con_Printf(const char *fmt, ...)
        char msg[MAXPRINTMSG];
 
        va_start(argptr,fmt);
-       vsnprintf(msg,sizeof(msg),fmt,argptr);
+       dpvsnprintf(msg,sizeof(msg),fmt,argptr);
        va_end(argptr);
 
        Con_Print(msg);
@@ -696,7 +673,7 @@ void Con_DPrintf(const char *fmt, ...)
                return;                 // don't confuse non-developers with techie stuff...
 
        va_start(argptr,fmt);
-       vsnprintf(msg,sizeof(msg),fmt,argptr);
+       dpvsnprintf(msg,sizeof(msg),fmt,argptr);
        va_end(argptr);
 
        Con_Print(msg);
@@ -711,6 +688,73 @@ DRAWING
 ==============================================================================
 */
 
+static vec4_t _con_colors[] =
+{
+       {1.0, 1.0, 1.0, 1.0},
+       {1.0, 0.0, 0.0, 1.0},
+       {0.0, 1.0, 0.0, 1.0},
+       {0.0, 0.0, 1.0, 1.0},
+       {1.0, 1.0, 0.0, 1.0},
+       {0.0, 1.0, 1.0, 1.0},
+       {1.0, 0.0, 1.0, 1.0},
+       {0.1, 0.1, 0.1, 1.0}
+};
+
+#define _con_colors_count      (sizeof(_con_colors) / sizeof(vec3_t))
+#define _con_color_tag         '^'
+
+// color is read and changed in the end
+static void _Con_DrawString( float x, float y, const char *text, int maxlen, float scalex, float scaley, int flags )
+{
+       vec_t *color;
+       const char *first, *last;
+       int len;
+
+       color = _con_colors[0];
+       if( maxlen < 1)
+               len = strlen( text );
+       else
+               len = min( maxlen, (signed) strlen( text ));
+
+    first = last = text;
+       while( 1 ) {
+               // iterate until we get the next color tag or reach the end of the text part to draw
+               for( ; len && *last != _con_color_tag ; len--, last++ )
+                       ;
+               // dont do anything if we havent read anything yet
+               if( last != text ) {
+                       // draw the string
+                       DrawQ_String( x, y, first, last - first, scalex, scaley, color[0], color[1], color[2], color[3], flags );
+                       // update x to be at the new start position
+                       x += (last - first) * scalex;
+                       // if we have reached the end, we have finished
+                       if( !len )
+                               break;
+               }
+               first = last;
+               // jump over the tag
+               last++;
+               len--;
+               if( len && '0' <= *last && *last <= '9' ) {
+                       int index = 0;
+
+                       while( '0' <= *last && *last <= '9' && len ) {
+                               index = index * 10 + *last - '0';
+                               if( index < _con_colors_count ) {
+                                       last++;
+                                       len--;
+                               } else {
+                                       index /= 10;
+                                       break;
+                               }
+                       }
+
+                       color = _con_colors[index];
+                       // we dont want to display the color tag and the color index
+                       first = last;
+               }
+       }
+}
 
 /*
 ================
@@ -754,7 +798,7 @@ void Con_DrawInput (void)
                text += 1 + key_linepos - con_linewidth;
 
        // draw it
-       DrawQ_String(0, con_vislines - 16, text, con_linewidth, 8, 8, 1, 1, 1, 1, 0);
+       _Con_DrawString(0, con_vislines - 16, text, con_linewidth, 8, 8, 0);
 
        // remove cursor
 //     key_lines[edit_line][key_linepos] = 0;
@@ -800,12 +844,12 @@ void Con_DrawNotify (void)
                if (gamemode == GAME_NEXUIZ) {
                        int linewidth;
 
-                       for (linewidth = con_linewidth; text[--linewidth] == ' ' && linewidth; linewidth--);
-                       x = (vid.conwidth - ++linewidth * 8) / 2;
-               } else 
+                       for (linewidth = con_linewidth; linewidth && text[linewidth-1] == ' '; linewidth--);
+                       x = (vid.conwidth - linewidth * 8) / 2;
+               } else
                        x = 0;
 
-               DrawQ_String(x, v, text, con_linewidth, 8, 8, 1, 1, 1, 1, 0);
+               _Con_DrawString(x, v, text, con_linewidth, 8, 8, 0);
 
                v += 8;
        }
@@ -822,13 +866,13 @@ void Con_DrawNotify (void)
                        sprintf(temptext, "say:%s%c", chat_buffer, (int) 10+((int)(realtime*con_cursorspeed)&1));
                while (strlen(temptext) >= (size_t) con_linewidth)
                {
-                       DrawQ_String (0, v, temptext, con_linewidth, 8, 8, 1, 1, 1, 1, 0);
+                       _Con_DrawString (0, v, temptext, con_linewidth, 8, 8, 0);
                        strcpy(temptext, &temptext[con_linewidth]);
                        v += 8;
                }
                if (strlen(temptext) > 0)
                {
-                       DrawQ_String (0, v, temptext, 0, 8, 8, 1, 1, 1, 1, 0);
+                       _Con_DrawString (0, v, temptext, 0, 8, 8, 0);
                        v += 8;
                }
        }
@@ -869,7 +913,7 @@ void Con_DrawConsole (int lines)
                j = max(i - con_backscroll, 0);
                text = con_text + (j % con_totallines)*con_linewidth;
 
-               DrawQ_String(0, y, text, con_linewidth, 8, 8, 1, 1, 1, 1, 0);
+               _Con_DrawString(0, y, text, con_linewidth, 8, 8, 0);
        }
 
 // draw the input prompt, user text, and cursor if desired