]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - console.c
patch from div0: clamp "ping" reply valies in 0..9999 to prevent misparsing in case...
[xonotic/darkplaces.git] / console.c
index a54d46df945f75335ea7242b82699bd56a90710b..dad21399faad4360cf23d39a90e4c417d354a0b9 100644 (file)
--- a/console.c
+++ b/console.c
@@ -582,23 +582,13 @@ void Con_Print(const char *msg)
                        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 || *msg == 2)
                        {
+                               // play talk wav
                                if (*msg == 1)
-                               {
-                                       // play talk wav
                                        S_LocalSound ("sound/misc/talk.wav");
-                               }
-                               //if (gamemode == GAME_NEXUIZ)
-                               //{
-                                       line[index++] = STRING_COLOR_TAG;
-                                       line[index++] = '3';
-                               //}
-                               //else
-                               //{
-                               //      // go to colored text
-                               //      mask = 128;
-                               //}
+                               line[index++] = STRING_COLOR_TAG;
+                               line[index++] = '3';
                                msg++;
                        }
                        // store timestamp
@@ -715,7 +705,8 @@ void Con_DrawInput (void)
        if (!key_consoleactive)
                return;         // don't draw anything
 
-       text = strcpy(editlinecopy, key_lines[edit_line]);
+       strlcpy(editlinecopy, key_lines[edit_line], sizeof(editlinecopy));
+       text = editlinecopy;
 
        // Advanced Console Editing by Radix radix@planetquake.com
        // Added/Modified by EvilTypeGuy eviltypeguy@qeradiant.com
@@ -757,7 +748,7 @@ void Con_DrawNotify (void)
 {
        float   x, v;
        char    *text;
-       int             i;
+       int             i, stop;
        float   time;
        char    temptext[MAX_INPUTLINE];
        int colorindex = -1; //-1 for default
@@ -770,7 +761,9 @@ void Con_DrawNotify (void)
                v = 8;
        else
                v = 0;
-       for (i= con_current-con_notify.integer+1 ; i<=con_current ; i++)
+       // make a copy of con_current here so that we can't get in a runaway loop printing new messages while drawing the notify text
+       stop = con_current;
+       for (i= stop-con_notify.integer+1 ; i<=stop ; i++)
        {
 
                if (i < 0)
@@ -784,10 +777,25 @@ void Con_DrawNotify (void)
                text = con_text + (i % con_totallines)*con_linewidth;
 
                if (gamemode == GAME_NEXUIZ) {
-                       int linewidth;
+                       int chars = 0;
+                       int finalchars = 0;
+                       int j;
 
-                       for (linewidth = con_linewidth; linewidth && text[linewidth-1] == ' '; linewidth--);
-                       x = (vid_conwidth.integer - linewidth * con_textsize.value) * 0.5;
+                       // count up to the last non-whitespace, and ignore color codes
+                       for (j = 0;j < con_linewidth && text[j];j++)
+                       {
+                               if (text[j] == '^' && (text[j+1] >= '0' && text[j+1] <= '9'))
+                               {
+                                       j++;
+                                       continue;
+                               }
+                               chars++;
+                               if (text[j] == ' ')
+                                       continue;
+                               finalchars = chars;
+                       }
+                       // center the line using the calculated width
+                       x = (vid_conwidth.integer - finalchars * con_textsize.value) * 0.5;
                } else
                        x = 0;
 
@@ -811,7 +819,7 @@ void Con_DrawNotify (void)
                while ((int)strlen(temptext) >= con_linewidth)
                {
                        DrawQ_ColoredString( 0, v, temptext, con_linewidth, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, &colorindex );
-                       strcpy(temptext, &temptext[con_linewidth]);
+                       strlcpy(temptext, &temptext[con_linewidth], sizeof(temptext));
                        v += con_textsize.value;
                }
                if (strlen(temptext) > 0)
@@ -832,7 +840,7 @@ The typing input line at the bottom should only be drawn if typing is allowed
 */
 void Con_DrawConsole (int lines)
 {
-       int i, rows, j;
+       int i, rows, j, stop;
        float y;
        char *text;
        int colorindex = -1;
@@ -850,7 +858,9 @@ void Con_DrawConsole (int lines)
        rows = (int)ceil((lines/con_textsize.value)-2);         // rows of text to draw
        y = lines - (rows+2)*con_textsize.value;        // may start slightly negative
 
-       for (i = con_current - rows + 1;i <= con_current;i++, y += con_textsize.value)
+       // make a copy of con_current here so that we can't get in a runaway loop printing new messages while drawing the notify text
+       stop = con_current;
+       for (i = stop - rows + 1;i <= stop;i++, y += con_textsize.value)
        {
                j = max(i - con_backscroll, 0);
                text = con_text + (j % con_totallines)*con_linewidth;
@@ -888,7 +898,7 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer
                return false;
        if (t->numfilenames > 1)
                Con_Printf("^1 %i maps found :\n", t->numfilenames);
-       len = Z_Malloc(t->numfilenames);
+       len = (unsigned char *)Z_Malloc(t->numfilenames);
        min = 666;
        for(max=i=0;i<t->numfilenames;i++)
        {
@@ -909,7 +919,7 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer
                const char *data = NULL;
                char keyname[64];
                char entfilename[MAX_QPATH];
-               strcpy(message, "^1**ERROR**^7");
+               strlcpy(message, "^1**ERROR**^7", sizeof(message));
                p = 0;
                f = FS_Open(t->filenames[i], "rb", true, false);
                if(f)
@@ -951,12 +961,12 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer
                        else
                                p = 0;
                        strlcpy(entfilename, t->filenames[i], sizeof(entfilename));
-                       strcpy(entfilename + strlen(entfilename) - 4, ".ent");
+                       memcpy(entfilename + strlen(entfilename) - 4, ".ent", 5);
                        entities = (char *)FS_LoadFile(entfilename, tempmempool, true, NULL);
                        if (!entities && lumplen >= 10)
                        {
                                FS_Seek(f, lumpofs, SEEK_SET);
-                               entities = Z_Malloc(lumplen + 1);
+                               entities = (char *)Z_Malloc(lumplen + 1);
                                FS_Read(f, entities, lumplen);
                        }
                        if (entities)
@@ -968,7 +978,7 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer
                                for (;;)
                                {
                                        int l;
-                                       if (!COM_ParseToken(&data, false))
+                                       if (!COM_ParseTokenConsole(&data))
                                                break;
                                        if (com_token[0] == '{')
                                                continue;
@@ -979,7 +989,7 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer
                                        for (l = 0;l < (int)sizeof(keyname) - 1 && com_token[k+l] && com_token[k+l] > ' ';l++)
                                                keyname[l] = com_token[k+l];
                                        keyname[l] = 0;
-                                       if (!COM_ParseToken(&data, false))
+                                       if (!COM_ParseTokenConsole(&data))
                                                break;
                                        if (developer.integer >= 100)
                                                Con_Printf("key: %s %s\n", keyname, com_token);
@@ -999,12 +1009,12 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer
                *(t->filenames[i]+len[i]+5) = 0;
                switch(p)
                {
-               case Q3BSPVERSION:      strcpy((char *)buf, "Q3");break;
-               case Q2BSPVERSION:      strcpy((char *)buf, "Q2");break;
-               case BSPVERSION:        strcpy((char *)buf, "Q1");break;
-               case MCBSPVERSION:      strcpy((char *)buf, "MC");break;
-               case 30:                        strcpy((char *)buf, "HL");break;
-               default:                        strcpy((char *)buf, "??");break;
+               case Q3BSPVERSION:      strlcpy((char *)buf, "Q3", sizeof(buf));break;
+               case Q2BSPVERSION:      strlcpy((char *)buf, "Q2", sizeof(buf));break;
+               case BSPVERSION:        strlcpy((char *)buf, "Q1", sizeof(buf));break;
+               case MCBSPVERSION:      strlcpy((char *)buf, "MC", sizeof(buf));break;
+               case 30:                        strlcpy((char *)buf, "HL", sizeof(buf));break;
+               default:                        strlcpy((char *)buf, "??", sizeof(buf));break;
                }
                Con_Printf("%16s (%s) %s\n", t->filenames[i]+5, buf, message);
        }
@@ -1152,7 +1162,7 @@ void Con_CompleteCommandLine (void)
        if (!(c + v + a))       // No possible matches
        {
                if(s2[0])
-                       strcpy(&key_lines[edit_line][key_linepos], s2);
+                       strlcpy(&key_lines[edit_line][key_linepos], s2, sizeof(key_lines[edit_line]) - key_linepos);
                return;
        }