static bool option_is_metadata(const Option *opt) {
/* A metadata entry that is not a real option, like the group marker */
- return FLAGS_SET(ASSERT_PTR(opt)->flags, OPTION_GROUP_MARKER);
+ return FLAGS_SET(ASSERT_PTR(opt)->flags, OPTION_GROUP_MARKER) ||
+ FLAGS_SET(ASSERT_PTR(opt)->flags, OPTION_HELP_ENTRY);
}
static void kill_arg(char* argv[], int argc, int index) {
if (group_marker)
break; /* End of group */
- assert(!option_is_metadata(opt));
-
if (!opt->help)
/* No help string — we do not show the option */
continue;
OPTION_OPTIONAL_ARG = 1U << 0, /* Same as optional_argument in getopt */
OPTION_STOPS_PARSING = 1U << 1, /* This option acts like "--" */
OPTION_GROUP_MARKER = 1U << 2, /* Fake option entry to separate groups */
+ OPTION_HELP_ENTRY = 1U << 3, /* Fake option entry to insert an additional help line */
} OptionFlags;
typedef struct Option {
#define OPTION_FULL(fl, sc, lc, mv, h) _OPTION(__COUNTER__, fl, sc, lc, mv, h)
#define OPTION(sc, lc, mv, h) OPTION_FULL(/* fl= */ 0, sc, lc, mv, h)
#define OPTION_LONG(lc, mv, h) OPTION(/* sc= */ 0, lc, mv, h)
+#define OPTION_LONG_FLAGS(fl, lc, mv, h) OPTION_FULL(fl, /* sc= */ 0, lc, mv, h)
#define OPTION_SHORT(sc, mv, h) OPTION(sc, /* lc= */ NULL, mv, h)
+#define OPTION_SHORT_FLAGS(fl, sc, mv, h) OPTION_FULL(fl, sc, /* lc= */ NULL, mv, h)
#define OPTION_COMMON_HELP \
OPTION('h', "help", NULL, "Show this help")