- /* Option argument */
- parse_orig_arg_opt_ret = parse_orig_arg_opt(orig_arg,
- next_orig_arg, descrs, &parse_ret, &used_next_orig_arg);
- switch (parse_orig_arg_opt_ret) {
- case PARSE_ORIG_ARG_OPT_RET_OK:
- break;
- case PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT:
- ARGPAR_ASSERT(!used_next_orig_arg);
+ iter->non_opt_index++;
+ iter->i++;
+ *item = &non_opt_item->base;
+ status = ARGPAR_ITER_PARSE_NEXT_STATUS_OK;
+ goto end;
+ }
+
+ /* 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;
+ }