]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
added new method of culling irrelevant entity collisions - a grid of areas
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index a8349082bc0b8344bcb87bf8783d9acb00f725a0..c8aa380399379b67734276ecefbd35e44bb8bc70 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -21,23 +21,20 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "quakedef.h"
 
-void Cmd_ForwardToServer (void);
-
 #define        MAX_ALIAS_NAME  32
 
 typedef struct cmdalias_s
 {
-       struct cmdalias_s       *next;
-       char    name[MAX_ALIAS_NAME];
-       char    *value;
+       struct cmdalias_s *next;
+       char name[MAX_ALIAS_NAME];
+       char *value;
 } cmdalias_t;
 
-cmdalias_t     *cmd_alias;
+static cmdalias_t *cmd_alias;
 
-int trashtest;
-int *trashspot;
+static qboolean cmd_wait;
 
-qboolean       cmd_wait;
+static mempool_t *cmd_mempool;
 
 //=============================================================================
 
@@ -50,7 +47,7 @@ next frame.  This allows commands like:
 bind g "impulse 5 ; +attack ; wait ; -attack ; impulse 2"
 ============
 */
-void Cmd_Wait_f (void)
+static void Cmd_Wait_f (void)
 {
        cmd_wait = true;
 }
@@ -63,7 +60,7 @@ void Cmd_Wait_f (void)
 =============================================================================
 */
 
-sizebuf_t      cmd_text;
+static sizebuf_t       cmd_text;
 
 /*
 ============
@@ -72,7 +69,8 @@ Cbuf_Init
 */
 void Cbuf_Init (void)
 {
-       SZ_Alloc (&cmd_text, 8192);             // space for commands and script files
+       // LordHavoc: inreased this from 8192 to 32768
+       SZ_Alloc (&cmd_text, 32768, "command buffer"); // space for commands and script files
 }
 
 
@@ -83,10 +81,10 @@ Cbuf_AddText
 Adds command text at the end of the buffer
 ============
 */
-void Cbuf_AddText (char *text)
+void Cbuf_AddText (const char *text)
 {
        int             l;
-       
+
        l = strlen (text);
 
        if (cmd_text.cursize + l >= cmd_text.maxsize)
@@ -108,7 +106,7 @@ Adds a \n to the text
 FIXME: actually change the command buffer to do less copying
 ============
 */
-void Cbuf_InsertText (char *text)
+void Cbuf_InsertText (const char *text)
 {
        char    *temp;
        int             templen;
@@ -123,10 +121,10 @@ void Cbuf_InsertText (char *text)
        }
        else
                temp = NULL;    // shut up compiler
-               
+
 // add the entire text of the file
        Cbuf_AddText (text);
-       
+
 // add the copied off data
        if (templen)
        {
@@ -142,11 +140,11 @@ Cbuf_Execute
 */
 void Cbuf_Execute (void)
 {
-       int             i;
-       char    *text;
-       char    line[1024];
-       int             quotes;
-       
+       int i;
+       char *text;
+       char line[1024];
+       int quotes;
+
        while (cmd_text.cursize)
        {
 // find a \n or ; line break
@@ -162,11 +160,10 @@ void Cbuf_Execute (void)
                        if (text[i] == '\n')
                                break;
                }
-                       
-                               
+
                memcpy (line, text, i);
                line[i] = 0;
-               
+
 // delete the text from the command buffer and move remaining commands down
 // this is necessary because commands (exec, alias) can insert data at the
 // beginning of the text buffer
@@ -182,7 +179,7 @@ void Cbuf_Execute (void)
 
 // execute the command line
                Cmd_ExecuteString (line, src_command);
-               
+
                if (cmd_wait)
                {       // skip out while text still remains in buffer, leaving it
                        // for next frame
@@ -215,7 +212,7 @@ void Cmd_StuffCmds_f (void)
        int             i, j;
        int             s;
        char    *text, *build, c;
-               
+
        if (Cmd_Argc () != 1)
        {
                Con_Printf ("stuffcmds : execute command line parameters\n");
@@ -232,7 +229,7 @@ void Cmd_StuffCmds_f (void)
        }
        if (!s)
                return;
-               
+
        text = Z_Malloc (s+1);
        text[0] = 0;
        for (i=1 ; i<com_argc ; i++)
@@ -243,11 +240,11 @@ void Cmd_StuffCmds_f (void)
                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++)
        {
                if (text[i] == '+')
@@ -259,17 +256,17 @@ void Cmd_StuffCmds_f (void)
 
                        c = text[j];
                        text[j] = 0;
-                       
+
                        strcat (build, text+i);
                        strcat (build, "\n");
                        text[j] = c;
                        i = j-1;
                }
        }
-       
+
        if (build[0])
                Cbuf_InsertText (build);
-       
+
        Z_Free (text);
        Z_Free (build);
 }
@@ -280,9 +277,9 @@ void Cmd_StuffCmds_f (void)
 Cmd_Exec_f
 ===============
 */
-void Cmd_Exec_f (void)
+static void Cmd_Exec_f (void)
 {
-       char    *f;
+       char *f;
 
        if (Cmd_Argc () != 2)
        {
@@ -290,16 +287,16 @@ void Cmd_Exec_f (void)
                return;
        }
 
-       f = (char *)COM_LoadMallocFile (Cmd_Argv(1), false);
+       f = (char *)COM_LoadFile (Cmd_Argv(1), false);
        if (!f)
        {
                Con_Printf ("couldn't exec %s\n",Cmd_Argv(1));
                return;
        }
        Con_Printf ("execing %s\n",Cmd_Argv(1));
-       
+
        Cbuf_InsertText (f);
-       qfree(f);
+       Mem_Free(f);
 }
 
 
@@ -310,10 +307,10 @@ Cmd_Echo_f
 Just prints the rest of the line to the console
 ===============
 */
-void Cmd_Echo_f (void)
+static void Cmd_Echo_f (void)
 {
        int             i;
-       
+
        for (i=1 ; i<Cmd_Argc() ; i++)
                Con_Printf ("%s ",Cmd_Argv(i));
        Con_Printf ("\n");
@@ -326,22 +323,21 @@ Cmd_Alias_f
 Creates a new command that executes a command string (possibly ; seperated)
 ===============
 */
-
-char *CopyString (char *in)
+static char *CopyString (char *in)
 {
-       char    *out;
-       
+       char *out;
+
        out = Z_Malloc (strlen(in)+1);
        strcpy (out, in);
        return out;
 }
 
-void Cmd_Alias_f (void)
+static void Cmd_Alias_f (void)
 {
        cmdalias_t      *a;
        char            cmd[1024];
        int                     i, c;
-       char            *s;
+       const char              *s;
 
        if (Cmd_Argc() == 1)
        {
@@ -374,7 +370,7 @@ void Cmd_Alias_f (void)
                a->next = cmd_alias;
                cmd_alias = a;
        }
-       strcpy (a->name, s);    
+       strcpy (a->name, s);
 
 // copy the rest of the command line
        cmd[0] = 0;             // start out with a null string
@@ -386,7 +382,7 @@ void Cmd_Alias_f (void)
                        strcat (cmd, " ");
        }
        strcat (cmd, "\n");
-       
+
        a->value = CopyString (cmd);
 }
 
@@ -400,23 +396,23 @@ void Cmd_Alias_f (void)
 
 typedef struct cmd_function_s
 {
-       struct cmd_function_s   *next;
-       char                                    *name;
-       xcommand_t                              function;
+       struct cmd_function_s *next;
+       const char *name;
+       xcommand_t function;
 } cmd_function_t;
 
 
 #define        MAX_ARGS                80
 
-static int                     cmd_argc;
-static char            *cmd_argv[MAX_ARGS];
-static char            *cmd_null_string = "";
-static char            *cmd_args = NULL;
+static int cmd_argc;
+static const char *cmd_argv[MAX_ARGS];
+static const char *cmd_null_string = "";
+static const char *cmd_args = NULL;
 
-cmd_source_t   cmd_source;
+cmd_source_t cmd_source;
 
 
-static cmd_function_t  *cmd_functions;         // possible commands to execute
+static cmd_function_t *cmd_functions;          // possible commands to execute
 
 /*
 ========
@@ -427,23 +423,26 @@ Cmd_List
 
 ========
 */
-void Cmd_List_f (void)
+static void Cmd_List_f (void)
 {
-       cmd_function_t  *cmd;
-       char                    *partial;
-       int                             len;
-       int                             count;
+       cmd_function_t *cmd;
+       const char *partial;
+       int len, count;
 
-       if (Cmd_Argc() > 1) {
+       if (Cmd_Argc() > 1)
+       {
                partial = Cmd_Argv (1);
                len = strlen(partial);
-       } else {
+       }
+       else
+       {
                partial = NULL;
                len = 0;
        }
 
        count = 0;
-       for (cmd = cmd_functions; cmd; cmd = cmd->next) {
+       for (cmd = cmd_functions; cmd; cmd = cmd->next)
+       {
                if (partial && strncmp(partial, cmd->name, len))
                        continue;
                Con_Printf ("%s\n", cmd->name);
@@ -464,6 +463,8 @@ Cmd_Init
 */
 void Cmd_Init (void)
 {
+       cmd_mempool = Mem_AllocPool("commands");
+
 //
 // register our commands
 //
@@ -493,11 +494,11 @@ int               Cmd_Argc (void)
 Cmd_Argv
 ============
 */
-char   *Cmd_Argv (int arg)
+const char *Cmd_Argv (int arg)
 {
        if (arg >= cmd_argc )
                return cmd_null_string;
-       return cmd_argv[arg];   
+       return cmd_argv[arg];
 }
 
 /*
@@ -505,12 +506,15 @@ char      *Cmd_Argv (int arg)
 Cmd_Args
 ============
 */
-char   *Cmd_Args (void)
+const char *Cmd_Args (void)
 {
        return cmd_args;
 }
 
 
+#define CMD_TOKENIZELENGTH 4096
+char cmd_tokenizebuffer[CMD_TOKENIZELENGTH];
+
 /*
 ============
 Cmd_TokenizeString
@@ -518,17 +522,15 @@ Cmd_TokenizeString
 Parses the given string into command line tokens.
 ============
 */
-void Cmd_TokenizeString (char *text)
+static void Cmd_TokenizeString (const char *text)
 {
-       int             i;
-       
-// clear the args from the last string
-       for (i=0 ; i<cmd_argc ; i++)
-               Z_Free (cmd_argv[i]);
-               
+       int l;
+       int pos;
+       pos = 0;
+
        cmd_argc = 0;
        cmd_args = NULL;
-       
+
        while (1)
        {
 // skip whitespace up to a /n
@@ -536,7 +538,7 @@ void Cmd_TokenizeString (char *text)
                {
                        text++;
                }
-               
+
                if (*text == '\n')
                {       // a newline seperates commands in the buffer
                        text++;
@@ -545,22 +547,25 @@ void Cmd_TokenizeString (char *text)
 
                if (!*text)
                        return;
-       
+
                if (cmd_argc == 1)
                         cmd_args = text;
-                       
-               text = COM_Parse (text);
-               if (!text)
+
+               if (!COM_ParseToken (&text))
                        return;
 
                if (cmd_argc < MAX_ARGS)
                {
-                       cmd_argv[cmd_argc] = Z_Malloc (strlen(com_token)+1);
-                       strcpy (cmd_argv[cmd_argc], com_token);
+                       l = strlen(com_token) + 1;
+                       if (pos + 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;
                        cmd_argc++;
                }
        }
-       
+
 }
 
 
@@ -569,20 +574,17 @@ void Cmd_TokenizeString (char *text)
 Cmd_AddCommand
 ============
 */
-void   Cmd_AddCommand (char *cmd_name, xcommand_t function)
+void Cmd_AddCommand (const char *cmd_name, xcommand_t function)
 {
-       cmd_function_t  *cmd;
-       
-       if (host_initialized)   // because hunk allocation would get stomped
-               Sys_Error ("Cmd_AddCommand after host_initialized");
-               
+       cmd_function_t *cmd;
+
 // 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);
                return;
        }
-       
+
 // fail if the command already exists
        for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
        {
@@ -593,7 +595,7 @@ void        Cmd_AddCommand (char *cmd_name, xcommand_t function)
                }
        }
 
-       cmd = Hunk_AllocName (sizeof(cmd_function_t), "commands");
+       cmd = Mem_Alloc(cmd_mempool, sizeof(cmd_function_t));
        cmd->name = cmd_name;
        cmd->function = function;
        cmd->next = cmd_functions;
@@ -605,36 +607,33 @@ void      Cmd_AddCommand (char *cmd_name, xcommand_t function)
 Cmd_Exists
 ============
 */
-qboolean       Cmd_Exists (char *cmd_name)
+qboolean Cmd_Exists (const char *cmd_name)
 {
        cmd_function_t  *cmd;
 
        for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
-       {
                if (!strcmp (cmd_name,cmd->name))
                        return true;
-       }
 
        return false;
 }
 
 
-
 /*
 ============
 Cmd_CompleteCommand
 ============
 */
-char *Cmd_CompleteCommand (char *partial)
+const char *Cmd_CompleteCommand (const char *partial)
 {
-       cmd_function_t  *cmd;
-       int                             len;
-       
+       cmd_function_t *cmd;
+       int len;
+
        len = strlen(partial);
-       
+
        if (!len)
                return NULL;
-               
+
 // check functions
        for (cmd = cmd_functions; cmd; cmd = cmd->next)
                if (!strncmp(partial, cmd->name, len))
@@ -652,19 +651,17 @@ char *Cmd_CompleteCommand (char *partial)
        Thanks to taniwha
 
 */
-int
-Cmd_CompleteCountPossible (char *partial)
+int Cmd_CompleteCountPossible (const char *partial)
 {
-       cmd_function_t  *cmd;
-       int                             len;
-       int                             h;
-       
+       cmd_function_t *cmd;
+       int len, h;
+
        h = 0;
        len = strlen(partial);
-       
+
        if (!len)
                return 0;
-       
+
        // Loop through the command list and count all partial matches
        for (cmd = cmd_functions; cmd; cmd = cmd->next)
                if (!strncasecmp(partial, cmd->name, len))
@@ -682,17 +679,16 @@ Cmd_CompleteCountPossible (char *partial)
        Thanks to taniwha
 
 */
-char   **
-Cmd_CompleteBuildList (char *partial)
+const char **Cmd_CompleteBuildList (const char *partial)
 {
-       cmd_function_t  *cmd;
-       int                             len = 0;
-       int                             bpos = 0;
-       int                             sizeofbuf = (Cmd_CompleteCountPossible (partial) + 1) * sizeof (char *);
-       char                    **buf;
+       cmd_function_t *cmd;
+       int len = 0;
+       int bpos = 0;
+       int sizeofbuf = (Cmd_CompleteCountPossible (partial) + 1) * sizeof (const char *);
+       const char **buf;
 
        len = strlen(partial);
-       buf = malloc(sizeofbuf + sizeof (char *));
+       buf = Mem_Alloc(tempmempool, sizeofbuf + sizeof (const char *));
        // Loop through the alias list and print all matches
        for (cmd = cmd_functions; cmd; cmd = cmd->next)
                if (!strncasecmp(partial, cmd->name, len))
@@ -711,11 +707,10 @@ Cmd_CompleteBuildList (char *partial)
        Thanks to taniwha
 
 */
-char
-*Cmd_CompleteAlias (char * partial)
+const char *Cmd_CompleteAlias (const char *partial)
 {
-       cmdalias_t      *alias;
-       int                     len;
+       cmdalias_t *alias;
+       int len;
 
        len = strlen(partial);
 
@@ -739,8 +734,7 @@ char
        Thanks to taniwha
 
 */
-int
-Cmd_CompleteAliasCountPossible (char *partial)
+int Cmd_CompleteAliasCountPossible (const char *partial)
 {
        cmdalias_t      *alias;
        int                     len;
@@ -770,17 +764,16 @@ Cmd_CompleteAliasCountPossible (char *partial)
        Thanks to taniwha
 
 */
-char   **
-Cmd_CompleteAliasBuildList (char *partial)
+const char **Cmd_CompleteAliasBuildList (const char *partial)
 {
-       cmdalias_t      *alias;
-       int                     len = 0;
-       int                     bpos = 0;
-       int                     sizeofbuf = (Cmd_CompleteAliasCountPossible (partial) + 1) * sizeof (char *);
-       char            **buf;
+       cmdalias_t *alias;
+       int len = 0;
+       int bpos = 0;
+       int sizeofbuf = (Cmd_CompleteAliasCountPossible (partial) + 1) * sizeof (const char *);
+       const char **buf;
 
        len = strlen(partial);
-       buf = malloc(sizeofbuf + sizeof (char *));
+       buf = Mem_Alloc(tempmempool, sizeofbuf + sizeof (const char *));
        // Loop through the alias list and print all matches
        for (alias = cmd_alias; alias; alias = alias->next)
                if (!strncasecmp(partial, alias->name, len))
@@ -798,14 +791,14 @@ A complete command line has been parsed, so try to execute it
 FIXME: lookupnoadd the token to speed search?
 ============
 */
-void   Cmd_ExecuteString (char *text, cmd_source_t src)
-{      
-       cmd_function_t  *cmd;
-       cmdalias_t              *a;
+void Cmd_ExecuteString (const char *text, cmd_source_t src)
+{
+       cmd_function_t *cmd;
+       cmdalias_t *a;
 
        cmd_source = src;
        Cmd_TokenizeString (text);
-                       
+
 // execute the command line
        if (!Cmd_Argc())
                return;         // no tokens
@@ -829,11 +822,10 @@ void      Cmd_ExecuteString (char *text, cmd_source_t src)
                        return;
                }
        }
-       
+
 // check cvars
        if (!Cvar_Command ())
                Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv(0));
-       
 }
 
 
@@ -851,7 +843,7 @@ void Cmd_ForwardToServer (void)
                Con_Printf ("Can't \"%s\", not connected\n", Cmd_Argv(0));
                return;
        }
-       
+
        if (cls.demoplayback)
                return;         // not really connected
 
@@ -877,17 +869,17 @@ where the given parameter apears, or 0 if not present
 ================
 */
 
-int Cmd_CheckParm (char *parm)
+int Cmd_CheckParm (const char *parm)
 {
        int i;
-       
+
        if (!parm)
                Sys_Error ("Cmd_CheckParm: NULL");
 
        for (i = 1; i < Cmd_Argc (); i++)
                if (!Q_strcasecmp (parm, Cmd_Argv (i)))
                        return i;
-                       
+
        return 0;
 }