diff --git a/parse-options.c b/parse-options.c index d45efa4e5c..30b9e68f8a 100644 --- a/parse-options.c +++ b/parse-options.c @@ -413,30 +413,23 @@ static enum parse_opt_result parse_long_opt( if (((flags ^ opt_flags) & OPT_UNSET) && !allow_unset) continue; - if (!skip_prefix(arg_start, long_name, &rest)) - rest = NULL; - if (!rest) { - /* abbreviated? */ - if (!strncmp(long_name, arg_start, arg_end - arg_start)) { - register_abbrev(p, options, flags ^ opt_flags, - &abbrev, &ambiguous); - } - /* negation allowed? */ - if (options->flags & PARSE_OPT_NONEG) + if (skip_prefix(arg_start, long_name, &rest)) { + if (*rest == '=') + p->opt = rest + 1; + else if (*rest) continue; - /* negated and abbreviated very much? */ - if (starts_with("no-", arg)) { - register_abbrev(p, options, OPT_UNSET ^ opt_flags, - &abbrev, &ambiguous); - } - continue; + return get_value(p, options, flags ^ opt_flags); } - if (*rest) { - if (*rest != '=') - continue; - p->opt = rest + 1; - } - return get_value(p, options, flags ^ opt_flags); + + /* abbreviated? */ + if (!strncmp(long_name, arg_start, arg_end - arg_start)) + register_abbrev(p, options, flags ^ opt_flags, + &abbrev, &ambiguous); + + /* negated and abbreviated very much? */ + if (allow_unset && starts_with("no-", arg)) + register_abbrev(p, options, OPT_UNSET ^ opt_flags, + &abbrev, &ambiguous); } if (disallow_abbreviated_options && (ambiguous.option || abbrev.option))