FLAGS_SET(ASSERT_PTR(opt)->flags, OPTION_HELP_ENTRY);
}
-static void kill_arg(char* argv[], int argc, int index) {
- assert(index < argc);
- assert(!argv[argc]);
-
- /* Eliminate argv[index] */
- memmove(argv + index, argv + index + 1, (argc - index) * sizeof(char*));
-}
-
static void shift_arg(char* argv[], int target, int source) {
assert(argv);
assert(target <= source);
return 0;
if (streq(argv[state->optind], "--")) {
- /* No more options. Eliminate "--" so that the list of positional args is clean. */
- kill_arg(argv, argc, state->optind);
- return 0;
+ /* No more options. Move "--" before positional args so that
+ * the list of positional args is clean. */
+ shift_arg(argv, state->positional_offset++, state->optind++);
+ state->parsing_stopped = true;
}
if (state->parsing_stopped)
char** option_parser_get_args(const OptionParser *state, int argc, char *argv[]) {
/* Returns positional args as a strv.
- * If "--" was found, it has been removed. */
+ * If "--" was found, it has been moved before state->positional_offset.
+ * The array is only valid, i.e. clean without any options, after parsing
+ * has naturally finished. */
assert(state->optind > 0);
+ assert(state->optind == argc || state->parsing_stopped);
+ assert(state->positional_offset <= argc);
+
return argv + state->positional_offset;
}
+size_t option_parser_get_n_args(const OptionParser *state, int argc) {
+ assert(state->optind > 0);
+ assert(state->optind == argc || state->parsing_stopped);
+ assert(state->positional_offset <= argc);
+
+ return argc - state->positional_offset;
+}
+
int _option_parser_get_help_table(
const Option options[],
const Option options_end[],
#pragma once
#include "shared-forward.h"
-#include "strv.h"
typedef enum OptionFlags {
OPTION_OPTIONAL_ARG = 1U << 0, /* Same as optional_argument in getopt */
FOREACH_OPTION_FULL(parser, opt, argc, argv, /* ret_o= */ NULL, ret_a, on_error)
char** option_parser_get_args(const OptionParser *state, int argc, char *argv[]);
-static inline size_t option_parser_get_n_args(const OptionParser *state, int argc, char *argv[]) {
- return strv_length(option_parser_get_args(state, argc, argv));
-}
+size_t option_parser_get_n_args(const OptionParser *state, int argc);
int _option_parser_get_help_table(
const Option options[],
ASSERT_TRUE(strv_equal(args, remaining));
ASSERT_STREQ(argv[0], saved_argv0);
- ASSERT_EQ(option_parser_get_n_args(&state, argc, argv), strv_length(remaining));
+ ASSERT_EQ(option_parser_get_n_args(&state, argc), strv_length(remaining));
}
static void test_option_invalid_one(