+ /* Option argument */
+ parse_orig_arg_opt_ret = parse_orig_arg_opt(orig_arg,
+ next_orig_arg, iter->descrs, iter, error,
+ (struct argpar_item **) item);
+ switch (parse_orig_arg_opt_ret) {
+ case PARSE_ORIG_ARG_OPT_RET_OK:
+ status = ARGPAR_ITER_PARSE_NEXT_STATUS_OK;
+ break;
+ case PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT:
+ prepend_while_parsing_arg_to_error(error, iter->i, orig_arg);
+ status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT;
+ break;
+ case PARSE_ORIG_ARG_OPT_RET_ERROR:
+ prepend_while_parsing_arg_to_error(error, iter->i, orig_arg);
+ status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR;
+ break;
+ default:
+ abort();
+ }
+
+end:
+ return status;
+}
+
+ARGPAR_HIDDEN
+unsigned int argpar_iter_get_ingested_orig_args(
+ const struct argpar_iter * const iter)
+{
+ return iter->i;
+}
+
+ARGPAR_HIDDEN
+struct argpar_parse_ret argpar_parse(const unsigned int argc,
+ const char * const * const argv,
+ const struct argpar_opt_descr * const descrs,
+ const bool fail_on_unknown_opt)
+{
+ struct argpar_parse_ret parse_ret = { 0 };
+ const struct argpar_item *item = NULL;
+ struct argpar_iter *iter = NULL;
+
+ parse_ret.items = create_item_array();
+ if (!parse_ret.items) {
+ parse_ret.error = strdup("Failed to create items array.");
+ ARGPAR_ASSERT(parse_ret.error);
+ goto error;
+ }
+
+ iter = argpar_iter_create(argc, argv, descrs);
+ if (!iter) {
+ parse_ret.error = strdup("Failed to create argpar iter.");
+ ARGPAR_ASSERT(parse_ret.error);
+ goto error;
+ }
+
+ 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) {
+ goto error;
+ } else if (status == ARGPAR_ITER_PARSE_NEXT_STATUS_END) {
+ break;
+ } else if (status == ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT) {