]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
svvm_cmds: Implement built-in #352 (registercommand) for SSQC
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index 29eef47b443ea40389d77f2985c6b32426e53fd6..eca5bf3d2bbf788e3ec7cd85eea0751f56c6d6ea 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;
@@ -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
        {
@@ -192,7 +198,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 +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);
@@ -381,7 +387,7 @@ void Cbuf_InsertText (cmd_state_t *cmd, const char *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
        {
@@ -417,7 +423,7 @@ static void Cbuf_Execute_Deferred (cmd_buf_t *cbuf)
                current->delay -= eat;
                if(current->delay <= 0)
                {
-                       cbuf->size += current->size;
+                       cbuf->size += current->length;
                        List_Move(pos, &cbuf->start);
                        // We must return and come back next frame or the engine will freeze. Fragile... like glass :3
                        return;
@@ -1500,7 +1506,7 @@ static void Cmd_List_f (cmd_state_t *cmd)
        }
 
        count = 0;
-       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
+       for (func = cmd->userdefined->qc_functions; func; func = func->next)
        {
                if (partial && (ispattern ? !matchpattern_with_separator(func->name, partial, false, "", false) : strncmp(partial, func->name, len)))
                        continue;
@@ -1568,7 +1574,7 @@ static void Cmd_Apropos_f(cmd_state_t *cmd)
                        }
                }
        }
-       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
+       for (func = cmd->userdefined->qc_functions; func; func = func->next)
        {
                if (!matchpattern_with_separator(func->name, partial, true, "", false))
                        if (!matchpattern_with_separator(func->description, partial, true, "", false))
@@ -1604,7 +1610,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;
@@ -1867,12 +1875,12 @@ void Cmd_AddCommand(int flags, const char *cmd_name, xcommand_t function, const
                        }
                        else
                        {
-                               // mark csqcfunc if the function already exists in the csqc_functions list
-                               for (func = cmd->userdefined->csqc_functions; func; func = func->next)
+                               // mark qcfunc if the function already exists in the qc_functions list
+                               for (func = cmd->userdefined->qc_functions; func; func = func->next)
                                {
                                        if (!strcmp(cmd_name, func->name))
                                        {
-                                               func->csqcfunc = true; //[515]: csqc
+                                               func->qcfunc = true; //[515]: csqc
                                                continue;
                                        }
                                }
@@ -1882,18 +1890,18 @@ void Cmd_AddCommand(int flags, const char *cmd_name, xcommand_t function, const
                                func->name = cmd_name;
                                func->function = function;
                                func->description = description;
-                               func->csqcfunc = true; //[515]: csqc
-                               func->next = cmd->userdefined->csqc_functions;
+                               func->qcfunc = true; //[515]: csqc
+                               func->next = cmd->userdefined->qc_functions;
                                func->autofunc = false;
 
                                // insert it at the right alphanumeric position
-                               for (prev = NULL, current = cmd->userdefined->csqc_functions; current && strcmp(current->name, func->name) < 0; prev = current, current = current->next)
+                               for (prev = NULL, current = cmd->userdefined->qc_functions; current && strcmp(current->name, func->name) < 0; prev = current, current = current->next)
                                        ;
                                if (prev) {
                                        prev->next = func;
                                }
                                else {
-                                       cmd->userdefined->csqc_functions = func;
+                                       cmd->userdefined->qc_functions = func;
                                }
                                func->next = current;
                        }
@@ -1915,7 +1923,7 @@ qbool Cmd_Exists (cmd_state_t *cmd, const char *cmd_name)
 {
        cmd_function_t  *func;
 
-       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
+       for (func = cmd->userdefined->qc_functions; func; func = func->next)
                if (!strcmp(cmd_name, func->name))
                        return true;
 
@@ -1943,7 +1951,7 @@ const char *Cmd_CompleteCommand (cmd_state_t *cmd, const char *partial)
                return NULL;
 
 // check functions
-       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
+       for (func = cmd->userdefined->qc_functions; func; func = func->next)
                if (!strncasecmp(partial, func->name, len))
                        return func->name;
 
@@ -1976,7 +1984,7 @@ int Cmd_CompleteCountPossible (cmd_state_t *cmd, const char *partial)
                return 0;
 
        // Loop through the command list and count all partial matches
-       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
+       for (func = cmd->userdefined->qc_functions; func; func = func->next)
                if (!strncasecmp(partial, func->name, len))
                        h++;
 
@@ -2007,7 +2015,7 @@ const char **Cmd_CompleteBuildList (cmd_state_t *cmd, const char *partial)
        len = strlen(partial);
        buf = (const char **)Mem_Alloc(tempmempool, sizeofbuf + sizeof (const char *));
        // Loop through the functions lists and print all matches
-       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
+       for (func = cmd->userdefined->qc_functions; func; func = func->next)
                if (!strncasecmp(partial, func->name, len))
                        buf[bpos++] = func->name;
        for (func = cmd->engine_functions; func; func = func->next)
@@ -2024,7 +2032,7 @@ void Cmd_CompleteCommandPrint (cmd_state_t *cmd, const char *partial)
        cmd_function_t *func;
        size_t len = strlen(partial);
        // Loop through the command list and print all matches
-       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
+       for (func = cmd->userdefined->qc_functions; func; func = func->next)
                if (!strncasecmp(partial, func->name, len))
                        Con_Printf("^2%s^7: %s\n", func->name, func->description);
        for (func = cmd->engine_functions; func; func = func->next)
@@ -2133,7 +2141,7 @@ const char **Cmd_CompleteAliasBuildList (cmd_state_t *cmd, const char *partial)
 void Cmd_ClearCSQCCommands (cmd_state_t *cmd)
 {
        cmd_function_t *func;
-       cmd_function_t **next = &cmd->userdefined->csqc_functions;
+       cmd_function_t **next = &cmd->userdefined->qc_functions;
        
        while(*next)
        {
@@ -2170,13 +2178,17 @@ void Cmd_ExecuteString (cmd_state_t *cmd, const char *text, cmd_source_t src, qb
                goto done; // no tokens
 
 // check functions
-       for (func = cmd->userdefined->csqc_functions; func; func = func->next)
+       for (func = cmd->userdefined->qc_functions; func; func = func->next)
        {
                if (!strcasecmp(cmd->argv[0], func->name))
                {
-                       if (func->csqcfunc && CL_VM_ConsoleCommand(text))       //[515]: csqc
-                               goto done;
-                       break;
+                       if(func->qcfunc)
+                       {
+                               if((func->flags & CF_CLIENT) && CL_VM_ConsoleCommand(text))
+                                       goto done;
+                               else if((func->flags & CF_SERVER) && SV_VM_ConsoleCommand(text))
+                                       goto done;
+                       }
                }
        }
 
@@ -2268,7 +2280,7 @@ void Cmd_SaveInitState(void)
                cmd_state_t *cmd = cmd_iter->cmd;
                cmd_function_t *f;
                cmd_alias_t *a;
-               for (f = cmd->userdefined->csqc_functions; f; f = f->next)
+               for (f = cmd->userdefined->qc_functions; f; f = f->next)
                        f->initstate = true;
                for (f = cmd->engine_functions; f; f = f->next)
                        f->initstate = true;
@@ -2289,7 +2301,7 @@ void Cmd_RestoreInitState(void)
                cmd_state_t *cmd = cmd_iter->cmd;
                cmd_function_t *f, **fp;
                cmd_alias_t *a, **ap;
-               for (fp = &cmd->userdefined->csqc_functions; (f = *fp);)
+               for (fp = &cmd->userdefined->qc_functions; (f = *fp);)
                {
                        if (f->initstate)
                                fp = &f->next;