version 1.157, 2020/03/24 08:09:43 |
version 1.158, 2020/04/13 08:26:27 |
|
|
NULL |
NULL |
}; |
}; |
|
|
|
/* Instance of a command. */ |
|
struct cmd { |
|
const struct cmd_entry *entry; |
|
struct args *args; |
|
u_int group; |
|
|
|
char *file; |
|
u_int line; |
|
|
|
char *alias; |
|
int argc; |
|
char **argv; |
|
|
|
TAILQ_ENTRY(cmd) qentry; |
|
}; |
|
TAILQ_HEAD(cmds, cmd); |
|
|
|
/* Next group number for new command list. */ |
static u_int cmd_list_next_group = 1; |
static u_int cmd_list_next_group = 1; |
|
|
|
/* Log an argument vector. */ |
void printflike(3, 4) |
void printflike(3, 4) |
cmd_log_argv(int argc, char **argv, const char *fmt, ...) |
cmd_log_argv(int argc, char **argv, const char *fmt, ...) |
{ |
{ |
|
|
free(prefix); |
free(prefix); |
} |
} |
|
|
|
/* Prepend to an argument vector. */ |
void |
void |
cmd_prepend_argv(int *argc, char ***argv, char *arg) |
cmd_prepend_argv(int *argc, char ***argv, char *arg) |
{ |
{ |
|
|
(*argc)++; |
(*argc)++; |
} |
} |
|
|
|
/* Append to an argument vector. */ |
void |
void |
cmd_append_argv(int *argc, char ***argv, char *arg) |
cmd_append_argv(int *argc, char ***argv, char *arg) |
{ |
{ |
|
|
(*argv)[(*argc)++] = xstrdup(arg); |
(*argv)[(*argc)++] = xstrdup(arg); |
} |
} |
|
|
|
/* Pack an argument vector up into a buffer. */ |
int |
int |
cmd_pack_argv(int argc, char **argv, char *buf, size_t len) |
cmd_pack_argv(int argc, char **argv, char *buf, size_t len) |
{ |
{ |
|
|
return (0); |
return (0); |
} |
} |
|
|
|
/* Unpack an argument vector from a packed buffer. */ |
int |
int |
cmd_unpack_argv(char *buf, size_t len, int argc, char ***argv) |
cmd_unpack_argv(char *buf, size_t len, int argc, char ***argv) |
{ |
{ |
|
|
return (0); |
return (0); |
} |
} |
|
|
|
/* Copy an argument vector, ensuring it is terminated by NULL. */ |
char ** |
char ** |
cmd_copy_argv(int argc, char **argv) |
cmd_copy_argv(int argc, char **argv) |
{ |
{ |
|
|
return (new_argv); |
return (new_argv); |
} |
} |
|
|
|
/* Free an argument vector. */ |
void |
void |
cmd_free_argv(int argc, char **argv) |
cmd_free_argv(int argc, char **argv) |
{ |
{ |
|
|
free(argv); |
free(argv); |
} |
} |
|
|
|
/* Convert argument vector to a string. */ |
char * |
char * |
cmd_stringify_argv(int argc, char **argv) |
cmd_stringify_argv(int argc, char **argv) |
{ |
{ |
|
|
return (buf); |
return (buf); |
} |
} |
|
|
|
/* Get entry for command. */ |
|
const struct cmd_entry * |
|
cmd_get_entry(struct cmd *cmd) |
|
{ |
|
return (cmd->entry); |
|
} |
|
|
|
/* Get arguments for command. */ |
|
struct args * |
|
cmd_get_args(struct cmd *cmd) |
|
{ |
|
return (cmd->args); |
|
} |
|
|
|
/* Get file and line for command. */ |
|
void |
|
cmd_get_source(struct cmd *cmd, const char **file, u_int *line) |
|
{ |
|
if (file != NULL) |
|
*file = cmd->file; |
|
if (line != NULL) |
|
*line = cmd->line; |
|
} |
|
|
|
/* Look for an alias for a command. */ |
char * |
char * |
cmd_get_alias(const char *name) |
cmd_get_alias(const char *name) |
{ |
{ |
|
|
return (NULL); |
return (NULL); |
} |
} |
|
|
|
/* Look up a command entry by name. */ |
static const struct cmd_entry * |
static const struct cmd_entry * |
cmd_find(const char *name, char **cause) |
cmd_find(const char *name, char **cause) |
{ |
{ |
|
|
return (NULL); |
return (NULL); |
} |
} |
|
|
|
/* Parse a single command from an argument vector. */ |
struct cmd * |
struct cmd * |
cmd_parse(int argc, char **argv, const char *file, u_int line, char **cause) |
cmd_parse(int argc, char **argv, const char *file, u_int line, char **cause) |
{ |
{ |
|
|
return (NULL); |
return (NULL); |
} |
} |
|
|
|
/* Free a command. */ |
void |
void |
cmd_free(struct cmd *cmd) |
cmd_free(struct cmd *cmd) |
{ |
{ |
|
|
free(cmd); |
free(cmd); |
} |
} |
|
|
|
/* Get a command as a string. */ |
char * |
char * |
cmd_print(struct cmd *cmd) |
cmd_print(struct cmd *cmd) |
{ |
{ |
|
|
return (out); |
return (out); |
} |
} |
|
|
|
/* Create a new command list. */ |
struct cmd_list * |
struct cmd_list * |
cmd_list_new(void) |
cmd_list_new(void) |
{ |
{ |
|
|
cmdlist = xcalloc(1, sizeof *cmdlist); |
cmdlist = xcalloc(1, sizeof *cmdlist); |
cmdlist->references = 1; |
cmdlist->references = 1; |
cmdlist->group = cmd_list_next_group++; |
cmdlist->group = cmd_list_next_group++; |
TAILQ_INIT(&cmdlist->list); |
cmdlist->list = xcalloc(1, sizeof *cmdlist->list); |
|
TAILQ_INIT(cmdlist->list); |
return (cmdlist); |
return (cmdlist); |
} |
} |
|
|
|
/* Append a command to a command list. */ |
void |
void |
cmd_list_append(struct cmd_list *cmdlist, struct cmd *cmd) |
cmd_list_append(struct cmd_list *cmdlist, struct cmd *cmd) |
{ |
{ |
cmd->group = cmdlist->group; |
cmd->group = cmdlist->group; |
TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry); |
TAILQ_INSERT_TAIL(cmdlist->list, cmd, qentry); |
} |
} |
|
|
|
/* Move all commands from one command list to another */ |
void |
void |
cmd_list_move(struct cmd_list *cmdlist, struct cmd_list *from) |
cmd_list_move(struct cmd_list *cmdlist, struct cmd_list *from) |
{ |
{ |
struct cmd *cmd, *cmd1; |
struct cmd *cmd, *cmd1; |
|
|
TAILQ_FOREACH_SAFE(cmd, &from->list, qentry, cmd1) { |
TAILQ_FOREACH_SAFE(cmd, from->list, qentry, cmd1) { |
TAILQ_REMOVE(&from->list, cmd, qentry); |
TAILQ_REMOVE(from->list, cmd, qentry); |
TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry); |
TAILQ_INSERT_TAIL(cmdlist->list, cmd, qentry); |
} |
} |
cmdlist->group = cmd_list_next_group++; |
cmdlist->group = cmd_list_next_group++; |
} |
} |
|
|
|
/* Free a command list. */ |
void |
void |
cmd_list_free(struct cmd_list *cmdlist) |
cmd_list_free(struct cmd_list *cmdlist) |
{ |
{ |
|
|
if (--cmdlist->references != 0) |
if (--cmdlist->references != 0) |
return; |
return; |
|
|
TAILQ_FOREACH_SAFE(cmd, &cmdlist->list, qentry, cmd1) { |
TAILQ_FOREACH_SAFE(cmd, cmdlist->list, qentry, cmd1) { |
TAILQ_REMOVE(&cmdlist->list, cmd, qentry); |
TAILQ_REMOVE(cmdlist->list, cmd, qentry); |
cmd_free(cmd); |
cmd_free(cmd); |
} |
} |
|
free(cmdlist->list); |
free(cmdlist); |
free(cmdlist); |
} |
} |
|
|
|
/* Get a command list as a string. */ |
char * |
char * |
cmd_list_print(struct cmd_list *cmdlist, int escaped) |
cmd_list_print(struct cmd_list *cmdlist, int escaped) |
{ |
{ |
|
|
len = 1; |
len = 1; |
buf = xcalloc(1, len); |
buf = xcalloc(1, len); |
|
|
TAILQ_FOREACH(cmd, &cmdlist->list, qentry) { |
TAILQ_FOREACH(cmd, cmdlist->list, qentry) { |
this = cmd_print(cmd); |
this = cmd_print(cmd); |
|
|
len += strlen(this) + 4; |
len += strlen(this) + 4; |
|
|
} |
} |
|
|
return (buf); |
return (buf); |
|
} |
|
|
|
/* Get first command in list. */ |
|
struct cmd * |
|
cmd_list_first(struct cmd_list *cmdlist, u_int *group) |
|
{ |
|
struct cmd *cmd; |
|
|
|
cmd = TAILQ_FIRST(cmdlist->list); |
|
if (cmd != NULL && group != NULL) |
|
*group = cmd->group; |
|
return (cmd); |
|
} |
|
|
|
/* Get next command in list. */ |
|
struct cmd * |
|
cmd_list_next(struct cmd *cmd, u_int *group) |
|
{ |
|
cmd = TAILQ_NEXT(cmd, qentry); |
|
if (cmd != NULL && group != NULL) |
|
*group = cmd->group; |
|
return (cmd); |
|
} |
|
|
|
/* Do all of the commands in this command list have this flag? */ |
|
int |
|
cmd_list_all_have(struct cmd_list *cmdlist, int flag) |
|
{ |
|
struct cmd *cmd; |
|
|
|
TAILQ_FOREACH(cmd, cmdlist->list, qentry) { |
|
if (~cmd->entry->flags & flag) |
|
return (0); |
|
} |
|
return (1); |
|
} |
|
|
|
/* Do any of the commands in this command list have this flag? */ |
|
int |
|
cmd_list_any_have(struct cmd_list *cmdlist, int flag) |
|
{ |
|
struct cmd *cmd; |
|
|
|
TAILQ_FOREACH(cmd, cmdlist->list, qentry) { |
|
if (cmd->entry->flags & flag) |
|
return (1); |
|
} |
|
return (0); |
} |
} |
|
|
/* Adjust current mouse position for a pane. */ |
/* Adjust current mouse position for a pane. */ |