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);
optparse_err_t optparse_add_option (optparse_t p, const struct optparse_option *o) { struct option_info *c; if (p == NULL || !p->option_list) return OPTPARSE_BAD_ARG; if (o->name && find_option_info (p, o->name)) return OPTPARSE_EEXIST; if (!(c = option_info_create (o))) return OPTPARSE_NOMEM; if (!list_append (p->option_list, c)) return OPTPARSE_NOMEM; return (OPTPARSE_SUCCESS); }
/* Wants: name = value */ static enum status_code option_set_command(int argc, const char *argv[]) { struct option_info *option; if (argc < 3) return error("Invalid set command: set option = value"); if (strcmp(argv[1], "=")) return error("No value assigned to %s", argv[0]); if (!strcmp(argv[0], "reference-format")) return parse_ref_formats(argv + 2); option = find_option_info(option_info, ARRAY_SIZE(option_info), argv[0]); if (option) { enum status_code code; if (option->seen) return SUCCESS; if (!strcmp(option->type, "const char **")) { code = check_view_config(option, argv + 2); if (code != SUCCESS) return code; return parse_args(option->value, argv + 2); } code = parse_option(option, "", argv[2]); if (code == SUCCESS && argc != 3) return error("Option %s only takes one value", argv[0]); return code; } { const char *obsolete[][2] = { { "author-width", "author" }, { "filename-width", "file-name" }, { "line-number-interval", "line-number" }, { "show-author", "author" }, { "show-date", "date" }, { "show-file-size", "file-size" }, { "show-filename", "file-name" }, { "show-id", "id" }, { "show-line-numbers", "line-number" }, { "show-refs", "commit-title" }, { "show-rev-graph", "commit-title" }, { "title-overflow", "commit-title and text" }, }; int index = find_remapped(obsolete, ARRAY_SIZE(obsolete), argv[0]); if (index != -1) return error("%s is obsolete; see tigrc(5) for how to set the %s column option", obsolete[index][0], obsolete[index][1]); if (!strcmp(argv[0], "read-git-colors")) return error("read-git-colors has been obsoleted by the git-colors option"); } return error("Unknown option name: %s", argv[0]); }
/* * Create option parser for program named [prog] */ optparse_t optparse_create (const char *prog) { struct optparse_option help = { .name = "help", .key = 'h', .usage = "Display this message.", .cb = (optparse_cb_f) display_help, }; struct opt_parser *p = malloc (sizeof (*p)); if (!p) return NULL; if (!(p->program_name = strdup (prog))) { free (p); return NULL; } p->usage = NULL; p->option_list = list_create ((ListDelF) option_info_destroy); if (!p->option_list) { free (p); return NULL; } p->log_fn = &log_stderr; p->fatalerr_fn = &log_stderr_exit; p->fatalerr_handle = NULL; p->left_margin = 2; p->option_width = 25; /* * Register -h, --help */ help.arg = (void *) p; if (optparse_add_option (p, &help) != OPTPARSE_SUCCESS) { fprintf (stderr, "failed to register --help option: %s\n", strerror (errno)); optparse_destroy (p); return (NULL); } return (p); } /* * Search for option with [name] in parser [p] returns -1 if option * was never registered with this parser, 0 if option was not used, * and 1 if option was specified in args. Returns pointer to optargp * if non-NULL. */ int optparse_getopt (optparse_t p, const char *name, const char **optargp) { struct option_info *c; if (!(c = find_option_info (p, name))) return (-1); if (c->found) { if (optargp) *optargp = c->optarg; return (1); } return (0); } bool optparse_hasopt (optparse_t p, const char *name) { int n; if ((n = optparse_getopt (p, name, NULL)) < 0) { (*p->fatalerr_fn) (p->fatalerr_handle, 1, "%s: optparse error: no such argument '%s'\n", p->program_name, name); return false; } return (n > 0); }