version 1.11, 2013/03/22 15:49:55 |
version 1.12, 2013/03/24 09:54:10 |
|
|
#include "tmux.h" |
#include "tmux.h" |
|
|
struct cmd_list * |
struct cmd_list * |
cmd_list_parse(int argc, char **argv, char **cause) |
cmd_list_parse(int argc, char **argv, const char* file, u_int line, |
|
char **cause) |
{ |
{ |
struct cmd_list *cmdlist; |
struct cmd_list *cmdlist; |
struct cmd *cmd; |
struct cmd *cmd; |
|
|
|
|
copy_argv = cmd_copy_argv(argc, argv); |
copy_argv = cmd_copy_argv(argc, argv); |
|
|
cmdlist = xmalloc(sizeof *cmdlist); |
cmdlist = xcalloc(1, sizeof *cmdlist); |
cmdlist->references = 1; |
cmdlist->references = 1; |
TAILQ_INIT(&cmdlist->list); |
TAILQ_INIT(&cmdlist->list); |
|
|
|
|
if (arglen != 1) |
if (arglen != 1) |
new_argc++; |
new_argc++; |
|
|
cmd = cmd_parse(new_argc, new_argv, cause); |
cmd = cmd_parse(new_argc, new_argv, file, line, cause); |
if (cmd == NULL) |
if (cmd == NULL) |
goto bad; |
goto bad; |
TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry); |
TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry); |
|
|
} |
} |
|
|
if (lastsplit != argc) { |
if (lastsplit != argc) { |
cmd = cmd_parse(argc - lastsplit, copy_argv + lastsplit, cause); |
cmd = cmd_parse(argc - lastsplit, copy_argv + lastsplit, |
|
file, line, cause); |
if (cmd == NULL) |
if (cmd == NULL) |
goto bad; |
goto bad; |
TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry); |
TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry); |
|
|
return (NULL); |
return (NULL); |
} |
} |
|
|
enum cmd_retval |
|
cmd_list_exec(struct cmd_list *cmdlist, struct cmd_ctx *ctx) |
|
{ |
|
struct client *c = ctx->curclient; |
|
struct cmd *cmd; |
|
enum cmd_retval retval; |
|
int guards, n; |
|
|
|
guards = 0; |
|
if (c != NULL && c->session != NULL) |
|
guards = c->flags & CLIENT_CONTROL; |
|
|
|
notify_disable(); |
|
|
|
retval = 0; |
|
TAILQ_FOREACH(cmd, &cmdlist->list, qentry) { |
|
if (guards) |
|
ctx->print(ctx, "%%begin"); |
|
n = cmd->entry->exec(cmd, ctx); |
|
if (guards) |
|
ctx->print(ctx, "%%end"); |
|
|
|
switch (n) |
|
{ |
|
case CMD_RETURN_ERROR: |
|
return (CMD_RETURN_ERROR); |
|
case CMD_RETURN_ATTACH: |
|
/* Client is being attached (send MSG_READY). */ |
|
retval = CMD_RETURN_ATTACH; |
|
|
|
/* |
|
* Mangle the context to treat any following commands |
|
* as if they were called from inside. |
|
*/ |
|
if (ctx->curclient == NULL) { |
|
ctx->curclient = ctx->cmdclient; |
|
ctx->cmdclient = NULL; |
|
|
|
ctx->error = key_bindings_error; |
|
ctx->print = key_bindings_print; |
|
ctx->info = key_bindings_info; |
|
} |
|
break; |
|
case CMD_RETURN_YIELD: |
|
if (retval == CMD_RETURN_NORMAL) |
|
retval = CMD_RETURN_YIELD; |
|
break; |
|
case CMD_RETURN_NORMAL: |
|
break; |
|
} |
|
} |
|
|
|
notify_enable(); |
|
return (retval); |
|
} |
|
|
|
void |
void |
cmd_list_free(struct cmd_list *cmdlist) |
cmd_list_free(struct cmd_list *cmdlist) |
{ |
{ |
struct cmd *cmd; |
struct cmd *cmd, *cmd1; |
|
|
if (--cmdlist->references != 0) |
if (--cmdlist->references != 0) |
return; |
return; |
|
|
while (!TAILQ_EMPTY(&cmdlist->list)) { |
TAILQ_FOREACH_SAFE(cmd, &cmdlist->list, qentry, cmd1) { |
cmd = TAILQ_FIRST(&cmdlist->list); |
|
TAILQ_REMOVE(&cmdlist->list, cmd, qentry); |
TAILQ_REMOVE(&cmdlist->list, cmd, qentry); |
args_free(cmd->args); |
args_free(cmd->args); |
|
free(cmd->file); |
free(cmd); |
free(cmd); |
} |
} |
|
|
free(cmdlist); |
free(cmdlist); |
} |
} |
|
|