]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
Refactored lightmap update handling and added cvars to replace gl_nopartialtextureupd...
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index 6ef52f52f26b2c2430f0889dce4aea9475976318..722d1477ad9e1f03ad1ba0b6993b7a61e03ea743 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -88,35 +88,40 @@ static void Cmd_Defer_f (cmd_state_t *cmd)
 
        if(Cmd_Argc(cmd) == 1)
        {
-               if(List_IsEmpty(&cbuf->deferred))
+               if(List_Is_Empty(&cbuf->deferred))
                        Con_Printf("No commands are pending.\n");
                else
                {
                        llist_t *pos;
-               List_ForEach(pos, &cbuf->deferred)
+               List_For_Each(pos, &cbuf->deferred)
                {
-                               current = List_Container(*pos, cmd_input_t, list);
+                               current = List_Entry(*pos, cmd_input_t, list);
                                Con_Printf("-> In %9.2f: %s\n", current->delay, current->text);
                        }
                }
        }
        else if(Cmd_Argc(cmd) == 2 && !strcasecmp("clear", Cmd_Argv(cmd, 1)))
        {
-               while(!List_IsEmpty(&cbuf->deferred))
+               while(!List_Is_Empty(&cbuf->deferred))
                        List_Move_Tail(cbuf->deferred.next, &cbuf->free);
        }
        else if(Cmd_Argc(cmd) == 3)
        {
                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
        {
@@ -182,9 +187,9 @@ static cmd_input_t *Cbuf_LinkGet(cmd_buf_t *cbuf, cmd_input_t *existing)
        cmd_input_t *ret = NULL;
        if(existing && existing->pending)
                ret = existing;
-       else if(!List_IsEmpty(&cbuf->free))
+       else if(!List_Is_Empty(&cbuf->free))
        {
-               ret = List_Container(*cbuf->free.next, cmd_input_t, list);
+               ret = List_Entry(*cbuf->free.next, cmd_input_t, list);
                ret->length = 0;
                ret->pending = false;
        }
@@ -358,8 +363,8 @@ void Cbuf_AddText (cmd_state_t *cmd, const char *text)
                Con_Print("Cbuf_AddText: overflow\n");
        else
        {
-               Cbuf_LinkCreate(cmd, &llist, (List_IsEmpty(&cbuf->start) ? NULL : List_Container(*cbuf->start.prev, cmd_input_t, list)), text);
-               if(!List_IsEmpty(&llist))
+               Cbuf_LinkCreate(cmd, &llist, (List_Is_Empty(&cbuf->start) ? NULL : List_Entry(*cbuf->start.prev, cmd_input_t, list)), text);
+               if(!List_Is_Empty(&llist))
                        List_Splice_Tail(&llist, &cbuf->start);
        }
        Cbuf_Unlock(cbuf);
@@ -382,12 +387,12 @@ 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
        {
-               Cbuf_LinkCreate(cmd, &llist, List_Container(*cbuf->start.next, cmd_input_t, list), text);
-               if(!List_IsEmpty(&llist))
+               Cbuf_LinkCreate(cmd, &llist, List_Entry(*cbuf->start.next, cmd_input_t, list), text);
+               if(!List_Is_Empty(&llist))
                        List_Splice(&llist, &cbuf->start);
        }
 
@@ -412,13 +417,13 @@ static void Cbuf_Execute_Deferred (cmd_buf_t *cbuf)
                return;
        cbuf->deferred_oldtime = host.realtime;
 
-    List_ForEach(pos, &cbuf->deferred)
+    List_For_Each(pos, &cbuf->deferred)
        {
-               current = List_Container(*pos, cmd_input_t, list);
+               current = List_Entry(*pos, cmd_input_t, list);
                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;
@@ -441,14 +446,14 @@ void Cbuf_Execute (cmd_buf_t *cbuf)
        // LadyHavoc: making sure the tokenizebuffer doesn't get filled up by repeated crashes
        cbuf->tokenizebufferpos = 0;
 
-       while (!List_IsEmpty(&cbuf->start))
+       while (!List_Is_Empty(&cbuf->start))
        {
                /*
                 * 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
                 */
-               current = List_Container(*cbuf->start.next, cmd_input_t, list);
+               current = List_Entry(*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);
@@ -1501,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;
@@ -1569,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))
@@ -1756,6 +1761,7 @@ static void Cmd_TokenizeString (cmd_state_t *cmd, const char *text)
 
        cmd->argc = 0;
        cmd->args = NULL;
+       cmd->cmdline = NULL;
 
        while (1)
        {
@@ -1779,6 +1785,8 @@ static void Cmd_TokenizeString (cmd_state_t *cmd, const char *text)
                if (!*text)
                        return;
 
+               if(!cmd->argc)
+                       cmd->cmdline = text;
                if (cmd->argc == 1)
                        cmd->args = text;
 
@@ -1870,33 +1878,34 @@ 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;
                                        }
                                }
 
 
                                func = (cmd_function_t *)Mem_Alloc(cmd->mempool, sizeof(cmd_function_t));
+                               func->flags = flags;
                                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;
                        }
@@ -1918,7 +1927,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;
 
@@ -1946,7 +1955,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;
 
@@ -1979,7 +1988,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++;
 
@@ -2010,7 +2019,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)
@@ -2027,7 +2036,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)
@@ -2136,7 +2145,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)
        {
@@ -2173,13 +2182,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;
+                       }
                }
        }
 
@@ -2271,7 +2284,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;
@@ -2292,7 +2305,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;