summaryrefslogtreecommitdiffstats
path: root/cmd-set-option.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmd-set-option.c')
-rw-r--r--cmd-set-option.c283
1 files changed, 16 insertions, 267 deletions
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 93896835..72f6c0a2 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-set-option.c,v 1.45 2008-12-05 20:04:06 nicm Exp $ */
+/* $Id: cmd-set-option.c,v 1.46 2008-12-08 16:19:51 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -28,132 +28,61 @@
* Set an option.
*/
-int cmd_set_option_parse(struct cmd *, int, char **, char **);
void cmd_set_option_exec(struct cmd *, struct cmd_ctx *);
-void cmd_set_option_send(struct cmd *, struct buffer *);
-void cmd_set_option_recv(struct cmd *, struct buffer *);
-void cmd_set_option_free(struct cmd *);
-void cmd_set_option_print(struct cmd *, char *, size_t);
-
-struct cmd_set_option_data {
- char *target;
- int flag_global;
- char *option;
- char *value;
-};
const struct cmd_entry cmd_set_option_entry = {
"set-option", "set",
"[-t target-session] option value",
- 0,
+ CMD_GFLAG,
NULL,
- cmd_set_option_parse,
+ cmd_option_parse,
cmd_set_option_exec,
- cmd_set_option_send,
- cmd_set_option_recv,
- cmd_set_option_free,
- cmd_set_option_print
+ cmd_option_send,
+ cmd_option_recv,
+ cmd_option_free,
+ cmd_option_print
};
const char *set_option_bell_action_list[] = {
"none", "any", "current", NULL
};
-const char *set_option_mode_keys_list[] = {
- "emacs", "vi", NULL
-};
const struct set_option_entry set_option_table[NSETOPTION] = {
{ "bell-action", SET_OPTION_CHOICE, 0, 0, set_option_bell_action_list },
{ "buffer-limit", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
{ "default-command", SET_OPTION_STRING, 0, 0, NULL },
{ "display-time", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
{ "history-limit", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
- { "mode-keys", SET_OPTION_CHOICE, 0, 0, set_option_mode_keys_list },
+ { "message-bg", SET_OPTION_COLOUR, 0, 0, NULL },
+ { "message-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "prefix", SET_OPTION_KEY, 0, 0, NULL },
- { "remain-by-default", SET_OPTION_FLAG, 0, 0, NULL },
{ "set-titles", SET_OPTION_FLAG, 0, 0, NULL },
{ "status", SET_OPTION_FLAG, 0, 0, NULL },
{ "status-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-interval", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
{ "status-left", SET_OPTION_STRING, 0, 0, NULL },
- { "status-right", SET_OPTION_STRING, 0, 0, NULL },
{ "status-left-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
+ { "status-right", SET_OPTION_STRING, 0, 0, NULL },
{ "status-right-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
- { "utf8", SET_OPTION_FLAG, 0, 0, NULL },
};
-void set_option_string(struct cmd_ctx *,
- struct options *, const struct set_option_entry *, char *);
-void set_option_number(struct cmd_ctx *,
- struct options *, const struct set_option_entry *, char *);
-void set_option_key(struct cmd_ctx *,
- struct options *, const struct set_option_entry *, char *);
-void set_option_colour(struct cmd_ctx *,
- struct options *, const struct set_option_entry *, char *);
-void set_option_flag(struct cmd_ctx *,
- struct options *, const struct set_option_entry *, char *);
-void set_option_choice(struct cmd_ctx *,
- struct options *, const struct set_option_entry *, char *);
-
-int
-cmd_set_option_parse(struct cmd *self, int argc, char **argv, char **cause)
-{
- struct cmd_set_option_data *data;
- int opt;
-
- self->data = data = xmalloc(sizeof *data);
- data->target = NULL;
- data->flag_global = 1;
- data->option = NULL;
- data->value = NULL;
-
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "t:s:")) != EOF) {
- switch (opt) {
- case 't':
- if (data->target == NULL)
- data->target = xstrdup(optarg);
- data->flag_global = 0;
- break;
- default:
- goto usage;
- }
- }
- argc -= optind;
- argv += optind;
- if (argc != 1 && argc != 2)
- goto usage;
-
- data->option = xstrdup(argv[0]);
- if (argc == 2)
- data->value = xstrdup(argv[1]);
-
- return (0);
-
-usage:
- xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
-
- self->entry->free(self);
- return (-1);
-}
-
void
cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
{
- struct cmd_set_option_data *data = self->data;
+ struct cmd_option_data *data = self->data;
struct session *s;
struct client *c;
struct options *oo;
const struct set_option_entry *entry;
u_int i;
- if (data == NULL)
- return;
-
- if (data->flag_global ||
- ((s = cmd_find_session(ctx, data->target))) == NULL)
+ if (data->flags & CMD_GFLAG)
oo = &global_options;
- else
+ else {
+ if ((s = cmd_find_session(ctx, data->target)) == NULL)
+ return;
oo = &s->options;
+ }
if (*data->option == '\0') {
ctx->error(ctx, "invalid option");
@@ -211,183 +140,3 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
if (ctx->cmdclient != NULL)
server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0);
}
-
-void
-set_option_string(struct cmd_ctx *ctx, struct options *oo,
- const struct set_option_entry *entry, char *value)
-{
- if (value == NULL) {
- ctx->error(ctx, "empty value");
- return;
- }
-
- options_set_string(oo, entry->name, "%s", value);
-}
-
-void
-set_option_number(struct cmd_ctx *ctx, struct options *oo,
- const struct set_option_entry *entry, char *value)
-{
- long long number;
- const char *errstr;
-
- if (value == NULL) {
- ctx->error(ctx, "empty value");
- return;
- }
-
- number = strtonum(value, entry->minimum, entry->maximum, &errstr);
- if (errstr != NULL) {
- ctx->error(ctx, "value is %s: %s", errstr, value);
- return;
- }
- options_set_number(oo, entry->name, number);
-}
-
-void
-set_option_key(struct cmd_ctx *ctx, struct options *oo,
- const struct set_option_entry *entry, char *value)
-{
- int key;
-
- if (value == NULL) {
- ctx->error(ctx, "empty value");
- return;
- }
-
- if ((key = key_string_lookup_string(value)) == KEYC_NONE) {
- ctx->error(ctx, "unknown key: %s", value);
- return;
- }
- options_set_number(oo, entry->name, key);
-
-}
-
-void
-set_option_colour(struct cmd_ctx *ctx, struct options *oo,
- const struct set_option_entry *entry, char *value)
-{
- u_char colour;
-
- if (value == NULL) {
- ctx->error(ctx, "empty value");
- return;
- }
-
- if ((colour = colour_fromstring(value)) > 8) {
- ctx->error(ctx, "bad colour: %s", value);
- return;
- }
-
- options_set_number(oo, entry->name, colour);
-}
-
-void
-set_option_flag(struct cmd_ctx *ctx, struct options *oo,
- const struct set_option_entry *entry, char *value)
-{
- int flag;
-
- if (value == NULL || *value == '\0')
- flag = !options_get_number(oo, entry->name);
- else {
- if ((value[0] == '1' && value[1] == '\0') ||
- strcasecmp(value, "on") == 0 ||
- strcasecmp(value, "yes") == 0)
- flag = 1;
- else if ((value[0] == '0' && value[1] == '\0') ||
- strcasecmp(value, "off") == 0 ||
- strcasecmp(value, "no") == 0)
- flag = 0;
- else {
- ctx->error(ctx, "bad value: %s", value);
- return;
- }
- }
-
- options_set_number(oo, entry->name, flag);
-}
-
-void
-set_option_choice(struct cmd_ctx *ctx, struct options *oo,
- const struct set_option_entry *entry, char *value)
-{
- const char **choicep;
- int n, choice = -1;
-
- if (value == NULL) {
- ctx->error(ctx, "empty value");
- return;
- }
-
- n = 0;
- for (choicep = entry->choices; *choicep != NULL; choicep++) {
- n++;
- if (strncmp(*choicep, value, strlen(value)) != 0)
- continue;
-
- if (choice != -1) {
- ctx->error(ctx, "ambiguous option: %s", value);
- return;
- }
- choice = n - 1;
- }
- if (choice == -1) {
- ctx->error(ctx, "unknown option: %s", value);
- return;
- }
-
- options_set_number(oo, entry->name, choice);
-}
-
-void
-cmd_set_option_send(struct cmd *self, struct buffer *b)
-{
- struct cmd_set_option_data *data = self->data;
-
- buffer_write(b, data, sizeof *data);
- cmd_send_string(b, data->target);
- cmd_send_string(b, data->option);
- cmd_send_string(b, data->value);
-}
-
-void
-cmd_set_option_recv(struct cmd *self, struct buffer *b)
-{
- struct cmd_set_option_data *data;
-
- self->data = data = xmalloc(sizeof *data);
- buffer_read(b, data, sizeof *data);
- data->target = cmd_recv_string(b);
- data->option = cmd_recv_string(b);
- data->value = cmd_recv_string(b);
-}
-
-void
-cmd_set_option_free(struct cmd *self)
-{
- struct cmd_set_option_data *data = self->data;
-
- if (data->target != NULL)
- xfree(data->target);
- if (data->option != NULL)
- xfree(data->option);
- if (data->value != NULL)
- xfree(data->value);
- xfree(data);
-}
-
-void
-cmd_set_option_print(struct cmd *self, char *buf, size_t len)
-{
- struct cmd_set_option_data *data = self->data;
- size_t off = 0;
-
- off += xsnprintf(buf, len, "%s", self->entry->name);
- if (data == NULL)
- return;
- if (off < len && data->option != NULL)
- off += xsnprintf(buf + off, len - off, " %s", data->option);
- if (off < len && data->value != NULL)
- off += xsnprintf(buf + off, len - off, " %s", data->value);
-}