PARSE_ORIG_ARG_OPT_RET_OK,
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_OPT = -3,
+ 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,
};
if (strlen(short_opts) == 0) {
try_append_string_printf(error, "Invalid argument");
- ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_OPT;
+ ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG;
goto error;
}
if (strlen(long_opt_arg) == 0) {
try_append_string_printf(error, "Invalid argument");
- ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_OPT;
+ ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG;
goto error;
}
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_OPT;
+ ret = PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG;
goto error;
}
iter->non_opt_index);
if (!non_opt_item) {
- status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR;
+ status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MEMORY;
goto end;
}
status = ARGPAR_ITER_PARSE_NEXT_STATUS_OK;
break;
case PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT:
- try_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_MISSING_OPT_ARG:
- case PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_OPT:
+ case PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG:
case PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG:
- case PARSE_ORIG_ARG_OPT_RET_ERROR_MEMORY:
try_prepend_while_parsing_arg_to_error(error, iter->i,
orig_arg);
- status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR;
+
+ switch (parse_orig_arg_opt_ret) {
+ case PARSE_ORIG_ARG_OPT_RET_ERROR_UNKNOWN_OPT:
+ status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT;
+ break;
+ case PARSE_ORIG_ARG_OPT_RET_ERROR_MISSING_OPT_ARG:
+ status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MISSING_OPT_ARG;
+ break;
+ case PARSE_ORIG_ARG_OPT_RET_ERROR_INVALID_ARG:
+ status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_INVALID_ARG;
+ break;
+ case PARSE_ORIG_ARG_OPT_RET_ERROR_UNEXPECTED_OPT_ARG:
+ status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG;
+ break;
+ default:
+ abort();
+ }
+
+ break;
+ case PARSE_ORIG_ARG_OPT_RET_ERROR_MEMORY:
+ status = ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MEMORY;
break;
default:
abort();
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) {
+ switch (status) {
+ case ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MISSING_OPT_ARG:
+ case ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_INVALID_ARG:
+ case ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG:
+ case ARGPAR_ITER_PARSE_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_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT:
if (fail_on_unknown_opt) {
parse_ret.ingested_orig_args =
argpar_iter_get_ingested_orig_args(iter);
free(parse_ret.error);
parse_ret.error = NULL;
+ goto success;
+ case ARGPAR_ITER_PARSE_NEXT_STATUS_END:
+ goto success;
+ default:
+ ARGPAR_ASSERT(status == ARGPAR_ITER_PARSE_NEXT_STATUS_OK);
break;
}
- ARGPAR_ASSERT(status == ARGPAR_ITER_PARSE_NEXT_STATUS_OK);
-
if (!push_item(parse_ret.items, item)) {
goto error;
}
item = NULL;
}
+success:
ARGPAR_ASSERT(!parse_ret.error);
parse_ret.ingested_orig_args = argpar_iter_get_ingested_orig_args(iter);
goto end;
ARGPAR_ITER_PARSE_NEXT_STATUS_OK,
ARGPAR_ITER_PARSE_NEXT_STATUS_END,
ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT,
- ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR,
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MISSING_OPT_ARG,
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_INVALID_ARG,
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG,
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MEMORY,
};
/*
* Parses and returns the next item from `iter`.
*
- * On success, this function sets `*item` to an item which describes the
- * next option or non-option argument and returns
- * `ARGPAR_ITER_PARSE_NEXT_STATUS_OK`. Destroy `*item` with
- * argpar_item_destroy().
+ * On success, this function:
+ *
+ * * Sets `*item` to a parsing item which describes the next option
+ * or non-option argument.
+ *
+ * Destroy `*item` with argpar_item_destroy().
+ *
+ * * Returns `ARGPAR_ITER_PARSE_NEXT_STATUS_OK`.
*
* If there are no more items to return, this function returns
* `ARGPAR_ITER_PARSE_NEXT_STATUS_END`.
*
- * On failure (status codes
- * `ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT` and
- * `ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR`), this function sets `*error`,
- * if not `NULL`, to a descriptive error string. Free `*error` with
- * free().
+ * On failure, this function:
+ *
+ * * Returns one of:
+ *
+ * `ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT`:
+ * Unknown option (not found in `descrs` as passed to
+ * argpar_iter_create() to create `iter`).
+ *
+ * `ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MISSING_OPT_ARG`:
+ * Missing option argument.
+ *
+ * `ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_INVALID_ARG`:
+ * Invalid argument.
+ *
+ * `ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG`:
+ * Unexpected option argument.
+ *
+ * `ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MEMORY`:
+ * Memory error.
*
- * Create an argument parsing iterator with argpar_iter_create().
+ * * Except for the `ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MEMORY` status,
+ * sets `*error`, if not `NULL`, to a descriptive error string.
+ * Free `*error` with free().
*/
enum argpar_iter_parse_next_status argpar_iter_parse_next(
struct argpar_iter *iter, const struct argpar_item **item,
/*
* Parses `cmdline` with the iterator API using the option descriptors
- * `descrs`, and ensures that argpar_iter_parse_next() fails and that it
- * sets an error which is equal to `expected_error`.
+ * `descrs`, and ensures that argpar_iter_parse_next() fails with status
+ * `expected_status` and that it sets an error which is equal to
+ * `expected_error`.
*
* This function splits `cmdline` on spaces to create an original
* argument array.
static
void test_fail_argpar_iter(const char * const cmdline,
const char * const expected_error,
+ const enum argpar_iter_parse_next_status expected_status,
const struct argpar_opt_descr * const descrs)
{
struct argpar_iter *iter = NULL;
ARGPAR_ITEM_DESTROY_AND_RESET(item);
status = argpar_iter_parse_next(iter, &item, &error);
-
ok(status == ARGPAR_ITER_PARSE_NEXT_STATUS_OK ||
- status == ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR ||
- status == ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT,
+ status == expected_status,
"argpar_iter_parse_next() returns the expected status "
"(%d) for command line `%s` (call %u)",
status, cmdline, i + 1);
*/
static
void test_fail(const char * const cmdline, const char * const expected_error,
+ const enum argpar_iter_parse_next_status expected_iter_next_status,
const struct argpar_opt_descr * const descrs)
{
test_fail_argpar_parse(cmdline, expected_error, descrs);
- test_fail_argpar_iter(cmdline, expected_error, descrs);
+ test_fail_argpar_iter(cmdline, expected_error,
+ expected_iter_next_status, descrs);
}
static
test_fail(
"--thumb=party --meow",
"While parsing argument #2 (`--meow`): Unknown option `--meow`",
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT,
descrs);
}
test_fail(
"--thumb=party -x",
"While parsing argument #2 (`-x`): Unknown option `-x`",
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT,
descrs);
}
test_fail(
"--thumb",
"While parsing argument #1 (`--thumb`): Missing required argument for option `--thumb`",
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MISSING_OPT_ARG,
descrs);
}
test_fail(
"-k",
"While parsing argument #1 (`-k`): Missing required argument for option `-k`",
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MISSING_OPT_ARG,
descrs);
}
test_fail(
"-abc",
"While parsing argument #1 (`-abc`): Missing required argument for option `-c`",
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_MISSING_OPT_ARG,
descrs);
}
test_fail(
"-ab - -c",
"While parsing argument #2 (`-`): Invalid argument",
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_INVALID_ARG,
descrs);
}
test_fail(
"-ab -- -c",
"While parsing argument #2 (`--`): Invalid argument",
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_INVALID_ARG,
descrs);
}
test_fail(
"--chevre=fromage",
"While parsing argument #1 (`--chevre=fromage`): Unexpected argument for option `--chevre`",
+ ARGPAR_ITER_PARSE_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG,
descrs);
}
}