Example #1
0
File: prompt.c Project: Oblomov/tig
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);
Example #2
0
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);
}
Example #3
0
/* 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]);
}
Example #4
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);
}