]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
remove templights change
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index 5d9b0a892a3689265a63f3f21272c58eeb15748d..73f55456e1cb393df9737e3c7084b0d2496dcad8 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -70,7 +70,7 @@ typedef struct cmddeferred_s
        double time;
 } cmddeferred_t;
 
-static cmddeferred_t *cmd_deferred_list;
+static cmddeferred_t *cmd_deferred_list = NULL;
 
 /*
 ============
@@ -89,25 +89,44 @@ static void Cmd_Defer_f (void)
                        Con_Printf("No commands are pending.\n");
                while(next)
                {
-                       Con_Printf("-> In %'9.2f: %s\n", next->time-time, next->value);
+                       Con_Printf("-> In %9.2f: %s\n", next->time-time, next->value);
                        next = next->next;
                }
-       } else if(Cmd_Argc() != 3)
+       } else if(Cmd_Argc() == 2 && !strcasecmp("clear", Cmd_Argv(1)))
+       {
+               while(cmd_deferred_list)
+               {
+                       cmddeferred_t *cmd = cmd_deferred_list;
+                       cmd_deferred_list = cmd->next;
+                       Mem_Free(cmd->value);
+                       Mem_Free(cmd);
+               }
+       } else if(Cmd_Argc() == 3)
        {
-               Con_Printf("usage: defer <seconds> <command>\n");
-               return;
-       } else {
                const char *value = Cmd_Argv(2);
                cmddeferred_t *defcmd = (cmddeferred_t*)Mem_Alloc(tempmempool, sizeof(*defcmd));
-               unsigned int len = strlen(value);
+               size_t len = strlen(value);
 
                defcmd->time = Sys_DoubleTime() + atof(Cmd_Argv(1));
                defcmd->value = (char*)Mem_Alloc(tempmempool, len+1);
-               memcpy(defcmd->value, value, len);
-               defcmd->value[len] = 0;
+               memcpy(defcmd->value, value, len+1);
+               defcmd->next = NULL;
 
-               defcmd->next = cmd_deferred_list;
-               cmd_deferred_list = defcmd;
+               if(cmd_deferred_list)
+               {
+                       cmddeferred_t *next = cmd_deferred_list;
+                       while(next->next)
+                               next = next->next;
+                       next->next = defcmd;
+               } else
+                       cmd_deferred_list = defcmd;
+               /* Stupid me... this changes the order... so commands with the same delay go blub :S
+                 defcmd->next = cmd_deferred_list;
+                 cmd_deferred_list = defcmd;*/
+       } else {
+               Con_Printf("usage: defer <seconds> <command>\n"
+                          "       defer clear\n");
+               return;
        }
 }
 
@@ -240,18 +259,19 @@ void Cbuf_Execute_Deferred (void)
                if(cmd->time <= time)
                {
                        Cbuf_AddText(cmd->value);
+                       Cbuf_AddText(";\n");
                        Mem_Free(cmd->value);
-                       
-                       if(prev)
+
+                       if(prev) {
                                prev->next = cmd->next;
-                       else
+                               Mem_Free(cmd);
+                               cmd = prev->next;
+                       } else {
                                cmd_deferred_list = cmd->next;
-                       
-                       Mem_Free(cmd);
-                       
-                       cmd = prev;
-                       if(!cmd)
-                               return;
+                               Mem_Free(cmd);
+                               cmd = cmd_deferred_list;
+                       }
+                       continue;
                }
                prev = cmd;
                cmd = cmd->next;
@@ -692,7 +712,7 @@ static const char *Cmd_GetDirectCvarValue(const char *varname, cmdalias_t *alias
                                                *is_multiple = true;
 
                                        // kill pre-argument whitespace
-                                       for (;*p && *p <= ' ';p++)
+                                       for (;*p && ISWHITESPACE(*p);p++)
                                                ;
 
                                        return p;
@@ -806,7 +826,8 @@ static const char *Cmd_GetCvarValue(const char *var, size_t varlen, cmdalias_t *
                // Exception: $* and $n- don't use the quoted form by default
                varstr = Cmd_GetDirectCvarValue(varname, alias, &is_multiple);
                if(is_multiple)
-                       varfunc = "asis";
+                       if(!varfunc)
+                               varfunc = "asis";
        }
 
        if(!varstr)
@@ -1122,7 +1143,7 @@ static void Cmd_TokenizeString (const char *text)
        while (1)
        {
                // skip whitespace up to a /n
-               while (*text && *text <= ' ' && *text != '\r' && *text != '\n')
+               while (*text && ISWHITESPACE(*text) && *text != '\r' && *text != '\n')
                        text++;
 
                // line endings:
@@ -1448,11 +1469,13 @@ FIXME: lookupnoadd the token to speed search?
 void Cmd_ExecuteString (const char *text, cmd_source_t src)
 {
        int oldpos;
+       int found;
        cmd_function_t *cmd;
        cmdalias_t *a;
 
        oldpos = cmd_tokenizebufferpos;
        cmd_source = src;
+       found = false;
 
        Cmd_TokenizeString (text);
 
@@ -1487,8 +1510,9 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src)
                                }
                                else
                                        Con_Printf("Command \"%s\" can not be executed\n", Cmd_Argv(0));
-                               cmd_tokenizebufferpos = oldpos;
-                               return;
+                               found = true;
+                               goto command_found;
+                               break;
                        case src_client:
                                if (cmd->clientfunction)
                                {
@@ -1501,11 +1525,13 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src)
                        break;
                }
        }
+command_found:
 
        // if it's a client command and no command was found, say so.
        if (cmd_source == src_client)
        {
                Con_Printf("player \"%s\" tried to %s\n", host_client->name, text);
+               cmd_tokenizebufferpos = oldpos;
                return;
        }
 
@@ -1520,6 +1546,12 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src)
                }
        }
 
+       if(found) // if the command was hooked and found, all is good
+       {
+               cmd_tokenizebufferpos = oldpos;
+               return;
+       }
+
 // check cvars
        if (!Cvar_Command () && host_framecount > 0)
                Con_Printf("Unknown command \"%s\"\n", Cmd_Argv(0));