]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
cl_main: Disconnect only if we're connected or playing a demo. Fixes Steel Storm...
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index 3b3fdfd146745b184669b9952f337763517363a8..6ef52f52f26b2c2430f0889dce4aea9475976318 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -41,6 +41,7 @@ static cmd_iter_t cmd_iter_all[] = {
        {NULL},
 };
 
+mempool_t *cbuf_mempool;
 
 // we only run the +whatever commandline arguments once
 qbool host_stuffcmdsrun = false;
@@ -192,7 +193,7 @@ static cmd_input_t *Cbuf_LinkGet(cmd_buf_t *cbuf, cmd_input_t *existing)
 
 static cmd_input_t *Cmd_AllocInputNode(void)
 {
-       cmd_input_t *node = (cmd_input_t *)Z_Malloc(sizeof(cmd_input_t));
+       cmd_input_t *node = (cmd_input_t *)Mem_Alloc(cbuf_mempool, sizeof(cmd_input_t));
        node->list.prev = node->list.next = &node->list;
        node->size = node->length = node->pending = 0;
        return node;
@@ -289,10 +290,10 @@ static size_t Cmd_ParseInput (cmd_input_t **output, char **input)
 
                (*output)->length += cmdsize;
 
-               if((*output)->size < (*output)->length + 1)
+               if((*output)->size < (*output)->length)
                {
-                       (*output)->text = (char *)Mem_Realloc(tempmempool, (*output)->text, (*output)->size + cmdsize + 1);
-                       (*output)->size = (*output)->length + 1;
+                       (*output)->text = (char *)Mem_Realloc(cbuf_mempool, (*output)->text, (*output)->length + 1);
+                       (*output)->size = (*output)->length;
                }
 
                strlcpy(&(*output)->text[offset], &(*input)[start], cmdsize + 1);
@@ -448,7 +449,10 @@ void Cbuf_Execute (cmd_buf_t *cbuf)
                 * can insert data at the beginning of the text buffer
                 */
                current = List_Container(*cbuf->start.next, cmd_input_t, list);
-
+               
+               // Recycle memory so using WASD doesn't cause a malloc and free
+               List_Move_Tail(&current->list, &cbuf->free);
+               
                /*
                 * Assume we're rolling with the current command-line and
                 * always set this false because alias expansion or cbuf insertion
@@ -473,9 +477,6 @@ void Cbuf_Execute (cmd_buf_t *cbuf)
                        Cmd_ExecuteString (current->source, current->text, src_local, false);
                }
 
-               // Recycle memory so using WASD doesn't cause a malloc and free
-               List_Move_Tail(&current->list, &cbuf->free);
-
                current = NULL;
 
                if (cbuf->wait)
@@ -1604,7 +1605,9 @@ Cmd_Init
 void Cmd_Init(void)
 {
        cmd_iter_t *cmd_iter;
-       cmd_buf_t *cbuf = (cmd_buf_t *)Z_Malloc(sizeof(cmd_buf_t));
+       cmd_buf_t *cbuf;
+       cbuf_mempool = Mem_AllocPool("Command buffer", 0, NULL);
+       cbuf = (cmd_buf_t *)Mem_Alloc(cbuf_mempool, sizeof(cmd_buf_t));
        cbuf->maxsize = 655360;
        cbuf->lock = Thread_CreateMutex();
        cbuf->wait = false;
@@ -1906,30 +1909,6 @@ next:
        }
 }
 
-static int Cmd_Compare(const char *s1, const char *s2, size_t len, qbool casesensitive)
-{
-       if(len)
-               return (casesensitive ? strncmp(s1, s2, len) : strncasecmp(s1, s2, len));
-       else
-               return (casesensitive ? strcmp(s1, s2) : strcasecmp(s1, s2));
-}
-
-cmd_function_t *Cmd_GetCommand(cmd_state_t *cmd, const char *partial, size_t len, qbool casesensitive)
-{
-       cmd_function_t *func = NULL;
-
-       // check functions
-       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
-               if (!Cmd_Compare(partial, func->name, len, casesensitive))
-                       break;
-
-       for (func=cmd->engine_functions ; func ; func=func->next)
-               if (!Cmd_Compare(partial, func->name, len, casesensitive))
-                       break;
-
-       return func;
-}
-
 /*
 ============
 Cmd_Exists
@@ -1937,11 +1916,20 @@ Cmd_Exists
 */
 qbool Cmd_Exists (cmd_state_t *cmd, const char *cmd_name)
 {
-       if(Cmd_GetCommand(cmd, cmd_name, 0, true))
-               return true;
+       cmd_function_t  *func;
+
+       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
+               if (!strcmp(cmd_name, func->name))
+                       return true;
+
+       for (func=cmd->engine_functions ; func ; func=func->next)
+               if (!strcmp (cmd_name,func->name))
+                       return true;
+
        return false;
 }
 
+
 /*
 ============
 Cmd_CompleteCommand
@@ -1950,10 +1938,22 @@ Cmd_CompleteCommand
 const char *Cmd_CompleteCommand (cmd_state_t *cmd, const char *partial)
 {
        cmd_function_t *func;
+       size_t len;
+
+       len = strlen(partial);
+
+       if (!len)
+               return NULL;
+
+// check functions
+       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
+               if (!strncasecmp(partial, func->name, len))
+                       return func->name;
+
+       for (func = cmd->engine_functions; func; func = func->next)
+               if (!strncasecmp(partial, func->name, len))
+                       return func->name;
 
-       func = Cmd_GetCommand(cmd, partial, strlen(partial), false);
-       if(func)
-               return func->name;
        return NULL;
 }
 
@@ -2173,12 +2173,19 @@ void Cmd_ExecuteString (cmd_state_t *cmd, const char *text, cmd_source_t src, qb
                goto done; // no tokens
 
 // check functions
-       func = Cmd_GetCommand(cmd, cmd->argv[0], 0, false);
-       if(func)
+       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
        {
-               if (func->csqcfunc && CL_VM_ConsoleCommand(text))       //[515]: csqc
-                       goto done;
-               else
+               if (!strcasecmp(cmd->argv[0], func->name))
+               {
+                       if (func->csqcfunc && CL_VM_ConsoleCommand(text))       //[515]: csqc
+                               goto done;
+                       break;
+               }
+       }
+
+       for (func = cmd->engine_functions; func; func=func->next)
+       {
+               if (!strcasecmp (cmd->argv[0], func->name))
                {
                        switch (src)
                        {
@@ -2198,6 +2205,7 @@ void Cmd_ExecuteString (cmd_state_t *cmd, const char *text, cmd_source_t src, qb
                                        goto done;
                                }
                        }
+                       break;
                }
        }