Modify

Opened 12 years ago

Closed 7 years ago

#545 closed Bugs (fixed)

Program_options: Fails to parse options with a common root

Reported by: rleigh Owned by: Vladimir Prus
Milestone: Boost 1.44.0 Component: program_options
Version: Boost Development Trunk Severity: Problem
Keywords: Cc:

Description

Given the following testcase:

#include <iostream>
#include <boost/program_options.hpp>
namespace opt = boost::program_options;

int main(int   argc,
	 char *argv[])
{
  try
    {
      bool all, all_chroots, all_sessions;

      opt::options_description chroot("Chroot selection");
      chroot.add_options()
	("all,a", "Select all chroots and active sessions")
	("all-chroots", "Select all chroots")
	("all-sessions", "Select all active sessions");

      opt::variables_map vm;
      opt::store(opt::parse_command_line(argc, argv,
chroot), vm);
      opt::notify(vm);

      if (vm.count("all"))
	all = true;
      if (vm.count("all-chroots"))
	all_chroots = true;
      if (vm.count("all-sessions"))
	all_sessions = true;

      return 0;
    }
  catch (std::exception const& e)
    {
      std::cerr << e.what() << std::endl;
      return 1;
    }
}

$ g++ -o opt opt.cc -lboost_program_options
$ ./opt --help
unknown option help
$ ./opt --all-chroots
$ ./opt --all-sessions
$ ./opt --all
ambiguous option all

--all is not abiguous, since it's an exact match.  It's
not ambigous for GNU getopt or GLib GOption, so this is
IMHO a bug.


Regards,
Roger

ii  libboost-dev                  1.33.0-6   Boost C++
Libraries development fi
ii  libboost-program-options1.33. 1.33.0-6   program
options library for C++

Attachments (1)

program_options.patch (1.7 KB) - added by christian.blichmann@… 7 years ago.
Patch for parsing options with same name-prefix

Download all attachments as: .zip

Change History (6)

comment:1 Changed 12 years ago by Vladimir Prus

Status: assignedclosed
Logged In: YES 
user_id=321498

A fix and a test were just committed. 
Thanks for the report! 

Changed 7 years ago by christian.blichmann@…

Attachment: program_options.patch added

Patch for parsing options with same name-prefix

comment:2 Changed 7 years ago by christian.blichmann@…

Severity: Problem

As of Boost 1.43.0 this is still problematic, see the test case below:

#include <iostream> #include <boost/program_options.hpp> namespace po = boost::program_options;

int main(int argc, char *argv[]) {

try {

bool all, all_chroots, all_sessions;

po::options_description chroot("Chroot selection"); chroot.add_options()

("flag", "Some boolean flag") ("flag2", "Another flag that gets matched approximately");

po::variables_map vm; po::store(po::parse_command_line(argc, argv, chroot), vm); po::notify(vm);

std::cout << "flag: " << vm.count("flag") << std::endl; std::cout << "flag2: " << vm.count("flag2") << std::endl;

return 0;

} catch (std::exception const& e) {

std::cerr << e.what() << std::endl; return 1;

}

}

Results:

$ g++ -o po-test po-test.cpp -lboost_program_options $ ./po-test --flag flag: 0 flag2: 1 $ ./po-test --flag2 flag: 0 flag2: 1 $ ./po-test --flag --flag2 multiple occurrences

Expected results (after applying program_options.patch):

$ ./po-test --flag flag: 1 flag2: 0 $ ./po-test --flag2 flag: 0 flag2: 1 $ ./po-test --flag --flag2 flag: 1 flag2: 1

comment:3 Changed 7 years ago by christian.blichmann@…

Component: Noneprogram_options
Milestone: Boost 1.44.0
Resolution: Fixed
Status: closedreopened
Summary: Proogram_options: Fails to parse options with a common rootProgram_options: Fails to parse options with a common root
Version: NoneBoost Development Trunk

comment:4 Changed 7 years ago by Vladimir Prus

You have set 'version' to 'Boost Development Trunk'. Have you actually tried with trunk? I guess not, since trunk appears to give your expected results on your testcase. Could you please double-check with trunk, and then mark this issue fixed again?

comment:5 in reply to:  4 Changed 7 years ago by christian.blichmann@…

Resolution: fixed
Status: reopenedclosed

Replying to vladimir_prus:

You have set 'version' to 'Boost Development Trunk'. Have you actually tried with trunk? I guess not, since trunk appears to give your expected results on your testcase. Could you please double-check with trunk, and then mark this issue fixed again?

You're right, trunk fixes the problem. I selected "Trunk" by mistake, sorry. Setting to "fixed" again.

Modify Ticket

Change Properties
Set your email in Preferences
Action
as closed The owner will remain Vladimir Prus.
The resolution will be deleted.

Add Comment


E-mail address and name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.