]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
fix rtlights cubemapname load/save
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index fdd51bba4a590187400c770c916fbf189cc4432d..47a4692848f7363e2c4c3c89c6a697013a5d2c14 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -36,6 +36,10 @@ static qboolean cmd_wait;
 
 static mempool_t *cmd_mempool;
 
+#define CMD_TOKENIZELENGTH 4096
+static char cmd_tokenizebuffer[CMD_TOKENIZELENGTH];
+static int cmd_tokenizebufferpos = 0;
+
 //=============================================================================
 
 /*
@@ -145,6 +149,9 @@ void Cbuf_Execute (void)
        char line[1024];
        int quotes;
 
+       // LordHavoc: making sure the tokenizebuffer doesn't get filled up by repeated crashes
+       cmd_tokenizebufferpos = 0;
+
        while (cmd_text.cursize)
        {
 // find a \n or ; line break
@@ -293,7 +300,7 @@ static void Cmd_Exec_f (void)
                Con_Printf ("couldn't exec %s\n",Cmd_Argv(1));
                return;
        }
-       Con_Printf ("execing %s\n",Cmd_Argv(1));
+       Con_DPrintf ("execing %s\n",Cmd_Argv(1));
 
        Cbuf_InsertText (f);
        Mem_Free(f);
@@ -370,18 +377,18 @@ static void Cmd_Alias_f (void)
                a->next = cmd_alias;
                cmd_alias = a;
        }
-       strcpy (a->name, s);
+       strlcpy (a->name, s, sizeof (a->name));
 
 // copy the rest of the command line
        cmd[0] = 0;             // start out with a null string
        c = Cmd_Argc();
        for (i=2 ; i< c ; i++)
        {
-               strcat (cmd, Cmd_Argv(i));
+               strlcat (cmd, Cmd_Argv(i), sizeof (cmd));
                if (i != c)
-                       strcat (cmd, " ");
+                       strlcat (cmd, " ", sizeof (cmd));
        }
-       strcat (cmd, "\n");
+       strlcat (cmd, "\n", sizeof (cmd));
 
        a->value = CopyString (cmd);
 }
@@ -512,9 +519,6 @@ const char *Cmd_Args (void)
 }
 
 
-#define CMD_TOKENIZELENGTH 4096
-char cmd_tokenizebuffer[CMD_TOKENIZELENGTH];
-
 /*
 ============
 Cmd_TokenizeString
@@ -525,22 +529,19 @@ Parses the given string into command line tokens.
 static void Cmd_TokenizeString (const char *text)
 {
        int l;
-       int pos;
-       pos = 0;
 
        cmd_argc = 0;
        cmd_args = NULL;
 
        while (1)
        {
-// skip whitespace up to a /n
+               // skip whitespace up to a /n
                while (*text && *text <= ' ' && *text != '\n')
-               {
                        text++;
-               }
 
                if (*text == '\n')
-               {       // a newline seperates commands in the buffer
+               {
+                       // a newline seperates commands in the buffer
                        text++;
                        break;
                }
@@ -551,17 +552,17 @@ static void Cmd_TokenizeString (const char *text)
                if (cmd_argc == 1)
                         cmd_args = text;
 
-               if (!COM_ParseToken (&text))
+               if (!COM_ParseTokenConsole(&text))
                        return;
 
                if (cmd_argc < MAX_ARGS)
                {
                        l = strlen(com_token) + 1;
-                       if (pos + l > CMD_TOKENIZELENGTH)
+                       if (cmd_tokenizebufferpos + l > CMD_TOKENIZELENGTH)
                                Sys_Error("Cmd_TokenizeString: ran out of %i character buffer space for command arguements\n", CMD_TOKENIZELENGTH);
-                       strcpy (cmd_tokenizebuffer + pos, com_token);
-                       cmd_argv[cmd_argc] = cmd_tokenizebuffer + pos;
-                       pos += l;
+                       strcpy (cmd_tokenizebuffer + cmd_tokenizebufferpos, com_token);
+                       cmd_argv[cmd_argc] = cmd_tokenizebuffer + cmd_tokenizebufferpos;
+                       cmd_tokenizebufferpos += l;
                        cmd_argc++;
                }
        }
@@ -793,39 +794,54 @@ FIXME: lookupnoadd the token to speed search?
 */
 void Cmd_ExecuteString (const char *text, cmd_source_t src)
 {
+       int oldpos;
        cmd_function_t *cmd;
        cmdalias_t *a;
 
+       oldpos = cmd_tokenizebufferpos;
        cmd_source = src;
        Cmd_TokenizeString (text);
 
 // execute the command line
        if (!Cmd_Argc())
+       {
+               cmd_tokenizebufferpos = oldpos;
                return;         // no tokens
+       }
 
-// check functions
-       for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
+// check functions (only after host_initialized)
+       if (host_initialized || !strcasecmp(cmd_argv[0], "exec"))
        {
-               if (!strcasecmp (cmd_argv[0],cmd->name))
+               for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
                {
-                       cmd->function ();
-                       return;
+                       if (!strcasecmp (cmd_argv[0],cmd->name))
+                       {
+                               cmd->function ();
+                               cmd_tokenizebufferpos = oldpos;
+                               return;
+                       }
                }
        }
 
-// check alias
-       for (a=cmd_alias ; a ; a=a->next)
+// check alias (only after host_initialized)
+       if (host_initialized)
        {
-               if (!strcasecmp (cmd_argv[0], a->name))
+               for (a=cmd_alias ; a ; a=a->next)
                {
-                       Cbuf_InsertText (a->value);
-                       return;
+                       if (!strcasecmp (cmd_argv[0], a->name))
+                       {
+                               Cbuf_InsertText (a->value);
+                               cmd_tokenizebufferpos = oldpos;
+                               return;
+                       }
                }
        }
 
-// check cvars
-       if (!Cvar_Command ())
+// check cvars (always)
+       if (!Cvar_Command () && host_initialized)
                Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv(0));
+
+       cmd_tokenizebufferpos = oldpos;
 }
 
 
@@ -838,6 +854,7 @@ Sends the entire command line over to the server
 */
 void Cmd_ForwardToServer (void)
 {
+       char *s;
        if (cls.state != ca_connected)
        {
                Con_Printf ("Can't \"%s\", not connected\n", Cmd_Argv(0));
@@ -847,16 +864,15 @@ void Cmd_ForwardToServer (void)
        if (cls.demoplayback)
                return;         // not really connected
 
-       MSG_WriteByte (&cls.message, clc_stringcmd);
+       // LordHavoc: thanks to Fuh for bringing the pure evil of SZ_Print to my
+       // attention, it has been eradicated from here, its only (former) use in
+       // all of darkplaces.
        if (strcasecmp(Cmd_Argv(0), "cmd") != 0)
-       {
-               SZ_Print (&cls.message, Cmd_Argv(0));
-               SZ_Print (&cls.message, " ");
-       }
-       if (Cmd_Argc() > 1)
-               SZ_Print (&cls.message, Cmd_Args());
+               s = va("%s %s", Cmd_Argv(0), Cmd_Argc() > 1 ? Cmd_Args() : "\n");
        else
-               SZ_Print (&cls.message, "\n");
+               s = va("%s", Cmd_Argc() > 1 ? Cmd_Args() : "\n");
+       MSG_WriteByte(&cls.message, clc_stringcmd);
+       SZ_Write(&cls.message, s, strlen(s) + 1);
 }