]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
changed a lot of Con_DPrint/Con_DPrintf calls to Con_Print/Con_Printf (non-technical...
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index 0fa4a3a23acef1f17b65503c6f6d193415b54f9a..fe455296ef4fc3278ac270e7308ebcd0c1ae95f7 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -93,7 +93,7 @@ void Cbuf_AddText (const char *text)
 
        if (cmd_text.cursize + l >= cmd_text.maxsize)
        {
-               Con_Print("Cbuf_AddText: overflow\n");
+               Con_Print("Cbuf_AddText: overflow\n");
                return;
        }
 
@@ -115,25 +115,25 @@ void Cbuf_InsertText (const char *text)
        char    *temp;
        int             templen;
 
-// copy off any commands still remaining in the exec buffer
+       // copy off any commands still remaining in the exec buffer
        templen = cmd_text.cursize;
        if (templen)
        {
-               temp = Z_Malloc (templen);
+               temp = Mem_Alloc (tempmempool, templen);
                memcpy (temp, cmd_text.data, templen);
                SZ_Clear (&cmd_text);
        }
        else
-               temp = NULL;    // shut up compiler
+               temp = NULL;
 
-// add the entire text of the file
+       // add the entire text of the file
        Cbuf_AddText (text);
 
-// add the copied off data
-       if (templen)
+       // add the copied off data
+       if (temp != NULL)
        {
                SZ_Write (&cmd_text, temp, templen);
-               Z_Free (temp);
+               Mem_Free (temp);
        }
 }
 
@@ -164,7 +164,7 @@ void Cbuf_Execute (void)
                                quotes++;
                        if ( !(quotes&1) &&  text[i] == ';')
                                break;  // don't break if inside a quoted string
-                       if (text[i] == '\n')
+                       if (text[i] == '\r' || text[i] == '\n')
                                break;
                }
 
@@ -181,7 +181,7 @@ void Cbuf_Execute (void)
                {
                        i++;
                        cmd_text.cursize -= i;
-                       memcpy (text, text+i, cmd_text.cursize);
+                       memcpy (cmd_text.data, text+i, cmd_text.cursize);
                }
 
 // execute the command line
@@ -216,66 +216,45 @@ quake -nosound +cmd amlev1
 */
 void Cmd_StuffCmds_f (void)
 {
-       int             i, j;
-       int             s;
-       char    *text, *build, c;
+       int             i, j, l;
+       // this is per command, and bounds checked (no buffer overflows)
+       char    build[2048];
 
        if (Cmd_Argc () != 1)
        {
-               Con_Printf ("stuffcmds : execute command line parameters\n");
-               return;
-       }
-
-// build the combined string to parse from
-       s = 0;
-       for (i=1 ; i<com_argc ; i++)
-       {
-               if (!com_argv[i])
-                       continue;               // NEXTSTEP nulls out -NXHost
-               s += strlen (com_argv[i]) + 1;
-       }
-       if (!s)
+               Con_Print("stuffcmds : execute command line parameters\n");
                return;
-
-       text = Z_Malloc (s+1);
-       text[0] = 0;
-       for (i=1 ; i<com_argc ; i++)
-       {
-               if (!com_argv[i])
-                       continue;               // NEXTSTEP nulls out -NXHost
-               strcat (text,com_argv[i]);
-               if (i != com_argc-1)
-                       strcat (text, " ");
        }
 
-// pull out the commands
-       build = Z_Malloc (s+1);
-       build[0] = 0;
-
-       for (i=0 ; i<s-1 ; i++)
+       for (i = 0;i < com_argc;i++)
        {
-               if (text[i] == '+')
+               if (com_argv[i] && com_argv[i][0] == '+' && (com_argv[i][1] < '0' || com_argv[i][1] > '9'))
                {
+                       l = 0;
+                       j = 1;
+                       while (com_argv[i][j])
+                               build[l++] = com_argv[i][j++];
                        i++;
-
-                       for (j=i ; (text[j] != '+') && (text[j] != '-') && (text[j] != 0) ; j++)
-                               ;
-
-                       c = text[j];
-                       text[j] = 0;
-
-                       strcat (build, text+i);
-                       strcat (build, "\n");
-                       text[j] = c;
-                       i = j-1;
+                       for (;i < com_argc;i++)
+                       {
+                               if (!com_argv[i])
+                                       continue;
+                               if ((com_argv[i][0] == '+' || com_argv[i][0] == '-') && (com_argv[i][1] < '0' || com_argv[i][1] > '9'))
+                                       break;
+                               if (l + strlen(com_argv[i]) + 5 > sizeof(build))
+                                       break;
+                               build[l++] = ' ';
+                               build[l++] = '\"';
+                               for (j = 0;com_argv[i][j];j++)
+                                       build[l++] = com_argv[i][j];
+                               build[l++] = '\"';
+                       }
+                       build[l++] = '\n';
+                       build[l++] = 0;
+                       Cbuf_InsertText (build);
+                       i--;
                }
        }
-
-       if (build[0])
-               Cbuf_InsertText (build);
-
-       Z_Free (text);
-       Z_Free (build);
 }
 
 
@@ -290,17 +269,17 @@ static void Cmd_Exec_f (void)
 
        if (Cmd_Argc () != 2)
        {
-               Con_Print("exec <filename> : execute a script file\n");
+               Con_Print("exec <filename> : execute a script file\n");
                return;
        }
 
-       f = (char *)FS_LoadFile (Cmd_Argv(1), false);
+       f = (char *)FS_LoadFile (Cmd_Argv(1), tempmempool, false);
        if (!f)
        {
-               Con_Printf ("couldn't exec %s\n",Cmd_Argv(1));
+               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);
@@ -319,8 +298,8 @@ static void Cmd_Echo_f (void)
        int             i;
 
        for (i=1 ; i<Cmd_Argc() ; i++)
-               Con_Printf ("%s ",Cmd_Argv(i));
-       Con_Print("\n");
+               Con_Printf("%s ",Cmd_Argv(i));
+       Con_Print("\n");
 }
 
 /*
@@ -330,15 +309,6 @@ Cmd_Alias_f
 Creates a new command that executes a command string (possibly ; seperated)
 ===============
 */
-static char *CopyString (char *in)
-{
-       char *out;
-
-       out = Z_Malloc (strlen(in)+1);
-       strcpy (out, in);
-       return out;
-}
-
 static void Cmd_Alias_f (void)
 {
        cmdalias_t      *a;
@@ -348,16 +318,16 @@ static void Cmd_Alias_f (void)
 
        if (Cmd_Argc() == 1)
        {
-               Con_Print("Current alias commands:\n");
+               Con_Print("Current alias commands:\n");
                for (a = cmd_alias ; a ; a=a->next)
-                       Con_Printf ("%s : %s\n", a->name, a->value);
+                       Con_Printf("%s : %s\n", a->name, a->value);
                return;
        }
 
        s = Cmd_Argv(1);
        if (strlen(s) >= MAX_ALIAS_NAME)
        {
-               Con_Print("Alias name is too long\n");
+               Con_Print("Alias name is too long\n");
                return;
        }
 
@@ -377,20 +347,21 @@ 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);
+       a->value = Z_Malloc (strlen (cmd) + 1);
+       strcpy (a->value, cmd);
 }
 
 /*
@@ -452,15 +423,15 @@ static void Cmd_List_f (void)
        {
                if (partial && strncmp(partial, cmd->name, len))
                        continue;
-               Con_Printf ("%s\n", cmd->name);
+               Con_Printf("%s\n", cmd->name);
                count++;
        }
 
-       Con_Printf ("%i Command%s", count, (count > 1) ? "s" : "");
+       Con_Printf("%i Command%s", count, (count > 1) ? "s" : "");
        if (partial)
                Con_Printf(" beginning with \"%s\"", partial);
 
-       Con_Print("\n\n");
+       Con_Print("\n\n");
 }
 
 /*
@@ -470,7 +441,7 @@ Cmd_Init
 */
 void Cmd_Init (void)
 {
-       cmd_mempool = Mem_AllocPool("commands");
+       cmd_mempool = Mem_AllocPool("commands", 0, NULL);
 
 //
 // register our commands
@@ -484,6 +455,8 @@ void Cmd_Init (void)
        Cmd_AddCommand ("cmdlist", Cmd_List_f);         // Added/Modified by EvilTypeGuy eviltypeguy@qeradiant.com
        Cmd_AddCommand ("cvarlist", Cvar_List_f);       // 2000-01-09 CmdList, CvarList commands
                                                                                                // By Matthias "Maddes" Buecher
+       Cmd_AddCommand ("set", Cvar_Set_f);
+       Cmd_AddCommand ("seta", Cvar_SetA_f);
 }
 
 /*
@@ -552,7 +525,7 @@ 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)
@@ -582,7 +555,7 @@ void Cmd_AddCommand (const char *cmd_name, xcommand_t function)
 // fail if the command is a variable name
        if (Cvar_VariableString(cmd_name)[0])
        {
-               Con_Printf ("Cmd_AddCommand: %s already defined as a var\n", cmd_name);
+               Con_Printf("Cmd_AddCommand: %s already defined as a var\n", cmd_name);
                return;
        }
 
@@ -591,7 +564,7 @@ void Cmd_AddCommand (const char *cmd_name, xcommand_t function)
        {
                if (!strcmp (cmd_name, cmd->name))
                {
-                       Con_Printf ("Cmd_AddCommand: %s already defined\n", cmd_name);
+                       Con_Printf("Cmd_AddCommand: %s already defined\n", cmd_name);
                        return;
                }
        }
@@ -809,31 +782,37 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src)
                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") || !strcasecmp(cmd_argv[0], "set") || !strcasecmp(cmd_argv[0], "seta"))
        {
-               if (!strcasecmp (cmd_argv[0],cmd->name))
+               for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
                {
-                       cmd->function ();
-                       cmd_tokenizebufferpos = oldpos;
-                       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);
-                       cmd_tokenizebufferpos = oldpos;
-                       return;
+                       if (!strcasecmp (cmd_argv[0], a->name))
+                       {
+                               Cbuf_InsertText (a->value);
+                               cmd_tokenizebufferpos = oldpos;
+                               return;
+                       }
                }
        }
 
-// check cvars
-       if (!Cvar_Command ())
-               Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv(0));
+// check cvars (always)
+       if (!Cvar_Command () && host_initialized)
+               Con_Printf("Unknown command \"%s\"\n", Cmd_Argv(0));
 
        cmd_tokenizebufferpos = oldpos;
 }
@@ -841,32 +820,44 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src)
 
 /*
 ===================
-Cmd_ForwardToServer
+Cmd_ForwardStringToServer
 
-Sends the entire command line over to the server
+Sends an entire command string over to the server, unprocessed
 ===================
 */
-void Cmd_ForwardToServer (void)
+void Cmd_ForwardStringToServer (const char *s)
 {
        if (cls.state != ca_connected)
        {
-               Con_Printf ("Can't \"%s\", not connected\n", Cmd_Argv(0));
+               Con_Printf("Can't \"%s\", not connected\n", s);
                return;
        }
 
        if (cls.demoplayback)
                return;         // not really connected
 
-       MSG_WriteByte (&cls.message, clc_stringcmd);
-       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());
+       // 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.
+       MSG_WriteByte(&cls.message, clc_stringcmd);
+       SZ_Write(&cls.message, s, strlen(s) + 1);
+}
+
+/*
+===================
+Cmd_ForwardToServer
+
+Sends the entire command line over to the server
+===================
+*/
+void Cmd_ForwardToServer (void)
+{
+       const char *s;
+       if (strcasecmp(Cmd_Argv(0), "cmd"))
+               s = va("%s %s", Cmd_Argv(0), Cmd_Argc() > 1 ? Cmd_Args() : "");
        else
-               SZ_Print (&cls.message, "\n");
+               s = Cmd_Argc() > 1 ? Cmd_Args() : "";
+       Cmd_ForwardStringToServer(s);
 }