static enum status_code prompt_toggle(struct view *view, const char *argv[], enum view_flag *flags) { const char *option = argv[1]; size_t optionlen = option ? strlen(option) : 0; struct option_info template; struct option_info *toggle; struct view_column *column; const char *column_name; if (!option) return error("%s", "No option name given to :toggle"); if (enum_equals_static("sort-field", option, optionlen) || enum_equals_static("sort-order", option, optionlen)) { if (!view_has_flags(view, VIEW_SORTABLE)) { return error("Sorting is not yet supported for the %s view", view->name); } else { bool sort_field = enum_equals_static("sort-field", option, optionlen); struct sort_state *sort = &view->sort; sort_view(view, sort_field); return success("set %s = %s", option, sort_field ? view_column_name(get_sort_field(view)) : sort->reverse ? "descending" : "ascending"); } } toggle = find_option_info(option_toggles, ARRAY_SIZE(option_toggles), "", option); if (toggle) return prompt_toggle_option(view, argv, "", toggle, flags); for (column = view->columns; column; column = column->next) { toggle = find_column_option_info(column->type, &column->opt, option, &template, &column_name);
static enum status_code prompt_toggle(struct view *view, const char *argv[], enum view_flag *flags) { const char *option = argv[1]; size_t optionlen = option ? strlen(option) : 0; struct prompt_toggle *toggle; struct view_column *column; if (!option) return error("%s", "No option name given to :toggle"); if (enum_equals_static("sort-field", option, optionlen) || enum_equals_static("sort-order", option, optionlen)) { if (!view_has_flags(view, VIEW_SORTABLE)) { return error("Sorting is not yet supported for the %s view", view->name); } else { bool sort_field = enum_equals_static("sort-field", option, optionlen); struct sort_state *sort = &view->sort; sort_view(view, sort_field); return success("set %s = %s", option, sort_field ? view_column_name(get_sort_field(view)) : sort->reverse ? "descending" : "ascending"); } } toggle = find_prompt_toggle(option_toggles, ARRAY_SIZE(option_toggles), "", option, optionlen); if (toggle) return prompt_toggle_option(view, argv, "", toggle, flags); #define DEFINE_COLUMN_OPTIONS_TOGGLE(name, type, flags) \ { #name, #type, flags, &opt->name }, #define DEFINE_COLUMN_OPTIONS_CHECK(name, id, options) \ if (column->type == VIEW_COLUMN_##id) { \ struct name##_options *opt = &column->opt.name; \ struct prompt_toggle toggles[] = { \ options(DEFINE_COLUMN_OPTIONS_TOGGLE) \ }; \ toggle = find_prompt_toggle(toggles, ARRAY_SIZE(toggles), #name, option, optionlen); \ if (toggle) \ return prompt_toggle_option(view, argv, #name, toggle, flags); \ } for (column = view->columns; column; column = column->next) { COLUMN_OPTIONS(DEFINE_COLUMN_OPTIONS_CHECK); } return error("`:toggle %s` not supported", option); }
static enum view_flag prompt_toggle(struct view *view, const char *argv[], char msg[SIZEOF_STR]) { struct prompt_toggle option_toggles[] = { #define TOGGLE_OPTIONS(name, type, flags) { #name, #type, flags, &opt_ ## name }, OPTION_INFO(TOGGLE_OPTIONS) }; const char *option = argv[1]; size_t optionlen = option ? strlen(option) : 0; struct prompt_toggle *toggle; if (!option) { string_format_size(msg, SIZEOF_STR, "%s", "No option name given to :toggle"); return VIEW_NO_FLAGS; } if (enum_equals_static("sort-field", option, optionlen) || enum_equals_static("sort-order", option, optionlen)) { if (!view_has_flags(view, VIEW_SORTABLE)) { report("Sorting is not yet supported for the %s view", view->name); } else { bool sort_field = enum_equals_static("sort-field", option, optionlen); struct sort_state *sort = &view->sort; sort_view(view, sort_field); string_format_size(msg, SIZEOF_STR, "set %s = %s", option, sort_field ? enum_name(view_column_type_map->entries[get_sort_field(view)]) : sort->reverse ? "descending" : "ascending"); } return VIEW_NO_FLAGS; } toggle = find_prompt_toggle(option_toggles, ARRAY_SIZE(option_toggles), option, optionlen); if (toggle) return prompt_toggle_option(view, argv, toggle, msg); string_format_size(msg, SIZEOF_STR, "`:toggle %s` not supported", option); return VIEW_NO_FLAGS; }