Merge branch 'rs/parse-options-concat-dup'

Code clean-up.

* rs/parse-options-concat-dup:
  parse-options: simplify parse_options_dup()
  parse-options: const parse_options_concat() parameters
  parse-options: factor out parse_options_count()
  parse-options: use COPY_ARRAY in parse_options_concat()
This commit is contained in:
Junio C Hamano 2020-02-17 13:22:17 -08:00
commit cbecc168d4
2 changed files with 19 additions and 27 deletions

View File

@ -159,40 +159,32 @@ int parse_opt_tertiary(const struct option *opt, const char *arg, int unset)
return 0; return 0;
} }
struct option *parse_options_dup(const struct option *o) static size_t parse_options_count(const struct option *opt)
{ {
const struct option *orig = o; size_t n = 0;
struct option *opts;
int nr = 0;
while (o && o->type != OPTION_END) { for (; opt && opt->type != OPTION_END; opt++)
nr++; n++;
o++; return n;
}
ALLOC_ARRAY(opts, nr + 1);
COPY_ARRAY(opts, orig, nr);
memset(opts + nr, 0, sizeof(*opts));
opts[nr].type = OPTION_END;
return opts;
} }
struct option *parse_options_concat(struct option *a, struct option *b) struct option *parse_options_dup(const struct option *o)
{
struct option no_options[] = { OPT_END() };
return parse_options_concat(o, no_options);
}
struct option *parse_options_concat(const struct option *a,
const struct option *b)
{ {
struct option *ret; struct option *ret;
size_t i, a_len = 0, b_len = 0; size_t a_len = parse_options_count(a);
size_t b_len = parse_options_count(b);
for (i = 0; a[i].type != OPTION_END; i++)
a_len++;
for (i = 0; b[i].type != OPTION_END; i++)
b_len++;
ALLOC_ARRAY(ret, st_add3(a_len, b_len, 1)); ALLOC_ARRAY(ret, st_add3(a_len, b_len, 1));
for (i = 0; i < a_len; i++) COPY_ARRAY(ret, a, a_len);
ret[i] = a[i]; COPY_ARRAY(ret + a_len, b, b_len + 1); /* + 1 for final OPTION_END */
for (i = 0; i < b_len; i++)
ret[a_len + i] = b[i];
ret[a_len + b_len] = b[b_len]; /* final OPTION_END */
return ret; return ret;
} }

View File

@ -281,7 +281,7 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
int parse_options_end(struct parse_opt_ctx_t *ctx); int parse_options_end(struct parse_opt_ctx_t *ctx);
struct option *parse_options_dup(const struct option *a); struct option *parse_options_dup(const struct option *a);
struct option *parse_options_concat(struct option *a, struct option *b); struct option *parse_options_concat(const struct option *a, const struct option *b);
/*----- some often used options -----*/ /*----- some often used options -----*/
int parse_opt_abbrev_cb(const struct option *, const char *, int); int parse_opt_abbrev_cb(const struct option *, const char *, int);