diff options
Diffstat (limited to 'cmd-show-options.c')
-rw-r--r-- | cmd-show-options.c | 179 |
1 files changed, 121 insertions, 58 deletions
diff --git a/cmd-show-options.c b/cmd-show-options.c index 5d480664..e3cfbc54 100644 --- a/cmd-show-options.c +++ b/cmd-show-options.c @@ -29,8 +29,8 @@ static enum cmd_retval cmd_show_options_exec(struct cmd *, struct cmdq_item *); -static enum cmd_retval cmd_show_options_one(struct cmd *, struct cmdq_item *, - struct options *); +static void cmd_show_options_print(struct cmd *, struct cmdq_item *, + struct options_entry *, int); static enum cmd_retval cmd_show_options_all(struct cmd *, struct cmdq_item *, struct options *); @@ -38,8 +38,8 @@ const struct cmd_entry cmd_show_options_entry = { .name = "show-options", .alias = "show", - .args = { "gqst:vw", 0, 1 }, - .usage = "[-gqsvw] [-t target-session|target-window] [option]", + .args = { "gHqst:vw", 0, 1 }, + .usage = "[-gHqsvw] [-t target-session|target-window] [option]", .target = { 't', CMD_FIND_WINDOW, CMD_FIND_CANFAIL }, @@ -60,28 +60,113 @@ const struct cmd_entry cmd_show_window_options_entry = { .exec = cmd_show_options_exec }; +const struct cmd_entry cmd_show_hooks_entry = { + .name = "show-hooks", + .alias = NULL, + + .args = { "gt:", 0, 1 }, + .usage = "[-g] " CMD_TARGET_SESSION_USAGE, + + .target = { 't', CMD_FIND_SESSION, 0 }, + + .flags = CMD_AFTERHOOK, + .exec = cmd_show_options_exec +}; + static enum cmd_retval cmd_show_options_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; struct cmd_find_state *fs = &item->target; + struct client *c = cmd_find_client(item, NULL, 1); + struct session *s = item->target.s; + struct winlink *wl = item->target.wl; struct options *oo; enum options_table_scope scope; - char *cause; - int window; + char *argument, *name = NULL, *cause; + const char *target; + int window, idx, ambiguous; + struct options_entry *o; window = (self->entry == &cmd_show_window_options_entry); - scope = options_scope_from_flags(args, window, fs, &oo, &cause); + if (args->argc == 0) { + scope = options_scope_from_flags(args, window, fs, &oo, &cause); + return (cmd_show_options_all(self, item, oo)); + } + argument = format_single(item, args->argv[0], c, s, wl, NULL); + + name = options_match(argument, &idx, &ambiguous); + if (name == NULL) { + if (args_has(args, 'q')) + goto fail; + if (ambiguous) + cmdq_error(item, "ambiguous option: %s", argument); + else + cmdq_error(item, "invalid option: %s", argument); + goto fail; + } + if (*name == '@') + scope = options_scope_from_flags(args, window, fs, &oo, &cause); + else { + if (options_get_only(global_options, name) != NULL) + scope = OPTIONS_TABLE_SERVER; + else if (options_get_only(global_s_options, name) != NULL) + scope = OPTIONS_TABLE_SESSION; + else if (options_get_only(global_w_options, name) != NULL) + scope = OPTIONS_TABLE_WINDOW; + else { + scope = OPTIONS_TABLE_NONE; + xasprintf(&cause, "unknown option: %s", argument); + } + if (scope == OPTIONS_TABLE_SERVER) + oo = global_options; + else if (scope == OPTIONS_TABLE_SESSION) { + if (args_has(self->args, 'g')) + oo = global_s_options; + else if (s == NULL) { + target = args_get(args, 't'); + if (target != NULL) { + cmdq_error(item, "no such session: %s", + target); + } else + cmdq_error(item, "no current session"); + goto fail; + } else + oo = s->options; + } else if (scope == OPTIONS_TABLE_WINDOW) { + if (args_has(self->args, 'g')) + oo = global_w_options; + else if (wl == NULL) { + target = args_get(args, 't'); + if (target != NULL) { + cmdq_error(item, "no such window: %s", + target); + } else + cmdq_error(item, "no current window"); + goto fail; + } else + oo = wl->window->options; + } + } if (scope == OPTIONS_TABLE_NONE) { + if (args_has(args, 'q')) + goto fail; cmdq_error(item, "%s", cause); free(cause); - return (CMD_RETURN_ERROR); + goto fail; } + o = options_get_only(oo, name); + if (o != NULL) + cmd_show_options_print(self, item, o, idx); - if (args->argc == 0) - return (cmd_show_options_all(self, item, oo)); - else - return (cmd_show_options_one(self, item, oo)); + free(name); + free(argument); + return (CMD_RETURN_NORMAL); + +fail: + free(name); + free(argument); + return (CMD_RETURN_ERROR); } static void @@ -89,15 +174,20 @@ cmd_show_options_print(struct cmd *self, struct cmdq_item *item, struct options_entry *o, int idx) { struct options_array_item *a; - const char *name, *value; - char *tmp, *escaped; + const char *name = options_name(o); + char *value, *tmp = NULL, *escaped; if (idx != -1) { - xasprintf(&tmp, "%s[%d]", options_name(o), idx); + xasprintf(&tmp, "%s[%d]", name, idx); name = tmp; } else { if (options_isarray(o)) { a = options_array_first(o); + if (a == NULL) { + if (!args_has(self->args, 'v')) + cmdq_print(item, "%s", name); + return; + } while (a != NULL) { idx = options_array_item_index(a); cmd_show_options_print(self, item, o, idx); @@ -105,8 +195,6 @@ cmd_show_options_print(struct cmd *self, struct cmdq_item *item, } return; } - tmp = NULL; - name = options_name(o); } value = options_tostring(o, idx, 0); @@ -118,64 +206,39 @@ cmd_show_options_print(struct cmd *self, struct cmdq_item *item, free(escaped); } else cmdq_print(item, "%s %s", name, value); + free(value); free(tmp); } static enum cmd_retval -cmd_show_options_one(struct cmd *self, struct cmdq_item *item, - struct options *oo) -{ - struct args *args = self->args; - struct client *c = cmd_find_client(item, NULL, 1); - struct session *s = item->target.s; - struct winlink *wl = item->target.wl; - struct options_entry *o; - int idx, ambiguous; - char *name; - - name = format_single(item, args->argv[0], c, s, wl, NULL); - o = options_match_get(oo, name, &idx, 1, &ambiguous); - if (o == NULL) { - if (args_has(args, 'q')) { - free(name); - return (CMD_RETURN_NORMAL); - } - if (ambiguous) { - cmdq_error(item, "ambiguous option: %s", name); - free(name); - return (CMD_RETURN_ERROR); - } - if (*name != '@' && - options_match_get(oo, name, &idx, 0, &ambiguous) != NULL) { - free(name); - return (CMD_RETURN_NORMAL); - } - cmdq_error(item, "unknown option: %s", name); - free(name); - return (CMD_RETURN_ERROR); - } - cmd_show_options_print(self, item, o, idx); - free(name); - return (CMD_RETURN_NORMAL); -} - -static enum cmd_retval cmd_show_options_all(struct cmd *self, struct cmdq_item *item, struct options *oo) { struct options_entry *o; - const struct options_table_entry *oe; struct options_array_item *a; u_int idx; + const struct options_table_entry *oe; o = options_first(oo); while (o != NULL) { oe = options_table_entry(o); + if ((self->entry != &cmd_show_hooks_entry && + !args_has(self->args, 'H') && + oe != NULL && + (oe->flags & OPTIONS_TABLE_IS_HOOK)) || + (self->entry == &cmd_show_hooks_entry && + (oe == NULL || + (~oe->flags & OPTIONS_TABLE_IS_HOOK)))) { + o = options_next(o); + continue; + } if (!options_isarray(o)) cmd_show_options_print(self, item, o, -1); - else { - a = options_array_first(o); + else if ((a = options_array_first(o)) == NULL) { + if (!args_has(self->args, 'v')) + cmdq_print(item, "%s", options_name(o)); + } else { while (a != NULL) { idx = options_array_item_index(a); cmd_show_options_print(self, item, o, idx); |