X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=console.c;h=63236dea7045cc6762ebba87815603ca11d5bf81;hp=d72ddf6e4be610c1d8481aff5aaba954531b59f2;hb=30acc756015b7cb8a31ccfee2ce00e11a16b6579;hpb=f3e79d752a76a9d6329759a83ec9800a5e4cc92b diff --git a/console.c b/console.c index d72ddf6e..63236dea 100644 --- a/console.c +++ b/console.c @@ -39,7 +39,7 @@ int con_backscroll; int con_current; // offset in current line for next print int con_x; -char *con_text = 0; +char con_text[CON_TEXTSIZE]; //seconds cvar_t con_notifytime = {CVAR_SAVE, "con_notifytime","3"}; @@ -60,8 +60,6 @@ extern int key_insert; qboolean con_initialized; -mempool_t *console_mempool; - /* ============================================================================== @@ -72,7 +70,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,39 +97,14 @@ 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; } -/* -==================== -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); - unlink (va("%s/qconsole.log", fs_gamedir)); - } - - // Allocate a log queue - logq_size = 512; - logqueue = Mem_Alloc (tempmempool, logq_size); - logq_ind = 0; -} - - /* ==================== Log_Open @@ -143,7 +115,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)); @@ -200,6 +172,13 @@ 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) @@ -223,6 +202,7 @@ void Log_ConPrint (const char *msg) memcpy (&logqueue[logq_ind], msg, len); logq_ind += len; + inprogress = false; return; } @@ -235,30 +215,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 @@ -268,7 +229,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; @@ -364,50 +325,40 @@ void Con_CheckResize (void) int i, j, width, oldwidth, oldtotallines, numlines, numchars; char tbuf[CON_TEXTSIZE]; - width = (vid.conwidth >> 3); + width = (vid_conwidth.integer >> 3); if (width == con_linewidth) return; - if (width < 1) // video hasn't been initialized yet - { - width = 80; - con_linewidth = width; - con_totallines = CON_TEXTSIZE / con_linewidth; - memset (con_text, ' ', CON_TEXTSIZE); - } - else - { - oldwidth = con_linewidth; - con_linewidth = width; - oldtotallines = con_totallines; - con_totallines = CON_TEXTSIZE / con_linewidth; - numlines = oldtotallines; + oldwidth = con_linewidth; + con_linewidth = width; + oldtotallines = con_totallines; + con_totallines = CON_TEXTSIZE / con_linewidth; + numlines = oldtotallines; - if (con_totallines < numlines) - numlines = con_totallines; + if (con_totallines < numlines) + numlines = con_totallines; - numchars = oldwidth; + numchars = oldwidth; - if (con_linewidth < numchars) - numchars = con_linewidth; + if (con_linewidth < numchars) + numchars = con_linewidth; - memcpy (tbuf, con_text, CON_TEXTSIZE); - memset (con_text, ' ', CON_TEXTSIZE); + memcpy (tbuf, con_text, CON_TEXTSIZE); + memset (con_text, ' ', CON_TEXTSIZE); - for (i=0 ; i', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '<', + + '<', '=', '>', '#', '#', '.', '#', '#', + '#', '#', ' ', '#', ' ', '>', '.', '.', + '[', ']', '0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', '.', '<', '=', '>', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '<' +}; + /* ================ Con_Print -Prints to all appropriate console targets +Prints to all appropriate console targets, and adds timestamps ================ */ +extern cvar_t timestamps; +extern cvar_t timeformat; +extern qboolean sys_nostdout; void Con_Print(const char *msg) { - // also echo to debugging console - Sys_Print(msg); - - // log all messages to file - Log_ConPrint (msg); - - if (!con_initialized) - return; + int mask = 0; + static int index = 0; + static char line[16384]; - if (cls.state == ca_dedicated) - return; // no graphics mode - - // write it to the scrollable buffer - Con_PrintToHistory(msg); + for (;*msg;msg++) + { + if (index == 0) + { + // if this is the beginning of a new line, print timestamp + char *timestamp = timestamps.integer ? Sys_TimeString(timeformat.string) : ""; + // reset the color + // FIXME: 1. perhaps we should use a terminal system 2. use a constant instead of 7! + line[index++] = STRING_COLOR_TAG; + // assert( STRING_COLOR_DEFAULT < 10 ) + line[index++] = STRING_COLOR_DEFAULT + '0'; + // special color codes for chat messages must always come first + // for Con_PrintToHistory to work properly + if (*msg <= 2) + { + if (*msg == 1) + { + // play talk wav + S_LocalSound ("sound/misc/talk.wav"); + } + if (gamemode == GAME_NEXUIZ) + { + line[index++] = '^'; + line[index++] = '3'; + } + else + { + // go to colored text + mask = 128; + } + msg++; + } + // store timestamp + for (;*timestamp;index++, timestamp++) + if (index < sizeof(line) - 2) + line[index] = *timestamp; + } + // append the character + line[index++] = *msg; + // if this is a newline character, we have a complete line to print + if (*msg == '\n' || index >= 16000) + { + // terminate the line + line[index] = 0; + // send to log file + Log_ConPrint(line); + // send to scrollable buffer + if (con_initialized && cls.state != ca_dedicated) + Con_PrintToHistory(line, mask); + // send to terminal or dedicated server window + if (!sys_nostdout) + { + unsigned char *p; + for (p = (unsigned char *) line;*p; p++) + *p = qfont_table[*p]; + Sys_PrintToTerminal(line); + } + // empty the line buffer + index = 0; + } + } } @@ -585,7 +624,7 @@ void Con_Printf(const char *fmt, ...) char msg[MAXPRINTMSG]; va_start(argptr,fmt); - vsprintf(msg,fmt,argptr); + dpvsnprintf(msg,sizeof(msg),fmt,argptr); va_end(argptr); Con_Print(msg); @@ -621,39 +660,7 @@ void Con_DPrintf(const char *fmt, ...) return; // don't confuse non-developers with techie stuff... va_start(argptr,fmt); - vsprintf(msg,fmt,argptr); - va_end(argptr); - - Con_Print(msg); -} - - -/* -================ -Con_SafePrint - -Okay to call even when the screen can't be updated -================== -*/ -void Con_SafePrint(const char *msg) -{ - Con_Print(msg); -} - -/* -================== -Con_SafePrintf - -Okay to call even when the screen can't be updated -================== -*/ -void Con_SafePrintf(const char *fmt, ...) -{ - va_list argptr; - char msg[MAXPRINTMSG]; - - va_start(argptr,fmt); - vsprintf(msg,fmt,argptr); + dpvsnprintf(msg,sizeof(msg),fmt,argptr); va_end(argptr); Con_Print(msg); @@ -668,7 +675,6 @@ DRAWING ============================================================================== */ - /* ================ Con_DrawInput @@ -711,7 +717,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); + DrawQ_ColoredString(0, con_vislines - 16, text, con_linewidth, 8, 8, 1.0, 1.0, 1.0, 1.0, 0, NULL ); // remove cursor // key_lines[edit_line][key_linepos] = 0; @@ -733,6 +739,7 @@ void Con_DrawNotify (void) float time; extern char chat_buffer[]; char temptext[256]; + int colorindex = -1; //-1 for default if (con_notify.integer < 0) Cvar_SetValueQuick(&con_notify, 0); @@ -744,6 +751,7 @@ void Con_DrawNotify (void) v = 0; for (i= con_current-con_notify.integer+1 ; i<=con_current ; i++) { + if (i < 0) continue; time = con_times[i % con_notify.integer]; @@ -754,17 +762,23 @@ void Con_DrawNotify (void) continue; text = con_text + (i % con_totallines)*con_linewidth; - clearnotify = 0; + if (gamemode == GAME_NEXUIZ) { + int linewidth; - DrawQ_String(0, v, text, con_linewidth, 8, 8, 1, 1, 1, 1, 0); + for (linewidth = con_linewidth; linewidth && text[linewidth-1] == ' '; linewidth--); + x = (vid_conwidth.integer - linewidth * 8) / 2; + } else + x = 0; + DrawQ_ColoredString( x, v, text, con_linewidth, 8, 8, 1.0, 1.0, 1.0, 1.0, 0, &colorindex ); + v += 8; } if (key_dest == key_message) { - clearnotify = 0; + int colorindex = -1; x = 0; @@ -775,13 +789,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); + DrawQ_ColoredString( 0, v, temptext, con_linewidth, 8, 8, 1.0, 1.0, 1.0, 1.0, 0, &colorindex ); strcpy(temptext, &temptext[con_linewidth]); v += 8; } if (strlen(temptext) > 0) { - DrawQ_String (0, v, temptext, 0, 8, 8, 1, 1, 1, 1, 0); + DrawQ_ColoredString( 0, v, temptext, 0, 8, 8, 1.0, 1.0, 1.0, 1.0, 0, &colorindex ); v += 8; } } @@ -800,16 +814,17 @@ void Con_DrawConsole (int lines) { int i, y, rows, j; char *text; + int colorindex = -1; if (lines <= 0) return; // draw the background if (scr_conbrightness.value >= 0.01f) - DrawQ_Pic(0, lines - vid.conheight, "gfx/conback", vid.conwidth, vid.conheight, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, scr_conalpha.value, 0); + DrawQ_Pic(0, lines - vid_conheight.integer, "gfx/conback", vid_conwidth.integer, vid_conheight.integer, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, scr_conalpha.value, 0); else - DrawQ_Fill(0, lines - vid.conheight, vid.conwidth, vid.conheight, 0, 0, 0, scr_conalpha.value, 0); - DrawQ_String(vid.conwidth - strlen(engineversion) * 8 - 8, lines - 8, engineversion, 0, 8, 8, 1, 0, 0, 1, 0); + DrawQ_Fill(0, lines - vid_conheight.integer, vid_conwidth.integer, vid_conheight.integer, 0, 0, 0, scr_conalpha.value, 0); + DrawQ_String(vid_conwidth.integer - strlen(engineversion) * 8 - 8, lines - 8, engineversion, 0, 8, 8, 1, 0, 0, 1, 0); // draw the text con_vislines = lines; @@ -822,7 +837,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); + DrawQ_ColoredString( 0, y, text, con_linewidth, 8, 8, 1.0, 1.0, 1.0, 1.0, 0, &colorindex ); } // draw the input prompt, user text, and cursor if desired