]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
cmd: Update defer command to allocate the same as Cmd_ParseText
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index e92c1340ff5f876ea6f5559a565c29f31073b817..aa6eea8307482f735d5cdbe4af84e830489d8768 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -41,18 +41,19 @@ static cmd_iter_t cmd_iter_all[] = {
        {NULL},
 };
 
+mempool_t *cbuf_mempool;
 
 // we only run the +whatever commandline arguments once
 qbool host_stuffcmdsrun = false;
 
 //=============================================================================
 
-void Cbuf_Lock(cbuf_t *cbuf)
+void Cbuf_Lock(cmd_buf_t *cbuf)
 {
        Thread_LockMutex(cbuf->lock);
 }
 
-void Cbuf_Unlock(cbuf_t *cbuf)
+void Cbuf_Unlock(cmd_buf_t *cbuf)
 {
        Thread_UnlockMutex(cbuf->lock);
 }
@@ -79,11 +80,11 @@ Cmd_Defer_f
 Cause a command to be executed after a delay.
 ============
 */
-static cmd_input_t *Cbuf_LinkGet(cbuf_t *cbuf, cmd_input_t *existing);
+static cmd_input_t *Cbuf_LinkGet(cmd_buf_t *cbuf, cmd_input_t *existing);
 static void Cmd_Defer_f (cmd_state_t *cmd)
 {
        cmd_input_t *current;
-       cbuf_t *cbuf = cmd->cbuf;
+       cmd_buf_t *cbuf = cmd->cbuf;
 
        if(Cmd_Argc(cmd) == 1)
        {
@@ -108,14 +109,19 @@ static void Cmd_Defer_f (cmd_state_t *cmd)
        {
                const char *text = Cmd_Argv(cmd, 2);
                current = Cbuf_LinkGet(cbuf, NULL);
-               current->size = strlen(text);
+               current->length = strlen(text);
                current->source = cmd;
                current->delay = atof(Cmd_Argv(cmd, 1));
 
-               memcpy(current->text, text, current->size + 1);
+               if(current->size < current->length)
+               {
+                       current->text = (char *)Mem_Realloc(cbuf_mempool, current->text, current->length + 1);
+                       current->size = current->length;
+               }
 
-               List_Move_Tail(&current->list, &cbuf->deferred);
+               strlcpy(current->text, text, current->length + 1);
 
+               List_Move_Tail(&current->list, &cbuf->deferred);
        }
        else
        {
@@ -176,7 +182,7 @@ static void Cmd_Centerprint_f (cmd_state_t *cmd)
 =============================================================================
 */
 
-static cmd_input_t *Cbuf_LinkGet(cbuf_t *cbuf, cmd_input_t *existing)
+static cmd_input_t *Cbuf_LinkGet(cmd_buf_t *cbuf, cmd_input_t *existing)
 {
        cmd_input_t *ret = NULL;
        if(existing && existing->pending)
@@ -192,7 +198,7 @@ static cmd_input_t *Cbuf_LinkGet(cbuf_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 +295,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);
@@ -309,7 +315,7 @@ static size_t Cmd_ParseInput (cmd_input_t **output, char **input)
 static void Cbuf_LinkCreate(cmd_state_t *cmd, llist_t *head, cmd_input_t *existing, const char *text)
 {
        char *in = (char *)&text[0];
-       cbuf_t *cbuf = cmd->cbuf;
+       cmd_buf_t *cbuf = cmd->cbuf;
        size_t totalsize = 0, newsize = 0;
        cmd_input_t *current = NULL;
 
@@ -348,7 +354,7 @@ Adds command text at the end of the buffer
 void Cbuf_AddText (cmd_state_t *cmd, const char *text)
 {
        size_t l = strlen(text);
-       cbuf_t *cbuf = cmd->cbuf;
+       cmd_buf_t *cbuf = cmd->cbuf;
        llist_t llist = {&llist, &llist};
 
        Cbuf_Lock(cbuf);
@@ -374,19 +380,20 @@ FIXME: actually change the command buffer to do less copying
 */
 void Cbuf_InsertText (cmd_state_t *cmd, const char *text)
 {
-       cbuf_t *cbuf = cmd->cbuf;
+       cmd_buf_t *cbuf = cmd->cbuf;
        llist_t llist = {&llist, &llist};
        size_t l = strlen(text);
 
        Cbuf_Lock(cbuf);
 
        // we need to memmove the existing text and stuff this in before it...
-       if (cbuf->size + l >= (size_t)cbuf->maxsize)
+       if (cbuf->size + l >= cbuf->maxsize)
                Con_Print("Cbuf_InsertText: overflow\n");
        else
        {
                Cbuf_LinkCreate(cmd, &llist, List_Container(*cbuf->start.next, cmd_input_t, list), text);
-               List_Splice(&llist, &cbuf->start);
+               if(!List_IsEmpty(&llist))
+                       List_Splice(&llist, &cbuf->start);
        }
 
        Cbuf_Unlock(cbuf);
@@ -397,7 +404,7 @@ void Cbuf_InsertText (cmd_state_t *cmd, const char *text)
 Cbuf_Execute_Deferred --blub
 ============
 */
-static void Cbuf_Execute_Deferred (cbuf_t *cbuf)
+static void Cbuf_Execute_Deferred (cmd_buf_t *cbuf)
 {
        llist_t *pos;
        cmd_input_t *current;
@@ -430,7 +437,7 @@ Cbuf_Execute
 ============
 */
 static qbool Cmd_PreprocessString(cmd_state_t *cmd, const char *intext, char *outtext, unsigned maxoutlen, cmd_alias_t *alias );
-void Cbuf_Execute (cbuf_t *cbuf)
+void Cbuf_Execute (cmd_buf_t *cbuf)
 {
        cmd_input_t *current;
        char preprocessed[MAX_INPUTLINE];
@@ -447,7 +454,10 @@ void Cbuf_Execute (cbuf_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
@@ -472,9 +482,6 @@ void Cbuf_Execute (cbuf_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)
@@ -489,7 +496,7 @@ void Cbuf_Execute (cbuf_t *cbuf)
        }
 }
 
-void Cbuf_Frame(cbuf_t *cbuf)
+void Cbuf_Frame(cmd_buf_t *cbuf)
 {
        Cbuf_Execute_Deferred(cbuf);
        if (cbuf->size)
@@ -523,10 +530,6 @@ static void Cmd_StuffCmds_f (cmd_state_t *cmd)
        int             i, j, l;
        // this is for all commandline options combined (and is bounds checked)
        char    build[MAX_INPUTLINE];
-       
-       // come back later so we don't crash
-       if(host.state == host_init)
-               return;
 
        if (Cmd_Argc (cmd) != 1)
        {
@@ -1607,7 +1610,9 @@ Cmd_Init
 void Cmd_Init(void)
 {
        cmd_iter_t *cmd_iter;
-       cbuf_t *cbuf = (cbuf_t *)Z_Malloc(sizeof(cbuf_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;
@@ -1909,30 +1914,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
@@ -1940,11 +1921,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
@@ -1953,10 +1943,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;
 }
 
@@ -2176,12 +2178,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)
                        {
@@ -2201,6 +2210,7 @@ void Cmd_ExecuteString (cmd_state_t *cmd, const char *text, cmd_source_t src, qb
                                        goto done;
                                }
                        }
+                       break;
                }
        }