+static int
+_os_subcommand_be_helpful(const os_subcommand_t *osc,
+ int argc, const char *argv[])
+{
+ int res = 0;
+
+ if (osc->osc_flags & OS_SUBCOMMAND_FLAG_HELPFUL) {
+ if (argc == 1) {
+ _os_subcommand_print_usage(osc, stdout);
+ res = 1;
+ goto __out;
+ }
+ }
+
+ if (osc->osc_flags & OS_SUBCOMMAND_FLAG_HELPFUL_FIRST_OPTION) {
+ if (argc == 2 && (strcmp(argv[1], "help") == 0 ||
+ strcmp(argv[1], "-h") == 0 ||
+ strcmp(argv[1], "-help") == 0 ||
+ strcmp(argv[1], "--help") == 0)) {
+ _os_subcommand_print_usage(osc, stdout);
+ res = 1;
+ goto __out;
+ }
+ }
+
+__out:
+ return res;
+}
+
+static void
+_print_subcommand_list(const os_subcommand_t *osc, FILE *f)
+{
+ const os_subcommand_t **oscip = NULL;
+ bool header_printed = false;
+
+ LINKER_SET_FOREACH(oscip, const os_subcommand_t **,
+ SUBCOMMAND_LINKER_SET) {
+ const os_subcommand_t *osci = *oscip;
+
+ _print_header(f, "SUBCOMMANDS", &header_printed);
+
+ if ((osci->osc_flags & OS_SUBCOMMAND_FLAG_MAIN) ||
+ (osci->osc_flags & OS_SUBCOMMAND_FLAG_HIDDEN)) {
+ continue;
+ }
+
+ _os_subcommand_print_help_line(osci, f);
+ }
+
+ // Print the help subcommand last.
+ _os_subcommand_print_help_line(osc, f);
+}
+