From: divverent Date: Sun, 4 May 2008 15:32:45 +0000 (+0000) Subject: fixes to "defer": Crash on Windows (non-ANSI C printf string), and order of execution... X-Git-Tag: xonotic-v0.1.0preview~2254 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=commitdiff_plain;h=a5f135cd8d88b7bfb35d35975f81bff90f2ccd81 fixes to "defer": Crash on Windows (non-ANSI C printf string), and order of execution of defers at the same time git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8276 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/cmd.c b/cmd.c index 5d9b0a89..dff6762e 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;