Improve diagnostics of lls_check_arg_count().
authorAndre Noll <maan@tuebingen.mpg.de>
Wed, 6 Feb 2019 17:49:06 +0000 (18:49 +0100)
committerAndre Noll <maan@tuebingen.mpg.de>
Thu, 28 Mar 2019 09:48:41 +0000 (10:48 +0100)
The old code could return an error message like

at least 1 non-option args required, 0 given

even if exactly 1 arg is required. So check this case and print

exactly 1 non-option args required, 0 given

instead. The check for the upper bound has the same issue. It is
considered a bug in the application if min_argc > max_argc, so check
for this case as well.

lopsub.c

index 44abc93..d495663 100644 (file)
--- a/lopsub.c
+++ b/lopsub.c
@@ -724,9 +724,11 @@ int lls_check_arg_count(const struct lls_parse_result *lpr,
 {
        if (errctx)
                *errctx = NULL;
+       assert(min_argc <= max_argc);
        if (lpr->num_inputs < min_argc) {
-               xasprintf(errctx, "at least %u non-option args required, "
-                       "%u given", min_argc, lpr->num_inputs);
+               xasprintf(errctx, "%s %u non-option args required, %u given",
+                       min_argc < max_argc? "at least" : "exactly",
+                       min_argc, lpr->num_inputs);
                return -E_LLS_BAD_ARG_COUNT;
        }
        if (lpr->num_inputs > max_argc) {
@@ -734,8 +736,10 @@ int lls_check_arg_count(const struct lls_parse_result *lpr,
                        xasprintf(errctx, "no non-option args allowed, "
                                "%u given", lpr->num_inputs);
                else
-                       xasprintf(errctx, "at most %u non-option args allowed, "
-                               "%u given", max_argc, lpr->num_inputs);
+                       xasprintf(errctx, "%s %u non-option args allowed, "
+                               "%u given", min_argc < max_argc?
+                               "at most" : "exactly",
+                               max_argc, lpr->num_inputs);
                return -E_LLS_BAD_ARG_COUNT;
        }
        return 1;