Rename argpar_iter_get_ingested_orig_args() -> argpar_iter_ingested_orig_args()
[argpar.git] / argpar / argpar.c
index a37efd000c9edf2edbbf65c5c02f2069e47ee151..f324d7fb130355a42ef07583cfcd520f09f2e324 100644 (file)
@@ -33,8 +33,8 @@
 /*
  * An argpar iterator.
  *
- * Such a structure contains the state of an iterator between
- * calls to argpar_iter_parse_next().
+ * Such a structure contains the state of an iterator between calls to
+ * argpar_iter_next().
  */
 struct argpar_iter {
        /*
@@ -47,7 +47,7 @@ struct argpar_iter {
 
        /*
         * Index of the argument to process in the next
-        * argpar_iter_parse_next() call.
+        * argpar_iter_next() call.
         */
        unsigned int i;
 
@@ -58,7 +58,7 @@ struct argpar_iter {
         * Current character of the current short option group: if it's
         * not `NULL`, the parser is in within a short option group,
         * therefore it must resume there in the next
-        * argpar_iter_parse_next() call.
+        * argpar_iter_next() call.
         */
        const char *short_opt_ch;
 };
@@ -398,8 +398,11 @@ end:
 
 enum parse_orig_arg_opt_ret {
        PARSE_ORIG_ARG_OPT_RET_OK,
-       PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT = -2,
-       PARSE_ORIG_ARG_OPT_RET_ERROR = -1,
+       PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT = -1,
+       PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG = -2,
+       PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG = -3,
+       PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG = -4,
+       PARSE_ORIG_ARG_OPT_RET_ERROR_MEMORY = -5,
 };
 
 static
@@ -417,6 +420,7 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
 
        if (strlen(short_opts) == 0) {
                try_append_string_printf(error, "Invalid argument");
+               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG;
                goto error;
        }
 
@@ -427,9 +431,9 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
        /* Find corresponding option descriptor */
        descr = find_descr(descrs, *iter->short_opt_ch, NULL);
        if (!descr) {
-               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT;
                try_append_string_printf(error, "Unknown option `-%c`",
                        *iter->short_opt_ch);
+               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT;
                goto error;
        }
 
@@ -453,6 +457,7 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
                                "Missing required argument for option `-%c`",
                                *iter->short_opt_ch);
                        used_next_orig_arg = false;
+                       ret = PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG;
                        goto error;
                }
        }
@@ -460,6 +465,7 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
        /* Create and append option argument */
        opt_item = create_opt_item(descr, opt_arg);
        if (!opt_item) {
+               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_MEMORY;
                goto error;
        }
 
@@ -480,9 +486,7 @@ enum parse_orig_arg_opt_ret parse_short_opts(const char * const short_opts,
        goto end;
 
 error:
-       if (ret == PARSE_ORIG_ARG_OPT_RET_OK) {
-               ret = PARSE_ORIG_ARG_OPT_RET_ERROR;
-       }
+       ARGPAR_ASSERT(ret != PARSE_ORIG_ARG_OPT_RET_OK);
 
 end:
        return ret;
@@ -515,6 +519,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
 
        if (strlen(long_opt_arg) == 0) {
                try_append_string_printf(error, "Invalid argument");
+               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG;
                goto error;
        }
 
@@ -527,6 +532,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
                if (long_opt_name_size > max_len) {
                        try_append_string_printf(error,
                                "Invalid argument `--%s`", long_opt_arg);
+                       ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG;
                        goto error;
                }
 
@@ -555,6 +561,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
                                try_append_string_printf(error,
                                        "Missing required argument for option `--%s`",
                                        long_opt_name);
+                               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG;
                                goto error;
                        }
 
@@ -568,6 +575,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
                 */
                try_append_string_printf(error,
                        "Unexpected argument for option `--%s`", long_opt_name);
+               ret = PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG;
                goto error;
        }
 
@@ -587,9 +595,7 @@ enum parse_orig_arg_opt_ret parse_long_opt(const char * const long_opt_arg,
        goto end;
 
 error:
-       if (ret == PARSE_ORIG_ARG_OPT_RET_OK) {
-               ret = PARSE_ORIG_ARG_OPT_RET_ERROR;
-       }
+       ARGPAR_ASSERT(ret != PARSE_ORIG_ARG_OPT_RET_OK);
 
 end:
        return ret;
@@ -673,11 +679,11 @@ void argpar_iter_destroy(struct argpar_iter * const iter)
 }
 
 ARGPAR_HIDDEN
-enum argpar_iter_parse_next_status argpar_iter_parse_next(
+enum argpar_iter_next_status argpar_iter_next(
                struct argpar_iter * const iter,
                const struct argpar_item ** const item, char ** const error)
 {
-       enum argpar_iter_parse_next_status status;
+       enum argpar_iter_next_status status;
        enum parse_orig_arg_opt_ret parse_orig_arg_opt_ret;
        const char *orig_arg;
        const char *next_orig_arg;
@@ -689,7 +695,7 @@ enum argpar_iter_parse_next_status argpar_iter_parse_next(
        }
 
        if (iter->i == iter->argc) {
-               status = ARGPAR_ITER_PARSE_NEXT_STATUS_END;
+               status = ARGPAR_ITER_NEXT_STATUS_END;
                goto end;
        }
 
@@ -704,14 +710,14 @@ enum argpar_iter_parse_next_status argpar_iter_parse_next(
                                iter->non_opt_index);
 
                if (!non_opt_item) {
-                       status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR;
+                       status = ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY;
                        goto end;
                }
 
                iter->non_opt_index++;
                iter->i++;
                *item = &non_opt_item->base;
-               status = ARGPAR_ITER_PARSE_NEXT_STATUS_OK;
+               status = ARGPAR_ITER_NEXT_STATUS_OK;
                goto end;
        }
 
@@ -721,17 +727,35 @@ enum argpar_iter_parse_next_status argpar_iter_parse_next(
                (struct argpar_item **) item);
        switch (parse_orig_arg_opt_ret) {
        case PARSE_ORIG_ARG_OPT_RET_OK:
-               status = ARGPAR_ITER_PARSE_NEXT_STATUS_OK;
+               status = ARGPAR_ITER_NEXT_STATUS_OK;
                break;
        case PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT:
+       case PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG:
+       case PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG:
+       case PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG:
                try_prepend_while_parsing_arg_to_error(error, iter->i,
                        orig_arg);
-               status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT;
+
+               switch (parse_orig_arg_opt_ret) {
+               case PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT:
+                       status = ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT;
+                       break;
+               case PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG:
+                       status = ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG;
+                       break;
+               case PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG:
+                       status = ARGPAR_ITER_NEXT_STATUS_ERROR_INVALID_ARG;
+                       break;
+               case PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG:
+                       status = ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG;
+                       break;
+               default:
+                       abort();
+               }
+
                break;
-       case PARSE_ORIG_ARG_OPT_RET_ERROR:
-               try_prepend_while_parsing_arg_to_error(error, iter->i,
-                       orig_arg);
-               status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR;
+       case PARSE_ORIG_ARG_OPT_RET_ERROR_MEMORY:
+               status = ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY;
                break;
        default:
                abort();
@@ -742,7 +766,7 @@ end:
 }
 
 ARGPAR_HIDDEN
-unsigned int argpar_iter_get_ingested_orig_args(
+unsigned int argpar_iter_ingested_orig_args(
                const struct argpar_iter * const iter)
 {
        return iter->i;
@@ -773,27 +797,32 @@ struct argpar_parse_ret argpar_parse(const unsigned int argc,
        }
 
        while (true) {
-               const enum argpar_iter_parse_next_status status =
-                       argpar_iter_parse_next(iter, &item, &parse_ret.error);
-
-               if (status == ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR) {
+               const enum argpar_iter_next_status status =
+                       argpar_iter_next(iter, &item, &parse_ret.error);
+
+               switch (status) {
+               case ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG:
+               case ARGPAR_ITER_NEXT_STATUS_ERROR_INVALID_ARG:
+               case ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG:
+               case ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY:
                        goto error;
-               } else if (status == ARGPAR_ITER_PARSE_NEXT_STATUS_END) {
-                       break;
-               } else if (status == ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT) {
+               case ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT:
                        if (fail_on_unknown_opt) {
                                parse_ret.ingested_orig_args =
-                                       argpar_iter_get_ingested_orig_args(iter);
+                                       argpar_iter_ingested_orig_args(iter);
                                goto error;
                        }
 
                        free(parse_ret.error);
                        parse_ret.error = NULL;
+                       goto success;
+               case ARGPAR_ITER_NEXT_STATUS_END:
+                       goto success;
+               default:
+                       ARGPAR_ASSERT(status == ARGPAR_ITER_NEXT_STATUS_OK);
                        break;
                }
 
-               ARGPAR_ASSERT(status == ARGPAR_ITER_PARSE_NEXT_STATUS_OK);
-
                if (!push_item(parse_ret.items, item)) {
                        goto error;
                }
@@ -801,8 +830,9 @@ struct argpar_parse_ret argpar_parse(const unsigned int argc,
                item = NULL;
        }
 
+success:
        ARGPAR_ASSERT(!parse_ret.error);
-       parse_ret.ingested_orig_args = argpar_iter_get_ingested_orig_args(iter);
+       parse_ret.ingested_orig_args = argpar_iter_ingested_orig_args(iter);
        goto end;
 
 error:
This page took 0.026709 seconds and 4 git commands to generate.