]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - console.c
add a new "scale" property in font files. Specifying, e.g., "scale 1.2" in a font...
[xonotic/darkplaces.git] / console.c
index 82c35dd69729cbe91cb4001d5a76534738bd3eb1..14642f1b3347e52df4ecfd012970fb6a7e7277c7 100644 (file)
--- a/console.c
+++ b/console.c
@@ -96,6 +96,10 @@ cvar_t con_nickcompletion_flags = {CVAR_SAVE, "con_nickcompletion_flags", "11",
 #define NICKS_ALPHANUMERICS_ONLY 8
 #define NICKS_NO_SPACES 16
 
+cvar_t con_completion_playdemo = {CVAR_SAVE, "con_completion_playdemo", "*.dem"};
+cvar_t con_completion_timedemo = {CVAR_SAVE, "con_completion_timedemo", "*.dem"};
+cvar_t con_completion_exec = {CVAR_SAVE, "con_completion_exec", "*.cfg"};
+
 int con_linewidth;
 int con_vislines;
 
@@ -188,13 +192,22 @@ const char* Log_Timestamp (const char *desc)
 {
        static char timestamp [128];
        time_t crt_time;
-       const struct tm *crt_tm;
+#if _MSC_VER >= 1400
+       struct tm crt_tm;
+#else
+       struct tm *crt_tm;
+#endif
        char timestring [64];
 
        // Build the time stamp (ex: "Wed Jun 30 21:49:08 1993");
        time (&crt_time);
+#if _MSC_VER >= 1400
+       localtime_s (&crt_tm, &crt_time);
+       strftime (timestring, sizeof (timestring), "%a %b %d %H:%M:%S %Y", &crt_tm);
+#else
        crt_tm = localtime (&crt_time);
        strftime (timestring, sizeof (timestring), "%a %b %d %H:%M:%S %Y", crt_tm);
+#endif
 
        if (desc != NULL)
                dpsnprintf (timestamp, sizeof (timestamp), "====== %s (%s) ======\n", desc, timestring);
@@ -544,6 +557,10 @@ void Con_Init (void)
        Cvar_RegisterVariable (&con_nickcompletion);
        Cvar_RegisterVariable (&con_nickcompletion_flags);
 
+       Cvar_RegisterVariable (&con_completion_playdemo); // *.dem
+       Cvar_RegisterVariable (&con_completion_timedemo); // *.dem
+       Cvar_RegisterVariable (&con_completion_exec); // *.cfg
+
        // register our commands
        Cmd_AddCommand ("toggleconsole", Con_ToggleConsole_f, "opens or closes the console");
        Cmd_AddCommand ("messagemode", Con_MessageMode_f, "input a chat message to say to everyone");
@@ -553,7 +570,7 @@ void Con_Init (void)
        Cmd_AddCommand ("condump", Con_ConDump_f, "output console history to a file (see also log_file)");
 
        con_initialized = true;
-       Con_Print("Console initialized.\n");
+       Con_DPrint("Console initialized.\n");
 }
 
 
@@ -1178,9 +1195,18 @@ float Con_WordWidthFunc(void *passthrough, const char *w, size_t *length, float
        if(w == NULL)
        {
                ti->colorindex = -1;
-               return ti->fontsize * ti->font->width_of[0];
+               return ti->fontsize * ti->font->maxwidth;
+       }
+       if(maxWidth >= 0)
+               return DrawQ_TextWidth_Font_UntilWidth(w, length, false, ti->font, maxWidth / ti->fontsize) * ti->fontsize;
+       else if(maxWidth == -1)
+               return DrawQ_TextWidth_Font(w, *length, false, ti->font) * ti->fontsize;
+       else
+       {
+               printf("Con_WordWidthFunc: can't get here (maxWidth should never be %f)\n", maxWidth);
+               // Note: this is NOT a Con_Printf, as it could print recursively
+               return 0;
        }
-       return DrawQ_TextWidth_Font_UntilWidth(w, length, false, ti->font, maxWidth) * ti->fontsize;
 }
 
 int Con_CountLineFunc(void *passthrough, const char *line, size_t length, float width, qboolean isContinuation)
@@ -1369,9 +1395,9 @@ void Con_DrawNotify (void)
 
                // LordHavoc: speedup, and other improvements
                if (chat_team)
-                       sprintf(temptext, "say_team:%s%c", chat_buffer, (int) 10+((int)(realtime*con_cursorspeed)&1));
+                       dpsnprintf(temptext, sizeof(temptext), "say_team:%s%c", chat_buffer, (int) 10+((int)(realtime*con_cursorspeed)&1));
                else
-                       sprintf(temptext, "say:%s%c", chat_buffer, (int) 10+((int)(realtime*con_cursorspeed)&1));
+                       dpsnprintf(temptext, sizeof(temptext), "say:%s%c", chat_buffer, (int) 10+((int)(realtime*con_cursorspeed)&1));
 
                // FIXME word wrap
                inputsize = (numChatlines ? con_chatsize : con_notifysize).value;
@@ -1500,7 +1526,7 @@ void Con_DrawConsole (int lines)
        con_vislines = lines;
 
 // draw the background
-       DrawQ_Pic(0, lines - vid_conheight.integer, scr_conbrightness.value >= 0.01f ? Draw_CachePic("gfx/conback", true) : NULL, vid_conwidth.integer, vid_conheight.integer, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, cls.signon == SIGNONS ? scr_conalpha.value : 1.0, 0); // always full alpha when not in game
+       DrawQ_Pic(0, lines - vid_conheight.integer, scr_conbrightness.value >= 0.01f ? Draw_CachePic ("gfx/conback") : NULL, vid_conwidth.integer, vid_conheight.integer, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, cls.signon == SIGNONS ? scr_conalpha.value : 1.0, 0); // always full alpha when not in game
        DrawQ_String_Font(vid_conwidth.integer - DrawQ_TextWidth_Font(engineversion, 0, false, FONT_CONSOLE) * con_textsize.value, lines - con_textsize.value, engineversion, 0, con_textsize.value, con_textsize.value, 1, 0, 0, 1, 0, NULL, true, FONT_CONSOLE);
 
 // draw the text
@@ -1538,19 +1564,19 @@ Prints not only map filename, but also
 its format (q1/q2/q3/hl) and even its message
 */
 //[515]: here is an ugly hack.. two gotos... oh my... *but it works*
-//LordHavoc: rewrote bsp type detection, added mcbsp support and rewrote message extraction to do proper worldspawn parsing
+//LordHavoc: rewrote bsp type detection, rewrote message extraction to do proper worldspawn parsing
 //LordHavoc: added .ent file loading, and redesigned error handling to still try the .ent file even if the map format is not recognized, this also eliminated one goto
 //LordHavoc: FIXME: man this GetMapList is STILL ugly code even after my cleanups...
 qboolean GetMapList (const char *s, char *completedname, int completednamebufferlength)
 {
        fssearch_t      *t;
-       char            message[64];
+       char            message[1024];
        int                     i, k, max, p, o, min;
        unsigned char *len;
        qfile_t         *f;
        unsigned char buf[1024];
 
-       sprintf(message, "maps/%s*.bsp", s);
+       dpsnprintf(message, sizeof(message), "maps/%s*.bsp", s);
        t = FS_Search(message, 1, true);
        if(!t)
                return false;
@@ -1600,16 +1626,6 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer
                                        lumplen = LittleLong(header->lumps[Q2LUMP_ENTITIES].filelen);
                                }
                        }
-                       else if (!memcmp(buf, "MCBSPpad", 8))
-                       {
-                               p = LittleLong(((int *)buf)[2]);
-                               if (p == MCBSPVERSION)
-                               {
-                                       int numhulls = LittleLong(((int *)buf)[3]);
-                                       lumpofs = LittleLong(((int *)buf)[3 + numhulls + LUMP_ENTITIES*2+0]);
-                                       lumplen = LittleLong(((int *)buf)[3 + numhulls + LUMP_ENTITIES*2+1]);
-                               }
-                       }
                        else if((p = LittleLong(((int *)buf)[0])) == BSPVERSION || p == 30)
                        {
                                dheader_t *header = (dheader_t *)buf;
@@ -1670,7 +1686,6 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer
                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;
                }
@@ -1773,7 +1788,6 @@ void SanitizeString(char *in, char *out)
        }
        *out = 0;
 }
-int Sbar_GetPlayer (int index); // <- safety?
 
 // Now it becomes TRICKY :D --blub
 static char Nicks_list[MAX_SCOREBOARD][MAX_SCOREBOARDNAME];    // contains the nicks with colors and all that
@@ -1818,15 +1832,15 @@ int Nicks_strncasecmp(char *a, char *b, unsigned int a_len)
                        return Nicks_strncasecmp_nospaces(a, b, a_len);
                return strncasecmp(a, b, a_len);
        }
-       
+
        space_char = (con_nickcompletion_flags.integer & NICKS_NO_SPACES) ? 'a' : ' ';
-       
+
        // ignore non alphanumerics of B
        // if A contains a non-alphanumeric, B must contain it as well though!
        while(a_len)
        {
                qboolean alnum_a, alnum_b;
-               
+
                if(tolower(*a) == tolower(*b))
                {
                        if(*a == 0) // end of both strings, they're equal
@@ -1863,33 +1877,30 @@ int Nicks_CompleteCountPossible(char *line, int pos, char *s, qboolean isCon)
        int match;
        int spos;
        int count = 0;
-       
+
        if(!con_nickcompletion.integer)
                return 0;
 
        // changed that to 1
        if(!line[0])// || !line[1]) // we want at least... 2 written characters
                return 0;
-       
+
        for(i = 0; i < cl.maxclients; ++i)
        {
-               /*p = Sbar_GetPlayer(i);
-               if(p < 0)
-               break;*/
                p = i;
                if(!cl.scores[p].name[0])
                        continue;
 
                SanitizeString(cl.scores[p].name, name);
                //Con_Printf("Sanitized: %s^7 -> %s", cl.scores[p].name, name);
-               
+
                if(!name[0])
                        continue;
-               
+
                length = strlen(name);
                match = -1;
                spos = pos - 1; // no need for a minimum of characters :)
-               
+
                while(spos >= 0 && (spos - pos) < length) // search-string-length < name length
                {
                        if(spos > 0 && line[spos-1] != ' ' && line[spos-1] != ';' && line[spos-1] != '\"' && line[spos-1] != '\'')
@@ -1918,7 +1929,7 @@ int Nicks_CompleteCountPossible(char *line, int pos, char *s, qboolean isCon)
                {
                        Nicks_matchpos = match;
                }
-               
+
                Nicks_offset[count] = s - (&line[match]);
                //Con_Printf("offset for %s: %i\n", name, Nicks_offset[count]);
 
@@ -1945,7 +1956,7 @@ void Nicks_CutMatchesNormal(int count)
                l = strlen(Nicks_sanlist[i]) - 1;
                if(l < c)
                        c = l;
-               
+
                for(l = 0; l <= c; ++l)
                        if(tolower(Nicks_sanlist[0][l]) != tolower(Nicks_sanlist[i][l]))
                        {
@@ -1980,7 +1991,7 @@ void Nicks_CutMatchesAlphaNumeric(int count)
        char tempstr[sizeof(Nicks_sanlist[0])];
        char *a, *b;
        char space_char = (con_nickcompletion_flags.integer & NICKS_NO_SPACES) ? 'a' : ' '; // yes this is correct, we want NO spaces when no spaces
-       
+
        c = strlen(Nicks_sanlist[0]);
        for(i = 0, l = 0; i < (int)c; ++i)
        {
@@ -1992,7 +2003,7 @@ void Nicks_CutMatchesAlphaNumeric(int count)
                }
        }
        tempstr[l] = 0;
-       
+
        for(i = 1; i < count; ++i)
        {
                a = tempstr;
@@ -2038,7 +2049,7 @@ void Nicks_CutMatchesNoSpaces(int count)
        unsigned int c, l;
        char tempstr[sizeof(Nicks_sanlist[0])];
        char *a, *b;
-       
+
        c = strlen(Nicks_sanlist[0]);
        for(i = 0, l = 0; i < (int)c; ++i)
        {
@@ -2048,7 +2059,7 @@ void Nicks_CutMatchesNoSpaces(int count)
                }
        }
        tempstr[l] = 0;
-       
+
        for(i = 1; i < count; ++i)
        {
                a = tempstr;
@@ -2108,7 +2119,7 @@ const char **Nicks_CompleteBuildList(int count)
                buf[bpos] = Nicks_sanlist[bpos] + Nicks_offset[bpos];
 
        Nicks_CutMatches(count);
-       
+
        buf[bpos] = NULL;
        return buf;
 }
@@ -2118,14 +2129,14 @@ int Nicks_AddLastColor(char *buffer, int pos)
        qboolean quote_added = false;
        int match;
        char color = '7';
-       
+
        if(con_nickcompletion_flags.integer & NICKS_ADD_QUOTE && buffer[Nicks_matchpos-1] == '\"')
        {
                // we'll have to add a quote :)
                buffer[pos++] = '\"';
                quote_added = true;
        }
-       
+
        if((!quote_added && con_nickcompletion_flags.integer & NICKS_ADD_COLOR) || con_nickcompletion_flags.integer & NICKS_FORCE_COLOR)
        {
                // add color when no quote was added, or when flags &4?
@@ -2156,7 +2167,7 @@ int Nicks_CompleteChatLine(char *buffer, size_t size, unsigned int pos)
        {
                size_t len;
                char *msg;
-               
+
                msg = Nicks_list[0];
                len = min(size - Nicks_matchpos - 3, strlen(msg));
                memcpy(&buffer[Nicks_matchpos], msg, len);
@@ -2204,8 +2215,8 @@ void Con_CompleteCommandLine (void)
        char command[512];
        int c, v, a, i, cmd_len, pos, k;
        int n; // nicks --blub
-       const char *space;
-       
+       const char *space, *patterns;
+
        //find what we want to complete
        pos = key_linepos;
        while(--pos)
@@ -2224,7 +2235,12 @@ void Con_CompleteCommandLine (void)
        if(space && pos == (space - key_lines[edit_line]) + 1)
        {
                strlcpy(command, key_lines[edit_line] + 1, min(sizeof(command), (unsigned int)(space - key_lines[edit_line])));
-               if(!strcmp(command, "map") || !strcmp(command, "changelevel"))
+
+               patterns = Cvar_VariableString(va("con_completion_%s", command)); // TODO maybe use a better place for this?
+               if(patterns && !*patterns)
+                       patterns = NULL; // get rid of the empty string
+
+               if(!strcmp(command, "map") || !strcmp(command, "changelevel") || (patterns && !strcmp(patterns, "map")))
                {
                        //maps search
                        char t[MAX_QPATH];
@@ -2246,96 +2262,147 @@ void Con_CompleteCommandLine (void)
                }
                else
                {
-                       const char *patterns = Cvar_VariableString(va("con_completion_%s", command)); // TODO maybe use a better place for this?
-                       char t[MAX_QPATH];
-                       stringlist_t resultbuf;
-
-                       // Usage:
-                       //   // store completion patterns (space separated) for command foo in con_completion_foo
-                       //   set con_completion_foo "foodata/*.foodefault *.foo"
-                       //   foo <TAB>
-                       //
-                       // Note: patterns with slash are always treated as absolute
-                       // patterns; patterns without slash search in the innermost
-                       // directory the user specified. There is no way to "complete into"
-                       // a directory as of now, as directories seem to be unknown to the
-                       // FS subsystem.
-                       //
-                       // Examples:
-                       //   set con_completion_playermodel "models/player/*.zym models/player/*.md3 models/player/*.psk models/player/*.dpm"
-                       //   set con_completion_playdemo "*.dem"
-                       //   set con_completion_play "*.wav *.ogg"
-                       //
-                       // TODO somehow add support for directories; these shall complete
-                       // to their name + an appended slash.
-
-                       stringlistinit(&resultbuf);
-                       while(COM_ParseToken_Simple(&patterns, false, false))
+                       if(patterns)
                        {
-                               fssearch_t *search;
-                               if(strchr(com_token, '/'))
+                               char t[MAX_QPATH];
+                               stringlist_t resultbuf, dirbuf;
+
+                               // Usage:
+                               //   // store completion patterns (space separated) for command foo in con_completion_foo
+                               //   set con_completion_foo "foodata/*.foodefault *.foo"
+                               //   foo <TAB>
+                               //
+                               // Note: patterns with slash are always treated as absolute
+                               // patterns; patterns without slash search in the innermost
+                               // directory the user specified. There is no way to "complete into"
+                               // a directory as of now, as directories seem to be unknown to the
+                               // FS subsystem.
+                               //
+                               // Examples:
+                               //   set con_completion_playermodel "models/player/*.zym models/player/*.md3 models/player/*.psk models/player/*.dpm"
+                               //   set con_completion_playdemo "*.dem"
+                               //   set con_completion_play "*.wav *.ogg"
+                               //
+                               // TODO somehow add support for directories; these shall complete
+                               // to their name + an appended slash.
+
+                               stringlistinit(&resultbuf);
+                               stringlistinit(&dirbuf);
+                               while(COM_ParseToken_Simple(&patterns, false, false))
                                {
-                                       search = FS_Search(com_token, true, true);
+                                       fssearch_t *search;
+                                       if(strchr(com_token, '/'))
+                                       {
+                                               search = FS_Search(com_token, true, true);
+                                       }
+                                       else
+                                       {
+                                               const char *slash = strrchr(s, '/');
+                                               if(slash)
+                                               {
+                                                       strlcpy(t, s, min(sizeof(t), (unsigned int)(slash - s + 2))); // + 2, because I want to include the slash
+                                                       strlcat(t, com_token, sizeof(t));
+                                                       search = FS_Search(t, true, true);
+                                               }
+                                               else
+                                                       search = FS_Search(com_token, true, true);
+                                       }
+                                       if(search)
+                                       {
+                                               for(i = 0; i < search->numfilenames; ++i)
+                                                       if(!strncmp(search->filenames[i], s, strlen(s)))
+                                                               if(FS_FileType(search->filenames[i]) == FS_FILETYPE_FILE)
+                                                                       stringlistappend(&resultbuf, search->filenames[i]);
+                                               FS_FreeSearch(search);
+                                       }
                                }
-                               else
+
+                               // In any case, add directory names
                                {
+                                       fssearch_t *search;
                                        const char *slash = strrchr(s, '/');
                                        if(slash)
                                        {
                                                strlcpy(t, s, min(sizeof(t), (unsigned int)(slash - s + 2))); // + 2, because I want to include the slash
-                                               strlcat(t, com_token, sizeof(t));
+                                               strlcat(t, "*", sizeof(t));
                                                search = FS_Search(t, true, true);
                                        }
                                        else
-                                               search = FS_Search(com_token, true, true);
-                               }
-                               if(search)
-                               {
-                                       for(i = 0; i < search->numfilenames; ++i)
-                                               if(!strncmp(search->filenames[i], s, strlen(s)))
-                                                       stringlistappend(&resultbuf, search->filenames[i]);
-                                       FS_FreeSearch(search);
-                               }
-                       }
-                       
-                       if(resultbuf.numstrings > 0)
-                       {
-                               const char *p, *q;
-                               if(resultbuf.numstrings == 1)
-                               {
-                                       dpsnprintf(t, sizeof(t), "%s ", resultbuf.strings[0]);
+                                               search = FS_Search("*", true, true);
+                                       if(search)
+                                       {
+                                               for(i = 0; i < search->numfilenames; ++i)
+                                                       if(!strncmp(search->filenames[i], s, strlen(s)))
+                                                               if(FS_FileType(search->filenames[i]) == FS_FILETYPE_DIRECTORY)
+                                                                       stringlistappend(&dirbuf, search->filenames[i]);
+                                               FS_FreeSearch(search);
+                                       }
                                }
-                               else
+
+                               if(resultbuf.numstrings > 0 || dirbuf.numstrings > 0)
                                {
-                                       stringlistsort(&resultbuf);
-                                       Con_Printf("\n%i possible filenames\n", resultbuf.numstrings);
-                                       for(i = 0; i < resultbuf.numstrings; ++i)
+                                       const char *p, *q;
+                                       unsigned int matchchars;
+                                       if(resultbuf.numstrings == 0 && dirbuf.numstrings == 1)
                                        {
-                                               Con_Printf("%s\n", resultbuf.strings[i]);
+                                               dpsnprintf(t, sizeof(t), "%s/", dirbuf.strings[0]);
+                                       }
+                                       else
+                                       if(resultbuf.numstrings == 1 && dirbuf.numstrings == 0)
+                                       {
+                                               dpsnprintf(t, sizeof(t), "%s ", resultbuf.strings[0]);
+                                       }
+                                       else
+                                       {
+                                               stringlistsort(&resultbuf); // dirbuf is already sorted
+                                               Con_Printf("\n%i possible filenames\n", resultbuf.numstrings + dirbuf.numstrings);
+                                               for(i = 0; i < dirbuf.numstrings; ++i)
+                                               {
+                                                       Con_Printf("%s/\n", dirbuf.strings[i]);
+                                               }
+                                               for(i = 0; i < resultbuf.numstrings; ++i)
+                                               {
+                                                       Con_Printf("%s\n", resultbuf.strings[i]);
+                                               }
+                                               matchchars = sizeof(t) - 1;
+                                               if(resultbuf.numstrings > 0)
+                                               {
+                                                       p = resultbuf.strings[0];
+                                                       q = resultbuf.strings[resultbuf.numstrings - 1];
+                                                       for(; *p && *p == *q; ++p, ++q);
+                                                       matchchars = (unsigned int)(p - resultbuf.strings[0]);
+                                               }
+                                               if(dirbuf.numstrings > 0)
+                                               {
+                                                       p = dirbuf.strings[0];
+                                                       q = dirbuf.strings[dirbuf.numstrings - 1];
+                                                       for(; *p && *p == *q; ++p, ++q);
+                                                       matchchars = min(matchchars, (unsigned int)(p - dirbuf.strings[0]));
+                                               }
+                                               // now p points to the first non-equal character, or to the end
+                                               // of resultbuf.strings[0]. We want to append the characters
+                                               // from resultbuf.strings[0] to (not including) p as these are
+                                               // the unique prefix
+                                               strlcpy(t, (resultbuf.numstrings > 0 ? resultbuf : dirbuf).strings[0], min(matchchars + 1, sizeof(t)));
                                        }
-                                       p = resultbuf.strings[0];
-                                       q = resultbuf.strings[resultbuf.numstrings - 1];
-                                       for(; *p && *p == *q; ++p, ++q);
-                                       // now p points to the first non-equal character, or to the end
-                                       // of resultbuf.strings[0]. We want to append the characters
-                                       // from resultbuf.strings[0] to (not including) p as these are
-                                       // the unique prefix
-                                       strlcpy(t, resultbuf.strings[0], min((unsigned int)(p - resultbuf.strings[0] + 1), sizeof(t)));
-                               }
 
-                               // first move the cursor
-                               key_linepos += (int)strlen(t) - (int)strlen(s);
+                                       // first move the cursor
+                                       key_linepos += (int)strlen(t) - (int)strlen(s);
 
-                               // and now do the actual work
-                               *s = 0;
-                               strlcat(key_lines[edit_line], t, MAX_INPUTLINE);
-                               strlcat(key_lines[edit_line], s2, MAX_INPUTLINE); //add back chars after cursor
+                                       // and now do the actual work
+                                       *s = 0;
+                                       strlcat(key_lines[edit_line], t, MAX_INPUTLINE);
+                                       strlcat(key_lines[edit_line], s2, MAX_INPUTLINE); //add back chars after cursor
 
-                               // and fix the cursor
-                               if(key_linepos > (int) strlen(key_lines[edit_line]))
-                                       key_linepos = (int) strlen(key_lines[edit_line]);
+                                       // and fix the cursor
+                                       if(key_linepos > (int) strlen(key_lines[edit_line]))
+                                               key_linepos = (int) strlen(key_lines[edit_line]);
+                               }
+                               stringlistfreecontents(&resultbuf);
+                               stringlistfreecontents(&dirbuf);
+
+                               return; // bail out, when we complete for a command that wants a file name
                        }
-                       stringlistfreecontents(&resultbuf);
                }
        }
 
@@ -2366,7 +2433,7 @@ void Con_CompleteCommandLine (void)
        }
 
        if (!(c + v + a + n))   // No possible matches
-       {               
+       {
                if(s2[0])
                        strlcpy(&key_lines[edit_line][key_linepos], s2, sizeof(key_lines[edit_line]) - key_linepos);
                return;
@@ -2380,7 +2447,7 @@ void Con_CompleteCommandLine (void)
                cmd = *(list[2] = Cmd_CompleteAliasBuildList(s));
        if (n)
                cmd = *(list[3] = Nicks_CompleteBuildList(n));
-       
+
        for (cmd_len = (int)strlen(s);;cmd_len++)
        {
                const char **l;