return 0;
}
-/* Print a formated message to a dynamically allocated string. */
+/* Print a formatted message to a dynamically allocated string. */
__attribute__ ((format (printf, 2, 0)))
static int xvasprintf(char **result, const char *fmt, va_list ap)
{
bool multiple;
int idx, ret;
- if (!la->arg)
- goto success;
- if (opt->arg_info == LLS_NO_ARGUMENT) {
+ if (la->arg && opt->arg_info == LLS_NO_ARGUMENT) {
xasprintf(errctx, "arg: %s, option: %s", la->arg, opt->name);
return -E_LLS_ARG_GIVEN;
}
multiple = opt->flags & LLS_MULTIPLE;
+ if (opt->arg_type == LLS_STRING && !opt->values && !multiple) {
+ if (lor->value) { /* discard previous value */
+ free(lor->value[0].string_val);
+ free(lor->value);
+ lor->value = NULL;
+ }
+ }
+ if (!la->arg)
+ goto success;
idx = multiple? lor->given : 0;
- if (lor->given == 0 || multiple) {
- ret = xrealloc(&lor->value,
- (lor->given + 1) * sizeof(*lor->value));
+ if (!lor->value || multiple) {
+ ret = xrealloc(&lor->value, (idx + 1) * sizeof(*lor->value));
if (ret < 0) {
xasprintf(errctx, "option value array for --%s",
opt->name);
}
switch (opt->arg_type) {
case LLS_STRING:
- if (!opt->values && lor->given > 0 && !multiple)
- free(lor->value[idx].string_val);
if (opt->values) {
ret = check_enum_arg(la->arg, opt, errctx);
if (ret < 0)
xasprintf(errctx, "no non-option args allowed, "
"%u given", lpr->num_inputs);
else
- xasprintf(errctx, "%s %u non-option args allowed, "
- "%u given", min_argc < max_argc?
- "at most" : "exactly",
- max_argc, lpr->num_inputs);
+ xasprintf(errctx, "%s %u non-option args %s, %u given",
+ min_argc < max_argc? "at most" : "exactly",
+ max_argc,
+ min_argc < max_argc? "allowed" : "required",
+ lpr->num_inputs);
return -E_LLS_BAD_ARG_COUNT;
}
return 1;