parse-options.c 19.5 KB
Newer Older
1 2 3
#include "util.h"
#include "parse-options.h"
#include "cache.h"
4
#include "header.h"
5
#include <linux/string.h>
6 7 8 9

#define OPT_SHORT 1
#define OPT_UNSET 2

10 11
static struct strbuf error_buf = STRBUF_INIT;

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
static int opterror(const struct option *opt, const char *reason, int flags)
{
	if (flags & OPT_SHORT)
		return error("switch `%c' %s", opt->short_name, reason);
	if (flags & OPT_UNSET)
		return error("option `no-%s' %s", opt->long_name, reason);
	return error("option `%s' %s", opt->long_name, reason);
}

static int get_arg(struct parse_opt_ctx_t *p, const struct option *opt,
		   int flags, const char **arg)
{
	if (p->opt) {
		*arg = p->opt;
		p->opt = NULL;
27 28
	} else if ((opt->flags & PARSE_OPT_LASTARG_DEFAULT) && (p->argc == 1 ||
		    **(p->argv + 1) == '-')) {
29 30 31 32 33 34 35 36 37 38 39 40
		*arg = (const char *)opt->defval;
	} else if (p->argc > 1) {
		p->argc--;
		*arg = *++p->argv;
	} else
		return opterror(opt, "requires a value", flags);
	return 0;
}

static int get_value(struct parse_opt_ctx_t *p,
		     const struct option *opt, int flags)
{
41
	const char *s, *arg = NULL;
42
	const int unset = flags & OPT_UNSET;
43
	int err;
44 45 46 47 48

	if (unset && p->opt)
		return opterror(opt, "takes no value", flags);
	if (unset && (opt->flags & PARSE_OPT_NONEG))
		return opterror(opt, "isn't available", flags);
49 50
	if (opt->flags & PARSE_OPT_DISABLED)
		return opterror(opt, "is not usable", flags);
51

52
	if (opt->flags & PARSE_OPT_EXCLUSIVE) {
53
		if (p->excl_opt && p->excl_opt != opt) {
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
			char msg[128];

			if (((flags & OPT_SHORT) && p->excl_opt->short_name) ||
			    p->excl_opt->long_name == NULL) {
				scnprintf(msg, sizeof(msg), "cannot be used with switch `%c'",
					  p->excl_opt->short_name);
			} else {
				scnprintf(msg, sizeof(msg), "cannot be used with %s",
					  p->excl_opt->long_name);
			}
			opterror(opt, msg, flags);
			return -3;
		}
		p->excl_opt = opt;
	}
69 70 71 72 73 74 75
	if (!(flags & OPT_SHORT) && p->opt) {
		switch (opt->type) {
		case OPTION_CALLBACK:
			if (!(opt->flags & PARSE_OPT_NOARG))
				break;
			/* FALLTHROUGH */
		case OPTION_BOOLEAN:
76
		case OPTION_INCR:
77
		case OPTION_BIT:
78
		case OPTION_SET_UINT:
79 80
		case OPTION_SET_PTR:
			return opterror(opt, "takes no value", flags);
81 82 83 84 85
		case OPTION_END:
		case OPTION_ARGUMENT:
		case OPTION_GROUP:
		case OPTION_STRING:
		case OPTION_INTEGER:
86
		case OPTION_UINTEGER:
87
		case OPTION_LONG:
88
		case OPTION_U64:
89 90 91 92 93 94 95 96 97 98 99 100 101 102
		default:
			break;
		}
	}

	switch (opt->type) {
	case OPTION_BIT:
		if (unset)
			*(int *)opt->value &= ~opt->defval;
		else
			*(int *)opt->value |= opt->defval;
		return 0;

	case OPTION_BOOLEAN:
103
		*(bool *)opt->value = unset ? false : true;
104 105
		if (opt->set)
			*(bool *)opt->set = true;
106 107 108
		return 0;

	case OPTION_INCR:
109 110 111
		*(int *)opt->value = unset ? 0 : *(int *)opt->value + 1;
		return 0;

112 113
	case OPTION_SET_UINT:
		*(unsigned int *)opt->value = unset ? 0 : opt->defval;
114 115 116 117 118 119 120
		return 0;

	case OPTION_SET_PTR:
		*(void **)opt->value = unset ? NULL : (void *)opt->defval;
		return 0;

	case OPTION_STRING:
121
		err = 0;
122 123 124 125 126
		if (unset)
			*(const char **)opt->value = NULL;
		else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
			*(const char **)opt->value = (const char *)opt->defval;
		else
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
			err = get_arg(p, opt, flags, (const char **)opt->value);

		/* PARSE_OPT_NOEMPTY: Allow NULL but disallow empty string. */
		if (opt->flags & PARSE_OPT_NOEMPTY) {
			const char *val = *(const char **)opt->value;

			if (!val)
				return err;

			/* Similar to unset if we are given an empty string. */
			if (val[0] == '\0') {
				*(const char **)opt->value = NULL;
				return 0;
			}
		}

		return err;
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169

	case OPTION_CALLBACK:
		if (unset)
			return (*opt->callback)(opt, NULL, 1) ? (-1) : 0;
		if (opt->flags & PARSE_OPT_NOARG)
			return (*opt->callback)(opt, NULL, 0) ? (-1) : 0;
		if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
			return (*opt->callback)(opt, NULL, 0) ? (-1) : 0;
		if (get_arg(p, opt, flags, &arg))
			return -1;
		return (*opt->callback)(opt, arg, 0) ? (-1) : 0;

	case OPTION_INTEGER:
		if (unset) {
			*(int *)opt->value = 0;
			return 0;
		}
		if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
			*(int *)opt->value = opt->defval;
			return 0;
		}
		if (get_arg(p, opt, flags, &arg))
			return -1;
		*(int *)opt->value = strtol(arg, (char **)&s, 10);
		if (*s)
			return opterror(opt, "expects a numerical value", flags);
170 171
		return 0;

172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
	case OPTION_UINTEGER:
		if (unset) {
			*(unsigned int *)opt->value = 0;
			return 0;
		}
		if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
			*(unsigned int *)opt->value = opt->defval;
			return 0;
		}
		if (get_arg(p, opt, flags, &arg))
			return -1;
		*(unsigned int *)opt->value = strtol(arg, (char **)&s, 10);
		if (*s)
			return opterror(opt, "expects a numerical value", flags);
		return 0;

188 189 190 191 192 193 194 195 196 197 198 199 200 201
	case OPTION_LONG:
		if (unset) {
			*(long *)opt->value = 0;
			return 0;
		}
		if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
			*(long *)opt->value = opt->defval;
			return 0;
		}
		if (get_arg(p, opt, flags, &arg))
			return -1;
		*(long *)opt->value = strtol(arg, (char **)&s, 10);
		if (*s)
			return opterror(opt, "expects a numerical value", flags);
202 203
		return 0;

204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
	case OPTION_U64:
		if (unset) {
			*(u64 *)opt->value = 0;
			return 0;
		}
		if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
			*(u64 *)opt->value = opt->defval;
			return 0;
		}
		if (get_arg(p, opt, flags, &arg))
			return -1;
		*(u64 *)opt->value = strtoull(arg, (char **)&s, 10);
		if (*s)
			return opterror(opt, "expects a numerical value", flags);
		return 0;

220 221 222
	case OPTION_END:
	case OPTION_ARGUMENT:
	case OPTION_GROUP:
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
	default:
		die("should not happen, someone must be hit on the forehead");
	}
}

static int parse_short_opt(struct parse_opt_ctx_t *p, const struct option *options)
{
	for (; options->type != OPTION_END; options++) {
		if (options->short_name == *p->opt) {
			p->opt = p->opt[1] ? p->opt + 1 : NULL;
			return get_value(p, options, OPT_SHORT);
		}
	}
	return -2;
}

static int parse_long_opt(struct parse_opt_ctx_t *p, const char *arg,
                          const struct option *options)
{
	const char *arg_end = strchr(arg, '=');
	const struct option *abbrev_option = NULL, *ambiguous_option = NULL;
	int abbrev_flags = 0, ambiguous_flags = 0;

	if (!arg_end)
		arg_end = arg + strlen(arg);

	for (; options->type != OPTION_END; options++) {
		const char *rest;
		int flags = 0;

		if (!options->long_name)
			continue;

		rest = skip_prefix(arg, options->long_name);
		if (options->type == OPTION_ARGUMENT) {
			if (!rest)
				continue;
			if (*rest == '=')
				return opterror(options, "takes no value", flags);
			if (*rest)
				continue;
			p->out[p->cpidx++] = arg - 2;
			return 0;
		}
		if (!rest) {
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
			if (!prefixcmp(options->long_name, "no-")) {
				/*
				 * The long name itself starts with "no-", so
				 * accept the option without "no-" so that users
				 * do not have to enter "no-no-" to get the
				 * negation.
				 */
				rest = skip_prefix(arg, options->long_name + 3);
				if (rest) {
					flags |= OPT_UNSET;
					goto match;
				}
				/* Abbreviated case */
				if (!prefixcmp(options->long_name + 3, arg)) {
					flags |= OPT_UNSET;
					goto is_abbreviated;
				}
			}
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
			/* abbreviated? */
			if (!strncmp(options->long_name, arg, arg_end - arg)) {
is_abbreviated:
				if (abbrev_option) {
					/*
					 * If this is abbreviated, it is
					 * ambiguous. So when there is no
					 * exact match later, we need to
					 * error out.
					 */
					ambiguous_option = abbrev_option;
					ambiguous_flags = abbrev_flags;
				}
				if (!(flags & OPT_UNSET) && *arg_end)
					p->opt = arg_end + 1;
				abbrev_option = options;
				abbrev_flags = flags;
				continue;
			}
			/* negated and abbreviated very much? */
			if (!prefixcmp("no-", arg)) {
				flags |= OPT_UNSET;
				goto is_abbreviated;
			}
			/* negated? */
			if (strncmp(arg, "no-", 3))
				continue;
			flags |= OPT_UNSET;
			rest = skip_prefix(arg + 3, options->long_name);
			/* abbreviated and negated? */
			if (!rest && !prefixcmp(options->long_name, arg + 3))
				goto is_abbreviated;
			if (!rest)
				continue;
		}
321
match:
322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
		if (*rest) {
			if (*rest != '=')
				continue;
			p->opt = rest + 1;
		}
		return get_value(p, options, flags);
	}

	if (ambiguous_option)
		return error("Ambiguous option: %s "
			"(could be --%s%s or --%s%s)",
			arg,
			(ambiguous_flags & OPT_UNSET) ?  "no-" : "",
			ambiguous_option->long_name,
			(abbrev_flags & OPT_UNSET) ?  "no-" : "",
			abbrev_option->long_name);
	if (abbrev_option)
		return get_value(p, abbrev_option, abbrev_flags);
	return -2;
}

static void check_typos(const char *arg, const struct option *options)
{
	if (strlen(arg) < 3)
		return;

	if (!prefixcmp(arg, "no-")) {
		error ("did you mean `--%s` (with two dashes ?)", arg);
		exit(129);
	}

	for (; options->type != OPTION_END; options++) {
		if (!options->long_name)
			continue;
		if (!prefixcmp(options->long_name, arg)) {
			error ("did you mean `--%s` (with two dashes ?)", arg);
			exit(129);
		}
	}
}

void parse_options_start(struct parse_opt_ctx_t *ctx,
			 int argc, const char **argv, int flags)
{
	memset(ctx, 0, sizeof(*ctx));
	ctx->argc = argc - 1;
	ctx->argv = argv + 1;
	ctx->out  = argv;
	ctx->cpidx = ((flags & PARSE_OPT_KEEP_ARGV0) != 0);
	ctx->flags = flags;
	if ((flags & PARSE_OPT_KEEP_UNKNOWN) &&
	    (flags & PARSE_OPT_STOP_AT_NON_OPTION))
		die("STOP_AT_NON_OPTION and KEEP_UNKNOWN don't go together");
}

static int usage_with_options_internal(const char * const *,
378 379
				       const struct option *, int,
				       struct parse_opt_ctx_t *);
380 381 382 383 384 385

int parse_options_step(struct parse_opt_ctx_t *ctx,
		       const struct option *options,
		       const char * const usagestr[])
{
	int internal_help = !(ctx->flags & PARSE_OPT_NO_INTERNAL_HELP);
386 387
	int excl_short_opt = 1;
	const char *arg;
388 389 390 391 392

	/* we must reset ->opt, unknown short option leave it dangling */
	ctx->opt = NULL;

	for (; ctx->argc; ctx->argc--, ctx->argv++) {
393
		arg = ctx->argv[0];
394 395 396 397 398 399 400 401
		if (*arg != '-' || !arg[1]) {
			if (ctx->flags & PARSE_OPT_STOP_AT_NON_OPTION)
				break;
			ctx->out[ctx->cpidx++] = ctx->argv[0];
			continue;
		}

		if (arg[1] != '-') {
402
			ctx->opt = ++arg;
403 404 405
			if (internal_help && *ctx->opt == 'h') {
				return usage_with_options_internal(usagestr, options, 0, ctx);
			}
406 407
			switch (parse_short_opt(ctx, options)) {
			case -1:
408
				return parse_options_usage(usagestr, options, arg, 1);
409 410
			case -2:
				goto unknown;
411 412
			case -3:
				goto exclusive;
413 414
			default:
				break;
415 416
			}
			if (ctx->opt)
417
				check_typos(arg, options);
418 419
			while (ctx->opt) {
				if (internal_help && *ctx->opt == 'h')
420
					return usage_with_options_internal(usagestr, options, 0, ctx);
421
				arg = ctx->opt;
422 423
				switch (parse_short_opt(ctx, options)) {
				case -1:
424
					return parse_options_usage(usagestr, options, arg, 1);
425 426 427 428 429 430 431 432 433
				case -2:
					/* fake a short option thing to hide the fact that we may have
					 * started to parse aggregated stuff
					 *
					 * This is leaky, too bad.
					 */
					ctx->argv[0] = strdup(ctx->opt - 1);
					*(char *)ctx->argv[0] = '-';
					goto unknown;
434 435
				case -3:
					goto exclusive;
436 437
				default:
					break;
438 439 440 441 442 443 444 445 446 447 448 449 450
				}
			}
			continue;
		}

		if (!arg[2]) { /* "--" */
			if (!(ctx->flags & PARSE_OPT_KEEP_DASHDASH)) {
				ctx->argc--;
				ctx->argv++;
			}
			break;
		}

451 452
		arg += 2;
		if (internal_help && !strcmp(arg, "help-all"))
453
			return usage_with_options_internal(usagestr, options, 1, ctx);
454
		if (internal_help && !strcmp(arg, "help"))
455
			return usage_with_options_internal(usagestr, options, 0, ctx);
456
		if (!strcmp(arg, "list-opts"))
457
			return PARSE_OPT_LIST_OPTS;
458
		if (!strcmp(arg, "list-cmds"))
459
			return PARSE_OPT_LIST_SUBCMDS;
460
		switch (parse_long_opt(ctx, arg, options)) {
461
		case -1:
462
			return parse_options_usage(usagestr, options, arg, 0);
463 464
		case -2:
			goto unknown;
465 466 467
		case -3:
			excl_short_opt = 0;
			goto exclusive;
468 469
		default:
			break;
470 471 472 473 474 475 476 477 478
		}
		continue;
unknown:
		if (!(ctx->flags & PARSE_OPT_KEEP_UNKNOWN))
			return PARSE_OPT_UNKNOWN;
		ctx->out[ctx->cpidx++] = ctx->argv[0];
		ctx->opt = NULL;
	}
	return PARSE_OPT_DONE;
479 480 481 482 483 484 485 486 487 488 489

exclusive:
	parse_options_usage(usagestr, options, arg, excl_short_opt);
	if ((excl_short_opt && ctx->excl_opt->short_name) ||
	    ctx->excl_opt->long_name == NULL) {
		char opt = ctx->excl_opt->short_name;
		parse_options_usage(NULL, options, &opt, 1);
	} else {
		parse_options_usage(NULL, options, ctx->excl_opt->long_name, 0);
	}
	return PARSE_OPT_HELP;
490 491 492 493 494 495 496 497 498
}

int parse_options_end(struct parse_opt_ctx_t *ctx)
{
	memmove(ctx->out + ctx->cpidx, ctx->argv, ctx->argc * sizeof(*ctx->out));
	ctx->out[ctx->cpidx + ctx->argc] = NULL;
	return ctx->cpidx + ctx->argc;
}

499 500
int parse_options_subcommand(int argc, const char **argv, const struct option *options,
			const char *const subcommands[], const char *usagestr[], int flags)
501 502 503
{
	struct parse_opt_ctx_t ctx;

504
	perf_env__set_cmdline(&perf_env, argc, argv);
505

506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521
	/* build usage string if it's not provided */
	if (subcommands && !usagestr[0]) {
		struct strbuf buf = STRBUF_INIT;

		strbuf_addf(&buf, "perf %s [<options>] {", argv[0]);
		for (int i = 0; subcommands[i]; i++) {
			if (i)
				strbuf_addstr(&buf, "|");
			strbuf_addstr(&buf, subcommands[i]);
		}
		strbuf_addstr(&buf, "}");

		usagestr[0] = strdup(buf.buf);
		strbuf_release(&buf);
	}

522 523 524 525 526 527
	parse_options_start(&ctx, argc, argv, flags);
	switch (parse_options_step(&ctx, options, usagestr)) {
	case PARSE_OPT_HELP:
		exit(129);
	case PARSE_OPT_DONE:
		break;
528
	case PARSE_OPT_LIST_OPTS:
529
		while (options->type != OPTION_END) {
530 531
			if (options->long_name)
				printf("--%s ", options->long_name);
532 533
			options++;
		}
534
		putchar('\n');
535
		exit(130);
536
	case PARSE_OPT_LIST_SUBCMDS:
537 538 539 540
		if (subcommands) {
			for (int i = 0; subcommands[i]; i++)
				printf("%s ", subcommands[i]);
		}
541
		putchar('\n');
542
		exit(130);
543 544
	default: /* PARSE_OPT_UNKNOWN */
		if (ctx.argv[0][1] == '-') {
545 546
			strbuf_addf(&error_buf, "unknown option `%s'",
				    ctx.argv[0] + 2);
547
		} else {
548 549
			strbuf_addf(&error_buf, "unknown switch `%c'",
				    *ctx.opt);
550 551 552 553 554 555 556
		}
		usage_with_options(usagestr, options);
	}

	return parse_options_end(&ctx);
}

557 558 559 560 561 562 563
int parse_options(int argc, const char **argv, const struct option *options,
		  const char * const usagestr[], int flags)
{
	return parse_options_subcommand(argc, argv, options, NULL,
					(const char **) usagestr, flags);
}

564 565 566
#define USAGE_OPTS_WIDTH 24
#define USAGE_GAP         2

567 568 569 570 571 572 573 574 575 576 577 578 579
static void print_option_help(const struct option *opts, int full)
{
	size_t pos;
	int pad;

	if (opts->type == OPTION_GROUP) {
		fputc('\n', stderr);
		if (*opts->help)
			fprintf(stderr, "%s\n", opts->help);
		return;
	}
	if (!full && (opts->flags & PARSE_OPT_HIDDEN))
		return;
580 581
	if (opts->flags & PARSE_OPT_DISABLED)
		return;
582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651

	pos = fprintf(stderr, "    ");
	if (opts->short_name)
		pos += fprintf(stderr, "-%c", opts->short_name);
	else
		pos += fprintf(stderr, "    ");

	if (opts->long_name && opts->short_name)
		pos += fprintf(stderr, ", ");
	if (opts->long_name)
		pos += fprintf(stderr, "--%s", opts->long_name);

	switch (opts->type) {
	case OPTION_ARGUMENT:
		break;
	case OPTION_LONG:
	case OPTION_U64:
	case OPTION_INTEGER:
	case OPTION_UINTEGER:
		if (opts->flags & PARSE_OPT_OPTARG)
			if (opts->long_name)
				pos += fprintf(stderr, "[=<n>]");
			else
				pos += fprintf(stderr, "[<n>]");
		else
			pos += fprintf(stderr, " <n>");
		break;
	case OPTION_CALLBACK:
		if (opts->flags & PARSE_OPT_NOARG)
			break;
		/* FALLTHROUGH */
	case OPTION_STRING:
		if (opts->argh) {
			if (opts->flags & PARSE_OPT_OPTARG)
				if (opts->long_name)
					pos += fprintf(stderr, "[=<%s>]", opts->argh);
				else
					pos += fprintf(stderr, "[<%s>]", opts->argh);
			else
				pos += fprintf(stderr, " <%s>", opts->argh);
		} else {
			if (opts->flags & PARSE_OPT_OPTARG)
				if (opts->long_name)
					pos += fprintf(stderr, "[=...]");
				else
					pos += fprintf(stderr, "[...]");
			else
				pos += fprintf(stderr, " ...");
		}
		break;
	default: /* OPTION_{BIT,BOOLEAN,SET_UINT,SET_PTR} */
	case OPTION_END:
	case OPTION_GROUP:
	case OPTION_BIT:
	case OPTION_BOOLEAN:
	case OPTION_INCR:
	case OPTION_SET_UINT:
	case OPTION_SET_PTR:
		break;
	}

	if (pos <= USAGE_OPTS_WIDTH)
		pad = USAGE_OPTS_WIDTH - pos;
	else {
		fputc('\n', stderr);
		pad = USAGE_OPTS_WIDTH;
	}
	fprintf(stderr, "%*s%s\n", pad + USAGE_GAP, "", opts->help);
}

652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690
static int option__cmp(const void *va, const void *vb)
{
	const struct option *a = va, *b = vb;
	int sa = tolower(a->short_name), sb = tolower(b->short_name), ret;

	if (sa == 0)
		sa = 'z' + 1;
	if (sb == 0)
		sb = 'z' + 1;

	ret = sa - sb;

	if (ret == 0) {
		const char *la = a->long_name ?: "",
			   *lb = b->long_name ?: "";
		ret = strcmp(la, lb);
	}

	return ret;
}

static struct option *options__order(const struct option *opts)
{
	int nr_opts = 0;
	const struct option *o = opts;
	struct option *ordered;

	for (o = opts; o->type != OPTION_END; o++)
		++nr_opts;

	ordered = memdup(opts, sizeof(*o) * (nr_opts + 1));
	if (ordered == NULL)
		goto out;

	qsort(ordered, nr_opts, sizeof(*o), option__cmp);
out:
	return ordered;
}

691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708
static bool option__in_argv(const struct option *opt, const struct parse_opt_ctx_t *ctx)
{
	int i;

	for (i = 1; i < ctx->argc; ++i) {
		const char *arg = ctx->argv[i];

		if (arg[0] != '-')
			continue;

		if (arg[1] == opt->short_name ||
		    (arg[1] == '-' && opt->long_name && strcmp(opt->long_name, arg + 2) == 0))
			return true;
	}

	return false;
}

709
int usage_with_options_internal(const char * const *usagestr,
710 711
				const struct option *opts, int full,
				struct parse_opt_ctx_t *ctx)
712
{
713 714
	struct option *ordered;

715 716 717
	if (!usagestr)
		return PARSE_OPT_HELP;

718 719 720 721 722 723 724
	setup_pager();

	if (strbuf_avail(&error_buf)) {
		fprintf(stderr, "  Error: %s\n", error_buf.buf);
		strbuf_release(&error_buf);
	}

725
	fprintf(stderr, "\n Usage: %s\n", *usagestr++);
726
	while (*usagestr && **usagestr)
727
		fprintf(stderr, "    or: %s\n", *usagestr++);
728 729 730 731 732 733 734 735 736 737
	while (*usagestr) {
		fprintf(stderr, "%s%s\n",
				**usagestr ? "    " : "",
				*usagestr);
		usagestr++;
	}

	if (opts->type != OPTION_GROUP)
		fputc('\n', stderr);

738 739 740 741
	ordered = options__order(opts);
	if (ordered)
		opts = ordered;

742 743 744
	for (  ; opts->type != OPTION_END; opts++) {
		if (ctx && ctx->argc > 1 && !option__in_argv(opts, ctx))
			continue;
745
		print_option_help(opts, full);
746
	}
747 748 749

	fputc('\n', stderr);

750 751
	free(ordered);

752 753 754 755 756 757
	return PARSE_OPT_HELP;
}

void usage_with_options(const char * const *usagestr,
			const struct option *opts)
{
758
	exit_browser(false);
759
	usage_with_options_internal(usagestr, opts, 0, NULL);
760 761 762 763
	exit(129);
}

int parse_options_usage(const char * const *usagestr,
764 765
			const struct option *opts,
			const char *optstr, bool short_opt)
766
{
767
	if (!usagestr)
768
		goto opt;
769

770
	fprintf(stderr, "\n Usage: %s\n", *usagestr++);
771 772 773 774 775 776 777 778 779 780
	while (*usagestr && **usagestr)
		fprintf(stderr, "    or: %s\n", *usagestr++);
	while (*usagestr) {
		fprintf(stderr, "%s%s\n",
				**usagestr ? "    " : "",
				*usagestr);
		usagestr++;
	}
	fputc('\n', stderr);

781
opt:
782 783
	for (  ; opts->type != OPTION_END; opts++) {
		if (short_opt) {
784 785
			if (opts->short_name == *optstr) {
				print_option_help(opts, 0);
786
				break;
787
			}
788 789 790 791 792 793
			continue;
		}

		if (opts->long_name == NULL)
			continue;

794 795 796 797 798
		if (!prefixcmp(opts->long_name, optstr))
			print_option_help(opts, 0);
		if (!prefixcmp("no-", optstr) &&
		    !prefixcmp(opts->long_name, optstr + 3))
			print_option_help(opts, 0);
799 800 801
	}

	return PARSE_OPT_HELP;
802 803 804
}


805 806
int parse_opt_verbosity_cb(const struct option *opt,
			   const char *arg __maybe_unused,
807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826
			   int unset)
{
	int *target = opt->value;

	if (unset)
		/* --no-quiet, --no-verbose */
		*target = 0;
	else if (opt->short_name == 'v') {
		if (*target >= 0)
			(*target)++;
		else
			*target = 1;
	} else {
		if (*target <= 0)
			(*target)--;
		else
			*target = -1;
	}
	return 0;
}
827 828 829 830 831 832 833 834 835 836 837 838 839

void set_option_flag(struct option *opts, int shortopt, const char *longopt,
		     int flag)
{
	for (; opts->type != OPTION_END; opts++) {
		if ((shortopt && opts->short_name == shortopt) ||
		    (opts->long_name && longopt &&
		     !strcmp(opts->long_name, longopt))) {
			opts->flags |= flag;
			break;
		}
	}
}