git-2.22.0/parse-options.c
/*
 * Scan and may produce a new option[] array, which should be used
 * instead of the original 'options'.
 *
 * Right now this is only used to preprocess and substitue
 * OPTION_ALIAS.
 */
Scan and may produce a new option[] array, which should be used
instead of the original 'options'.

Right now this is only used to preprocess and substitue
OPTION_ALIAS.
Scan and may produce a new option [] array which should be used instead of the original ' options ' . Right now this is only used to preprocess and substitue OPTION_ALIAS .
static struct option *preprocess_options(struct parse_opt_ctx_t *ctx,
					 const struct option *options)
{
	struct option *newopt;
	int i, nr, alias;
	int nr_aliases = 0;
	for (nr = 0; options[nr].type != OPTION_END; nr++) {
		if (options[nr].type == OPTION_ALIAS)
			nr_aliases++;
	}
	if (!nr_aliases)
		return NULL;
	ALLOC_ARRAY(newopt, nr + 1);
	COPY_ARRAY(newopt, options, nr + 1);
	CALLOC_ARRAY(ctx->alias_groups, 3 * (nr_aliases + 1));
	for (alias = 0, i = 0; i < nr; i++) {
		int short_name;
		const char *long_name;
		const char *source;
		int j;
		if (newopt[i].type != OPTION_ALIAS)
			continue;
		short_name = newopt[i].short_name;
		long_name = newopt[i].long_name;
		source = newopt[i].value;
		if (!long_name)
			BUG("An alias must have long option name");
		for (j = 0; j < nr; j++) {
			const char *name = options[j].long_name;
			if (!name || strcmp(name, source))
				continue;
			if (options[j].type == OPTION_ALIAS)
				BUG("No please. Nested aliases are not supported.");
			memcpy(newopt + i, options + j, sizeof(*newopt));
			newopt[i].short_name = short_name;
			newopt[i].long_name = long_name;
			break;
		}
		if (j == nr)
			BUG("could not find source option '%s' of alias '%s'",
			    source, newopt[i].long_name);
		ctx->alias_groups[alias * 3 + 0] = newopt[i].long_name;
		ctx->alias_groups[alias * 3 + 1] = options[j].long_name;
		ctx->alias_groups[alias * 3 + 2] = NULL;
		alias++;
	}
	return newopt;
}
static struct option * preprocess_options ( struct parse_opt_ctx_t * ctx , const struct option * options ) { struct option * newopt ; int i , nr , alias ; int nr_aliases = 0 ; for ( nr = 0 ; options [ nr ] . type != OPTION_END ; nr ++ ) { if ( options [ nr ] . type == OPTION_ALIAS ) nr_aliases ++ ; } if ( ! nr_aliases ) return NULL ; ALLOC_ARRAY ( newopt , nr + 1 ) ; COPY_ARRAY ( newopt , options , nr + 1 ) ; CALLOC_ARRAY ( ctx -> alias_groups , 3 * ( nr_aliases + 1 ) ) ; for ( alias = 0 , i = 0 ; i < nr ; i ++ ) { int short_name ; const char * long_name ; const char * source ; int j ; if ( newopt [ i ] . type != OPTION_ALIAS ) continue ; short_name = newopt [ i ] . short_name ; long_name = newopt [ i ] . long_name ; source = newopt [ i ] . value ; if ( ! long_name ) BUG ( " " ) ; for ( j = 0 ; j < nr ; j ++ ) { const char * name = options [ j ] . long_name ; if ( ! name || strcmp ( name , source ) ) continue ; if ( options [ j ] . type == OPTION_ALIAS ) BUG ( " " ) ; memcpy ( newopt + i , options + j , sizeof ( * newopt ) ) ; newopt [ i ] . short_name = short_name ; newopt [ i ] . long_name = long_name ; break ; } if ( j == nr ) BUG ( " " , source , newopt [ i ] . long_name ) ; ctx -> alias_groups [ alias * 3 + 0 ] = newopt [ i ] . long_name ; ctx -> alias_groups [ alias * 3 + 1 ] = options [ j ] . long_name ; ctx -> alias_groups [ alias * 3 + 2 ] = NULL ; alias ++ ; } return newopt ; }
Scan and may produce a new option[] array, which should be used
 instead of the original 'options'.
Scan and may produce a new option [] array which should be used instead of the original ' options ' .
/* each alias has two string pointers and NULL */ /*
			 * NEEDSWORK: this is a bit inconsistent because
			 * usage_with_options() on the original options[] will print
			 * help string as "alias of %s" but "git cmd -h" will
			 * print the original help string.
			 */