// Had to be tweaked slightly to work with glibmm2.4 as installed in student environment.
/* Copyright (C) 2004 The glibmm Development Team
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*/
#include
#include
#include
using std::cout;
using std::endl;
class ExampleOptionGroup : public Glib::OptionGroup {
public:
ExampleOptionGroup();
private:
bool on_pre_parse( Glib::OptionContext& context, Glib::OptionGroup & group ) override;
bool on_post_parse( Glib::OptionContext& context, Glib::OptionGroup & group ) override;
void on_error( Glib::OptionContext& context, Glib::OptionGroup & group ) override;
bool on_option_arg_string( const Glib::ustring& option_name, const Glib::ustring& value, bool has_value );
bool on_option_arg_filename( const Glib::ustring& option_name, const std::string& value, bool has_value );
public:
// These members should live as long as the OptionGroup to which they are added,
// and as long as the OptionContext to which that OptionGroup is added.
int m_arg_foo;
std::string m_arg_filename;
Glib::ustring m_arg_goo;
bool m_arg_boolean;
Glib::OptionGroup::vecustrings m_arg_list;
Glib::OptionGroup::vecustrings m_remaining_list;
Glib::ustring m_arg_x_string;
std::string m_arg_x_filename;
};
ExampleOptionGroup::ExampleOptionGroup():
Glib::OptionGroup{"example_group", "description of example group", "help description of example group"},
m_arg_foo{0}, m_arg_boolean{false}
{
Glib::OptionEntry entry1;
entry1.set_long_name("foo");
entry1.set_short_name('f');
entry1.set_description("The Foo");
add_entry(entry1, m_arg_foo);
Glib::OptionEntry entry2;
entry2.set_long_name("file");
entry2.set_short_name('F');
entry2.set_description("The Filename");
add_entry_filename(entry2, m_arg_filename);
Glib::OptionEntry entry3;
entry3.set_long_name("goo");
entry3.set_short_name('g');
entry3.set_description("The Goo");
// We can choose a default to be used if the user doesn't specify this option.
m_arg_goo = "default-goo-value";
add_entry(entry3, m_arg_goo);
Glib::OptionEntry entry4;
entry4.set_long_name("activate_something");
entry4.set_description("Activate something");
add_entry(entry4, m_arg_boolean);
Glib::OptionEntry entry5;
entry5.set_long_name("list");
entry5.set_short_name('l');
entry5.set_description("A List");
add_entry(entry5, m_arg_list);
Glib::OptionEntry entry6;
entry6.set_long_name("x-string");
entry6.set_short_name('x');
entry6.set_description("A string with custom parsing");
entry6.set_flags(Glib::OptionEntry::Flags::FLAG_OPTIONAL_ARG);
m_arg_x_string = "not specified";
add_entry(entry6, sigc::mem_fun(*this, &ExampleOptionGroup::on_option_arg_string));
Glib::OptionEntry entry7;
entry7.set_long_name("x-filename");
entry7.set_short_name('X');
entry7.set_description("A filename with custom parsing");
entry7.set_flags(Glib::OptionEntry::Flags::FLAG_OPTIONAL_ARG);
m_arg_x_filename = "not specified";
add_entry_filename(entry7, sigc::mem_fun(*this, &ExampleOptionGroup::on_option_arg_filename));
Glib::OptionEntry entry_remaining;
entry_remaining.set_long_name(G_OPTION_REMAINING);
add_entry(entry_remaining, m_remaining_list);
} // ExampleOptionGroup::ExampleOptionGroup
bool ExampleOptionGroup::on_pre_parse(Glib::OptionContext& /* context */, Glib::OptionGroup & group ) {
// This is called before the m_arg_* instances are given their values.
// You do not need to override this method. This is just here to show you how,
// in case you want to do any extra processing.
cout << "on_pre_parse called" << endl;
return true;
} // ExampleOptionGroup::on_pre_parse
bool ExampleOptionGroup::on_post_parse( Glib::OptionContext& /* context */, Glib::OptionGroup & group ) {
// This is called after the m_arg_* instances are given their values.
// You do not need to override this method. This is just here to show you how,
// in case you want to do any extra processing.
cout << "on_post_parse called" << endl;
return true;
} // ExampleOptionGroup::on_post_parse
void ExampleOptionGroup::on_error( Glib::OptionContext& /* context */, Glib::OptionGroup & group ) {
cout << "on_error called" << endl;
} // ExampleOptionGroup::on_error
bool ExampleOptionGroup::on_option_arg_string( const Glib::ustring& option_name, const Glib::ustring& value,
bool has_value)
{
if ( option_name != "-x" && option_name != "--x-string" ) {
m_arg_x_string = "on_option_arg_string called with unexpected option_name: " + option_name;
throw Glib::OptionError(Glib::OptionError::UNKNOWN_OPTION, m_arg_x_string);
}
if ( !has_value ) {
m_arg_x_string = "no value";
return true;
}
if ( value.empty() ) {
m_arg_x_string = "empty string";
return true;
}
m_arg_x_string = value;
if ( value == "error" ) {
throw Glib::OptionError(
Glib::OptionError::BAD_VALUE, "on_option_arg_string called with value = " + m_arg_x_string);
}
return value != "false";
} // ExampleOptionGroup::on_option_arg_string
bool ExampleOptionGroup::on_option_arg_filename( const Glib::ustring& option_name, const std::string& value,
bool has_value )
{
if ( option_name != "-X" && option_name != "--x-filename" ) {
m_arg_x_filename = "on_option_arg_filename called with unexpected option_name: " + option_name;
throw Glib::OptionError(Glib::OptionError::UNKNOWN_OPTION, m_arg_x_filename);
}
if ( !has_value ) {
m_arg_x_filename = "no value";
return true;
}
if ( value.empty() ) {
m_arg_x_filename = "empty string";
return true;
}
m_arg_x_filename = value;
if ( value == "error" ) {
throw Glib::OptionError(Glib::OptionError::BAD_VALUE,
"on_option_arg_filename called with value = " + m_arg_x_filename);
}
return value != "false";
} // ExampleOptionGroup::on_option_arg_filename
int main( int argc, char** argv ) {
// This example should be executed like so:
//./example --foo=1 --bar=2 --goo=abc
//./example --help
Glib::init();
// Set up the current locale.
setlocale( LC_ALL, "" );
Glib::OptionContext context;
ExampleOptionGroup group;
context.set_main_group(group);
try {
context.parse(argc, argv);
} catch ( const Glib::Error& ex ) {
cout << "Exception: " << ex.what() << endl;
}
cout << "parsed values: " << endl
<< " foo = " << group.m_arg_foo << endl
<< " filename = " << group.m_arg_filename << endl
<< " activate_something = " << (group.m_arg_boolean ? "enabled" : "disabled")
<< endl
<< " goo = " << group.m_arg_goo << endl
<< " x-string = " << group.m_arg_x_string << endl
<< " x-filename = " << group.m_arg_x_filename << endl;
// This one shows the results of multiple instance of the same option, such as --list=1 --list=a
// --list=b
cout << " list = ";
for ( const auto & i : group.m_arg_list ) cout << i << ", ";
cout << endl;
// This one shows the remaining arguments on the command line, which had no name= form:
cout << " remaining = ";
for ( const auto & i : group.m_remaining_list ) cout << i << ", ";
cout << endl;
return 0;
} // main