36#include <snapdev/join_strings.h>
37#include <snapdev/tokenize_format.h>
48#include <snapdev/poison.h>
70 bool add_long_help(
false);
71 bool add_system_help(
false);
84 add_system_help =
true;
94 opt->set_help(
"show all the help from all the available options.");
98 opt->set_short_name(L
'?');
109 opt->set_help(
"show commands and options added by libraries.");
113 opt->set_short_name(L
'S');
132 if(grp->f_name !=
nullptr
133 && *grp->f_name !=
'\0')
135 std::string
const name(grp->f_name);
136 std::string
const option_name(name +
"-help");
141 opt->set_help(
"show help from the \""
143 +
"\" group of options.");
174 throw getopt_logic_error(
"group parameter must represent a valid group.");
178 throw getopt_logic_error(
"group NONE cannot be assigned a name so you cannot search for it.");
185 if(group == grp->f_group)
187 if((grp->f_name ==
nullptr || *grp->f_name ==
'\0')
188 && (grp->f_description ==
nullptr || *grp->f_description ==
'\0'))
190 throw getopt_logic_error(
"at least one of a group name or description must be defined (a non-empty string).");
239 std::stringstream ss;
254 std::string save_default;
255 std::string save_help;
272 std::multimap<advgetopt::option_info::pointer_t, advgetopt::option_info::pointer_t> alias_reverse_references;
279 alias_reverse_references.insert(std::make_pair(opt.second->get_alias_destination(), opt.second));
282 for(; pos <= group_max; ++pos)
284 bool group_name_shown(
false);
297 std::string
const help(opt.second->get_help());
316 if(!opt.second->has_flag(show))
333 if(!group_name_shown)
335 group_name_shown =
true;
348 std::stringstream argument;
350 if(opt.second->is_default_option())
355 argument <<
"[default argument]";
359 argument <<
"<default argument>";
363 argument <<
"[default arguments]";
367 argument <<
"<default arguments>";
374 argument <<
"--" << opt.second->get_name();
375 auto aliases(alias_reverse_references.lower_bound(opt.second));
376 if(aliases->first == opt.second)
378 auto end(alias_reverse_references.upper_bound(opt.second));
379 for(
auto a(aliases); a != end; ++a)
381 argument <<
" or --" << a->second->get_name();
388 if(aliases->first == opt.second)
390 auto end(alias_reverse_references.upper_bound(opt.second));
391 for(; aliases != end; ++aliases)
403 argument <<
" [<arg>]";
407 argument <<
" <arg>";
411 argument <<
" {<arg>}";
415 argument <<
" <arg> {<arg>}";
426 if(opt.second->has_default())
428 argument <<
" (default is \""
429 << opt.second->get_default()
435 if(opt.second->is_default_option())
437 save_default = argument.str();
442 std::string variable_name;
443 if(!opt.second->get_environment_variable_name().empty())
445 variable_name +=
"\nEnvironment Variable Name: \"";
450 variable_name += opt.second->get_environment_variable_name();
451 variable_name +=
'"';
461 if(!save_default.empty())
485 static bool is_flag(
char c, snapdev::format_item<char> & f)
492 f.add_error(snapdev::format_error_t::FORMAT_ERROR_DUPLICATE);
508 static std::string::size_type
is_format(
char const * s, snapdev::format_item<char> & f)
534 f.add_error(snapdev::format_error_t::FORMAT_ERROR_UNKNOWN);
596 return std::string();
599 snapdev::format_item<char>::list_t items(snapdev::tokenize_format<
604 for(
auto it(items.begin()); it != items.end(); ++it)
637 *directories !=
nullptr;
644 joined += *directories;
696 *filenames !=
nullptr;
703 joined += *filenames;
717 it->string(snapdev::join_strings(list,
", "));
780 it->string(snapdev::join_strings(list,
", "));
787 snapdev::format_item<char> empty_item;
788 return snapdev::join_strings(items, empty_item);
Definitions of the advanced getopt class.
string_list_t get_configuration_filenames(bool exists, bool writable, int argc=0, char *argv[]=nullptr) const
Generate a list of configuration filenames.
options_environment f_options_environment
option_info::map_by_name_t f_options_by_name
std::string f_program_name
std::string usage(flag_t show=GETOPT_FLAG_SHOW_MOST) const
Create a string of the command line arguments.
option_info::map_by_short_name_t f_options_by_short_name
std::string f_program_fullname
std::string get_options_filename() const
Get the path and filename to options.
group_description const * find_group(flag_t group) const
Search for group in the list of group names.
std::string get_output_filename() const
Determine the best suited file for updates.
void parse_options_from_group_names()
Transform group names in –<name>-help commands.
std::string process_help_string(char const *help) const
Change the % flags in help strings.
std::shared_ptr< option_info > pointer_t
static constexpr snapdev::format_flag_t const FORMAT_FLAG_EXTENDED
static bool is_flag(char c, snapdev::format_item< char > &f)
static std::string::size_type is_format(char const *s, snapdev::format_item< char > &f)
Definitions of the advanced getopt exceptions.
The advgetopt environment to parse command line options.
size_t get_screen_width()
Retrieve the width of one line in your console.
static constexpr flag_t GETOPT_FLAG_GROUP_MINIMUM
static constexpr flag_t GETOPT_FLAG_GROUP_MASK
static constexpr flag_t GETOPT_FLAG_SHOW_USAGE_ON_ERROR
std::string breakup_line(std::string line, size_t const option_width, size_t const line_width)
Breakup a string on multiple lines.
static constexpr flag_t GETOPT_FLAG_SHOW_GROUP1
static constexpr flag_t GETOPT_FLAG_SHOW_SYSTEM
static constexpr flag_t GETOPT_FLAG_GROUP_MAXIMUM
static constexpr flag_t GETOPT_FLAG_DYNAMIC_CONFIGURATION
static constexpr flag_t GETOPT_FLAG_COMMAND_LINE
constexpr short_name_t NO_SHORT_NAME
static constexpr flag_t GETOPT_FLAG_SHOW_GROUP2
std::string format_usage_string(std::string const &argument, std::string const &help, size_t const option_width, size_t const line_width)
Format a help string to make it fit on a given width.
static constexpr flag_t GETOPT_FLAG_GROUP_SHIFT
static constexpr flag_t GETOPT_FLAG_FLAG
static constexpr flag_t GETOPT_FLAG_GROUP_COMMANDS
static constexpr flag_t GETOPT_FLAG_GROUP_NONE
std::string short_name_to_string(short_name_t short_name)
Convert a short name to a UTF-8 string.
static constexpr flag_t GETOPT_FLAG_MULTIPLE
static constexpr flag_t GETOPT_FLAG_REQUIRED
std::vector< std::string > string_list_t
static constexpr flag_t GETOPT_FLAG_SHOW_ALL
static constexpr flag_t GETOPT_FLAG_ALIAS
char const * f_description
char const * f_help_footer
char const *const * f_configuration_directories
char const * f_help_header
char const * f_build_date
char const * f_build_time
char const * f_environment_variable_intro
char const * f_section_variables_name
char const * f_project_name
char const * f_environment_variable_name
char const *const * f_configuration_files
group_description const * f_groups
char const * f_group_name