X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=cmd.c;h=73f55456e1cb393df9737e3c7084b0d2496dcad8;hb=12d2b3a8dc431b57364f19edd060438180d6dcd2;hp=5d9b0a892a3689265a63f3f21272c58eeb15748d;hpb=ac029734277dab95241936ad14aee465e8ee70c9;p=xonotic%2Fdarkplaces.git diff --git a/cmd.c b/cmd.c index 5d9b0a89..73f55456 100644 --- 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 \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 \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));