Compare commits

..

177 Commits

Author SHA1 Message Date
Vladimir Prus
fae2d4c57b Merge from develop for 1.59
- Fix compilation errors, missing dllexport and warnings on
  Windows and/or MSVC (Daniela Engert, Marcel Raad)

- Fix unintialized fields (Zoey Greer)

- Stop options with implicit value from consuming separate tokens (Michael John Decker)

- Make multitoken limit be max int, not 32K (Hans Hohenfeld)

- Code formatting and documentation fixes (Jurko, Lauri Nurmi)

- Minimal support for no-rtti build (Minmin Gong)

- Don't increment environment pointer past the end (Vladimir Prus)
2015-06-09 09:54:19 +03:00
Vladimir Prus
c0cee7f6da Go back to std::type_info in one more place. 2015-05-03 21:55:08 +03:00
Vladimir Prus
0756d35f8b Remove more unnecessary use of boost::type_index. 2015-05-01 19:15:36 +03:00
Vladimir Prus
bd1d0bd861 Put back std::type_info.
Since typed_value_base is only used with RTTI on, there's
no need to avoid std::type_info there.
2015-04-30 22:15:31 +03:00
Minmin Gong
6feeeb3b92 Using type_index to avoid RTTIs in program_options. (fixes #10347) 2015-04-30 22:10:44 +03:00
Marcel Raad
0efb385e99 Protect against max macro
This fixes compilation for MSVC in the case when NOMINMAX is not defined and the program_options include appears after the windows.h include.
2015-04-13 12:27:53 +03:00
Zoey Greer
2c4d25a04b Value-initialize m_desc
Value-initialize m_desc (to NULL) in this constructor to avoid uninitialized memory situations. This issue is related to Coverity CID12523 and was uncovered by Coverity.
2015-04-13 12:26:37 +03:00
Zoey Greer
bae408095f Explicitly initialize m_implicit
m_implicit was previously uninitialized in this constructor, leading to possibly inconsistent functionality. Instead, we now initialize it to false. This issue is related to Coverity CID10559 and was uncovered by Coverity.
2015-04-13 12:24:31 +03:00
Lauri Nurmi
c724b800a8 Fix spelling of "occurrence" where appropriate. 2015-03-29 19:13:14 +03:00
Vladimir Prus
0f9793e369 Make option_groups.cpp compile. 2015-02-15 21:41:48 +03:00
Michael John Decker
0c01e9aadc Add testing for implicit_values and non-consuming of separate tokens. 2014-12-31 02:04:17 +03:00
Michael John Decker
88dea3c6fd Stop options with implicit value from consuming separate tokens.
The current documentation states that if an option has implicit
value, it will only consume adjacent token.
2014-12-30 10:15:10 +03:00
Vladimir Prus
145e5728d7 Unbreak cmdline_test.
There was a k-vs-j loop error introduced by a prior comment.
2014-12-30 10:15:10 +03:00
Vladimir Prus
1d3294a058 Merge pull request #7 from jurko-gospodnetic/develop
Slight documentation cleanup.
2014-12-02 09:13:20 +03:00
Jurko
7542447620 fix documentation typos
environmemt --> environment
does not handles --> does not handle
2014-12-02 01:41:01 +01:00
Jurko
794de34bf9 trim trailing spaces 2014-12-02 01:40:17 +01:00
Vladimir Prus
095cb36f8a Merge pull request #6 from jurko-gospodnetic/develop
Documentation cleanups from  Jurko Gospodnetić:

- trim trailing spaces
- fix documentation typos & style
- escape first dash ('-') in double-dashes ('--') in doxygen comments
This should prevent doxygen from generating bad documentation HTML pages
containing '<ndash></ndash>' where those double-dashes should be.
2014-11-29 10:26:24 +03:00
Jurko
a9ea9bb453 escape first dash ('-') in double-dashes ('--') found in doxygen comments
This should prevent doxygen from generating bad documentation HTML pages
containing '<ndash></ndash>' where those double-dashes should be.
2014-11-27 10:21:48 +01:00
Jurko
3cec23f2ba fix documentation typos & style
typo corrections:
 - otherwisee --> otherwise
 - it's is --> it is
 - nuber --> number
 - will likely to use --> is likely to use
 - varaible --> variable
 - defauled --> defaulted

stylistic changes:
 - which would make --> making
2014-11-27 10:21:48 +01:00
Jurko
fcc4e6ef1a trim trailing spaces 2014-11-27 09:45:10 +01:00
Marcel Raad
1a17f20532 Compile fix for MSVC 14
Also fixes some new variable shadowing warnings
in cmdline_test with Visual C++ 14.
2014-11-24 17:16:21 +03:00
Hans Hohenfeld
6e846597d5 Use maximum unsigned as default multitoken limit.
Fixes #10718.
2014-11-24 17:09:58 +03:00
Daniel James
f081a93643 Add metadata file. 2014-11-24 17:07:37 +03:00
Vladimir Prus
37804b54d4 Remove unnecessary workaround.
Closes #9854.
2014-04-09 14:04:48 +04:00
Vladimir Prus
f50b02750a Don't increment environment pointer past the end.
This should not effect correct programs, since once the
iterator itself is past-the-end, it should not matter what
the underlying state of that iterator is. But, the new behaviour
is more obvious.
2014-01-20 09:28:12 +04:00
Daniela Engert
3ce1c74a0f Suppress msvc level-4 warnings.
Even when compiled at warning level 4 (i.e. all), project
policies may require compilations without warnings issued.

Signed-off-by: Daniela Engert <dani@ngrt.de>
2014-01-09 08:47:21 +04:00
Daniela Engert
2acfab15a3 Fix config_file compilation errors with MSVC
Previous fix 4ae33c for ticket #6797 introduced a new problem with
Visual Studio compilers about two missing methods in
'common_config_file_iterator'. Adding those seemingly not required
methods as empty methods fixes the issue. As an added bonus, the
bogus warnings about DLL-interfaces get a silencing treatment, too.

Tests were run with vc10, vc11, and vc12. Without this fix, the
affected test cases fail on all 3 compilers. With the fix in place,
all tests pass.

Signed-off-by: Daniela Engert <dani@ngrt.de>
2014-01-09 01:19:15 +04:00
Vladimir Prus
4ae33ce15e Add dllexport to common_config_file_iterator.
As reported in #6797, there are linker errors otherwise. I
do not know why regression tests, which test dll linking
explicitly, do not catch this.
2013-12-19 08:16:19 +04:00
Vladimir Prus
fda6414443 Don't use vector<>::data.
This is only required by C++ 11. Most compilers have it anyway,
but there are exceptions, like msvc 8 and msvc 9.
2013-12-19 08:09:13 +04:00
Vladimir Prus
9d7c987526 Remove tabs. 2013-12-04 09:17:17 +04:00
Vladimir Prus
0a7005d7c6 Merge branch 'develop' 2013-12-04 09:13:36 +04:00
Michel Morin
fb4f36f3ee Merge r86524 (Correct broken links to C++ standard papers); fixes #9212
[SVN r86673]
2013-11-13 03:22:55 +00:00
Vladimir Prus
6bf4607eac Align columns across groups in --help output.
Patch from Leo Goodstadt.
Fixes #6114.


[SVN r86571]
2013-11-06 09:23:14 +00:00
Michel Morin
81844db902 Correct broken links to C++ standard papers. Refs #9212.
[SVN r86524]
2013-10-30 12:51:24 +00:00
Stephen Kelly
d3f32ca813 ProgramOptions: Remove obsolete GCC version check.
[SVN r86115]
2013-10-01 08:47:31 +00:00
Stephen Kelly
da03a78b66 Remove obsolete MSVC check from pragma guard
git grep -h -B1 "^#\s*pragma once" | grep -v pragma | sort | uniq

is now clean.

[SVN r85952]
2013-09-26 13:02:51 +00:00
Vladimir Prus
5059a8f393 Silence gcc warning. Thanks to Chris Stylianou.
Closes #8725.


[SVN r84903]
2013-06-24 19:37:37 +00:00
Vladimir Prus
b430a83dfb Fix report of error for options with dashes.
Fixes #8009.
Patch from Markus Roth.


[SVN r82805]
2013-02-10 12:07:05 +00:00
Vladimir Prus
96b365ce17 Revive exception_txt_test.
Found while working on #8009.


[SVN r82804]
2013-02-10 11:59:51 +00:00
Vladimir Prus
2ceb54f9a2 Merge: Really fixes #7049.
[SVN r82556]
2013-01-20 07:13:55 +00:00
Vladimir Prus
f11104084b Really fixes #7049.
[SVN r79477]
2012-07-13 19:06:30 +00:00
Vladimir Prus
a9993a8f01 Fix indent
[SVN r79289]
2012-07-05 17:00:50 +00:00
Vladimir Prus
d27da53324 Fix warnings on 64-bit systems.
Closes #7077.


[SVN r79283]
2012-07-05 13:17:24 +00:00
Vladimir Prus
94fc1c677d Qualify 'distance' with 'std'.
Fixes #7086.


[SVN r79280]
2012-07-05 12:39:16 +00:00
Vladimir Prus
3360ad0ea2 Fix compilation error.
Fixes #7049. Patch from Deniz Bahadir.


[SVN r79164]
2012-06-29 09:04:09 +00:00
Vladimir Prus
5a470bcc41 Adjust spelling.
[SVN r78359]
2012-05-06 17:32:47 +00:00
Vladimir Prus
2eda0313c7 Include necessary header, don't rely on two-phase lookup not being there.
Fixes #6790.


[SVN r78331]
2012-05-05 07:17:28 +00:00
Dave Abrahams
a70de616b0 Summary: Moved libs/detail/utf8_codecvt_facet.cpp to boost/detail/utf8_codecvt_facet.ipp
Author: Dave Abrahams <dave@boostpro.com>


[SVN r78081]
2012-04-19 18:19:20 +00:00
Vladimir Prus
5cbfa80841 Allow to specify how option's value is named in help message.
Fixes #4781.


[SVN r77931]
2012-04-12 08:37:34 +00:00
Vladimir Prus
fd7b310993 Improve error reporting.
The name of option is now shown in most cases when it's feasible, and
clarify of the error messages has been improved throughout.

Patch from Leo Goodstadt.


[SVN r77827]
2012-04-08 08:42:39 +00:00
Vladimir Prus
ae0ecf6581 Make vector print function in examples be more correct.
Fixes #6677.


[SVN r77826]
2012-04-08 08:17:53 +00:00
Vladimir Prus
76a62c1809 Fix warning push/pop mismatch.
Fixes #5869.


[SVN r75064]
2011-10-19 16:20:56 +00:00
Jürgen Hunold
540e300c38 Enable visibility support. Refs #2114.
[SVN r73299]
2011-07-22 12:08:03 +00:00
Vladimir Prus
9d7afca35c Return 0, not 1, when --help is passed.
Fixes #5329.


[SVN r70079]
2011-03-17 21:25:16 +00:00
Vladimir Prus
7051655c76 Clarify docs for 'zero_token'.
Fixes #1132.


[SVN r67774]
2011-01-08 11:45:50 +00:00
Vladimir Prus
825562ed1e Add more testscases. Addresses #4469.
[SVN r67773]
2011-01-08 10:49:06 +00:00
Vladimir Prus
38e7ea8516 Implement variables_map::clear to clear extra members.
Fixes #4927


[SVN r67772]
2011-01-08 10:39:21 +00:00
Vladimir Prus
5b7fbb5fe7 Fix compile error in utf8_codecvt_facet on HPUX.
Closes #5049.


[SVN r67770]
2011-01-08 10:12:43 +00:00
Vladimir Prus
28cafd9bd9 Make program_options compile on iOS.
Patch from Alejandro Isaza.
Fixes #5053.


[SVN r67768]
2011-01-08 09:57:31 +00:00
Marshall Clow
84415c1e7b fix typo
[SVN r67036]
2010-12-05 20:39:19 +00:00
Marshall Clow
c537274c44 Doc fix; refs #4858
[SVN r67030]
2010-12-05 20:16:57 +00:00
Marshall Clow
4b17731e11 update docs; refs #3992
[SVN r67028]
2010-12-05 20:08:40 +00:00
Marshall Clow
56d2c97ece patch tests for Sun; refs #3909
[SVN r67006]
2010-12-04 17:39:24 +00:00
Marshall Clow
e3f331a23b Take argv as const; refs #3909
[SVN r66959]
2010-12-01 18:54:41 +00:00
Vladimir Prus
b000bf9a1d Fix formatting of short-only options.
Fixes #4644.


[SVN r65645]
2010-09-28 09:04:44 +00:00
Jürgen Hunold
7d7dad09d3 Suppress msvc warning 4251 about templates as base classes not having a dll-interface.
Suppress msvc warning 4275 about base class std::logic_error not having a dll-interface.


[SVN r65318]
2010-09-06 08:43:06 +00:00
Vladimir Prus
f0fdc822d4 Update the code size measurement tool
[SVN r63916]
2010-07-12 07:53:24 +00:00
Daniel James
277065182e Update various libraries' documentation build.
Mostly to use the images and css files under doc/src instead of
doc/html, usually be deleting the settings in order to use the defaults.
Also add 'boost.root' to some builds in order to fix links which rely on
it.

[SVN r63146]
2010-06-20 18:00:48 +00:00
Vladimir Prus
572a93ac5b Fix -Wshadow warnings. Closes #4015.
Patch from Tatu Kilappa.


[SVN r62236]
2010-05-26 10:40:34 +00:00
Vladimir Prus
e79708eee7 Fix types. Closes #4069.
[SVN r62235]
2010-05-26 09:51:10 +00:00
Vladimir Prus
444146bd25 Correct typos. Closes #4138.
[SVN r62234]
2010-05-26 09:47:35 +00:00
Jeremiah Willcock
0a2145c008 Fixed tab and no-newline-at-end-of-file issues from inspection report
[SVN r61435]
2010-04-20 17:54:16 +00:00
Daniel James
9691bb1b62 Report error count at the actual end, rather than just the end of each file.
[SVN r60982]
2010-03-31 21:41:45 +00:00
Vladimir Prus
b9e8acef7b Add missing 'userinput'. Add spaces after shell prompt
[SVN r59944]
2010-02-26 07:40:11 +00:00
Vladimir Prus
53ba9ab34f Robustify disambiguation of full/approximate matches.
Fixes #3942.


[SVN r59744]
2010-02-18 09:43:07 +00:00
Sascha Ochsenknecht
af37add8c6 fix in winmain, Fixes #3879
[SVN r59437]
2010-02-03 08:26:35 +00:00
Vladimir Prus
85b2b1c890 Make tests works regardless of what the current directory is.
[SVN r58606]
2009-12-31 08:34:07 +00:00
Sascha Ochsenknecht
524460caba Enhance example, Fixes #3751, Patch from Alex Bukreev
[SVN r58289]
2009-12-11 13:01:31 +00:00
Sascha Ochsenknecht
388c0d1e35 reactive case_insensitive style for cmdline
[SVN r58274]
2009-12-10 20:29:49 +00:00
Sascha Ochsenknecht
a5e45eda5f reactive case_insensitive style for cmdline
[SVN r58273]
2009-12-10 20:25:53 +00:00
Sascha Ochsenknecht
970e377710 Enhancement to flag options as required, Fixes #2982
[SVN r58263]
2009-12-10 08:46:44 +00:00
Sascha Ochsenknecht
fbb8f045ee Fix compile warning about unused variable
[SVN r58253]
2009-12-09 18:14:33 +00:00
Sascha Ochsenknecht
645adb48cb Allow passing file name to parse_config_file(), Fixes #3264
[SVN r58248]
2009-12-09 13:45:01 +00:00
Sascha Ochsenknecht
80b3a04b1f revert changes for #773
[SVN r58237]
2009-12-08 14:57:26 +00:00
Sascha Ochsenknecht
f4e7fb0348 config file parser now stores original_tokens, Fixes #2727
[SVN r58233]
2009-12-08 07:45:44 +00:00
Sascha Ochsenknecht
f00e305f40 Modify assert, potentially Fixes #773
[SVN r58232]
2009-12-08 06:02:23 +00:00
Sascha Ochsenknecht
69bb59d15f Adapt examples regarding to exception class cleanup
[SVN r58218]
2009-12-07 13:35:01 +00:00
Sascha Ochsenknecht
d9c57f58d9 consistent handling of namespace std
[SVN r58185]
2009-12-06 09:56:54 +00:00
Sascha Ochsenknecht
9a04daa2b2 Better detection of missing values on command line, Fixes #3423
[SVN r58184]
2009-12-06 09:52:53 +00:00
Sascha Ochsenknecht
5f01f7bf3f better detection of ambiguous options, see Ticket #3423
[SVN r58152]
2009-12-05 08:08:45 +00:00
Sascha Ochsenknecht
6e0f1db1fc Clean up exception classes, changes regarding to Ticket #3423
[SVN r58138]
2009-12-04 13:38:56 +00:00
Sascha Ochsenknecht
35bf26f432 Changed defaults for split_unix() function to be more compliant to unix command line style
[SVN r58134]
2009-12-04 10:15:11 +00:00
Sascha Ochsenknecht
00dadb4203 enhance split_unix() to allow unix style splitting of command line string
[SVN r58133]
2009-12-04 08:09:43 +00:00
Sascha Ochsenknecht
263534a213 rename description_length to min_description_length for better semantic
[SVN r58112]
2009-12-03 11:11:34 +00:00
Sascha Ochsenknecht
60966caa35 Additional parameter to allow user to specify width of column for description text, patch from Chard, Fixes #3703
[SVN r58095]
2009-12-02 13:35:54 +00:00
Sascha Ochsenknecht
6b194eed21 additional patch for Ticket #1527
[SVN r58054]
2009-11-30 13:38:14 +00:00
Hartmut Kaiser
5fbdd0fafd ProgramOptions: added a couple of missing std:: namespace qualifiers
[SVN r57984]
2009-11-27 22:07:33 +00:00
Sascha Ochsenknecht
3c9e01cad1 consistent use of namespace std
[SVN r57972]
2009-11-27 17:49:08 +00:00
Sascha Ochsenknecht
b3e9b5180e add general split function, Fixes #2561
[SVN r57971]
2009-11-27 17:47:51 +00:00
Vladimir Prus
370834c5c2 Add BOOST_PROGRAM_OPTIONS_DYN_LINK usage requirement for program_options.
Fixes #2273.


[SVN r57832]
2009-11-21 09:13:58 +00:00
Sascha Ochsenknecht
78693e8799 store empty values from config file, Fixes #1537
[SVN r57829]
2009-11-21 07:59:41 +00:00
Sascha Ochsenknecht
ccbbcab336 allow empty values in config file, Fixes #1537
[SVN r57819]
2009-11-20 16:53:10 +00:00
Sascha Ochsenknecht
249094d496 added test case, Fixes #2994
[SVN r57817]
2009-11-20 14:18:36 +00:00
Sascha Ochsenknecht
98b0f14f5a correct usage of tokenizer, memory bug, Fixes #3525
[SVN r57808]
2009-11-20 10:03:08 +00:00
Sascha Ochsenknecht
8add1551dc remove compile warnings
[SVN r57805]
2009-11-20 09:50:43 +00:00
Sascha Ochsenknecht
63c0bf7bfc remove compile warnings, Fixes #2562
[SVN r57800]
2009-11-20 09:09:36 +00:00
Vladimir Prus
aaa914e9a4 Add option name to a few exception classes.
Fixes #3423. Patch from Sascha Ochsenknecht.


[SVN r57746]
2009-11-18 13:35:14 +00:00
Vladimir Prus
e1010ad09e Fix warnings.
Addresses #3603.
Patch from Sascha Ochsenknecht.


[SVN r57535]
2009-11-10 06:59:54 +00:00
Vladimir Prus
73957ca639 Don't strip quotes from values.
Fixes #850.
Patch from Sascha Ochsenknecht.


[SVN r57519]
2009-11-09 18:12:10 +00:00
Vladimir Prus
c6b373ff48 Fix wordwrapping in presense of default parameters.
Fixes #2613.
Patch from Sascha Ochsenknecht.


[SVN r57517]
2009-11-09 16:12:31 +00:00
Vladimir Prus
5a5ad8df61 Test for \t-alignment of options descriptions.
Fixes #1527.
Patch from Sascha Ochsenknecht.


[SVN r57515]
2009-11-09 15:57:51 +00:00
Vladimir Prus
9c934c39fe Use extra parens to silence warnings re &&/|| on same level.
[SVN r57351]
2009-11-04 10:39:55 +00:00
Vladimir Prus
122fe22e07 Put description to next line if we'd overflow otherwise.
Fixes #689.

Patch from Sascha Ochsenknecht.


[SVN r57271]
2009-11-01 10:44:49 +00:00
Vladimir Prus
8f40132e63 Fix 'ambiguous else clause' compiler warning.
Fixes #3556.

Patch from Mateusz Loskot.


[SVN r57270]
2009-11-01 09:18:33 +00:00
Troy D. Straszheim
3f6577a53b rm cmake from trunk. I'm not entirely sure this is necessary to satisfy the inspect script, but I'm not taking any chances, and it is easy to put back
[SVN r56942]
2009-10-17 02:07:38 +00:00
Vladimir Prus
6dbc2ac80a Avoid unnamed namespace, to please vacpp.
Closes #3232.


[SVN r55773]
2009-08-25 06:38:59 +00:00
Troy D. Straszheim
b5ce55ad8c Copyrights on CMakeLists.txt to keep them from clogging up the inspect
reports.  This is essentially the same commit as r55095 on the release
branch.



[SVN r55159]
2009-07-26 00:49:56 +00:00
Hartmut Kaiser
79b43138d6 ProgramOptions: Fixed warning about not all control paths returning a value
[SVN r53795]
2009-06-11 20:05:19 +00:00
Vladimir Prus
354717d9c9 Make program_options compile with disabled exceptions.
It appears the all throw statements are during the
parsing, so alternative error reporting strategies are
possible. 
Closes #2096.


[SVN r53723]
2009-06-07 16:10:03 +00:00
Vladimir Prus
badade7842 Explicitly-qualify the use of boost::bind.
It appears that MSVC 10 puts tr1's bind into std namespace, which
clases with boost::bind thanks to ADL.
Closes #3072. Patch from Richard Webb.


[SVN r53700]
2009-06-06 19:57:16 +00:00
Vladimir Prus
55a1a045a3 Include missing #include of 'iterator'.
Addresses #3072.


[SVN r53623]
2009-06-04 10:09:15 +00:00
Vladimir Prus
6aaee3bbef Qualify usage of 'exeception', now that boost also has such name
[SVN r53442]
2009-05-30 10:38:11 +00:00
Vladimir Prus
ba75831f1b Properly convert original_tokens and unregistered to woption.
Fixes #2425.


[SVN r53441]
2009-05-30 10:34:37 +00:00
Vladimir Prus
620a9a5021 Make 'notify' ignore values without associated semantics.
Fixes #2782.


[SVN r53440]
2009-05-30 10:26:44 +00:00
Jeremiah Willcock
3c3b8d8818 Fixed most tab and min/max issues from trunk inspection report
[SVN r53141]
2009-05-20 19:19:00 +00:00
Troy D. Straszheim
98331c3542 Merge cmake files release -> trunk.
[SVN r52866]
2009-05-09 22:57:30 +00:00
Vladimir Prus
e4ccf81e82 Sync trunk&release branches
[SVN r52441]
2009-04-17 10:01:38 +00:00
Vladimir Prus
600a8aa105 Merge from release:
When processing value multitoken options, don't eat futher options. 
Fixes #469. 


[SVN r52210]
2009-04-06 09:36:21 +00:00
Vladimir Prus
454c878389 Make sure _MSC_VER is defined before checking its value.
[SVN r51639]
2009-03-07 15:32:14 +00:00
John Maddock
49bc2d6226 Add PDF generation options to fix external links to point to the web site.
Added a few more Boostbook based libs that were missed first time around.
Fixed PDF naming issues.

[SVN r51284]
2009-02-17 10:05:58 +00:00
Daniel James
ee3079c247 Revert a change I accidentally checked in.
[SVN r50219]
2008-12-09 10:54:48 +00:00
Daniel James
68fa36b0f6 Avoid a couple of gcc warnings.
[SVN r50214]
2008-12-08 23:35:33 +00:00
Michael A. Jackson
ea2b309994 Updating CMake files to latest trunk. Added dependency information for regression tests and a few new macros for internal use.
[SVN r49627]
2008-11-07 17:02:56 +00:00
Michael A. Jackson
23019ff2ef Continuing merge of CMake build system files into trunk with the encouragement of Doug Gregor
[SVN r49510]
2008-11-01 13:15:41 +00:00
Marshall Clow
4dcce9efce Replaced all occurrences of non-ASCII copyright symbol with '(c)' for people using non-ASCII code pages
[SVN r43992]
2008-04-02 01:42:32 +00:00
Vladimir Prus
316e2fabe4 Tolerate argc being zero.
Patch from C. K. Jester-Young.


[SVN r43207]
2008-02-10 13:13:41 +00:00
Beman Dawes
152fbd8384 // Add or correct comment identifying Boost library this header is associated with.
[SVN r41173]
2007-11-17 20:13:16 +00:00
Vladimir Prus
80361c6b8f Fix winmain test
[SVN r40487]
2007-10-26 19:37:56 +00:00
Vladimir Prus
a3d19d354a Make sure every library can be installed by using
bjam stage|install

in libs/<library>/build.


[SVN r40475]
2007-10-26 09:04:25 +00:00
Vladimir Prus
86aeaf478d Don't use boost.test for testing.
[SVN r40463]
2007-10-25 17:08:27 +00:00
Hartmut Kaiser
7ba4ac9c14 ProgramOptions: Silenced VC++ warnings.
[SVN r39720]
2007-10-05 23:27:43 +00:00
Hartmut Kaiser
d343dda27e Trying to work around a SUN 5.8 compiler error.
[SVN r39686]
2007-10-04 17:49:20 +00:00
Vladimir Prus
8329c28a1a Apply patch to fix gcc warning.
Fixes #1209.


[SVN r38871]
2007-08-23 19:51:47 +00:00
Vladimir Prus
73cf706164 Remove V1 Jamfiles
[SVN r38516]
2007-08-08 19:02:26 +00:00
Vladimir Prus
e51a3ae742 Support for 'implicit' options.
Patch from Bryan Green.
Fixes #1131.


[SVN r38514]
2007-08-08 18:40:48 +00:00
Vladimir Prus
a0a661e4ec Fix examples Jamfile
[SVN r38507]
2007-08-08 17:15:09 +00:00
Vladimir Prus
c25408f6d2 Document config file support in more detail. Fixes #808. Fixes #1125.
[SVN r38495]
2007-08-07 13:55:41 +00:00
Vladimir Prus
63fca63679 Fix dependency
[SVN r38494]
2007-08-07 13:54:47 +00:00
Vladimir Prus
8c39e5aa8d When parsing vector<T>, use validator for
type T.
Fixes #1118.


[SVN r38459]
2007-08-05 18:38:07 +00:00
Vladimir Prus
d0aa5abee5 Implement support for unregistered options in config files. Closes #687.
[SVN r38191]
2007-07-11 19:39:06 +00:00
Vladimir Prus
90dc6b94d0 Clarify comment
[SVN r38190]
2007-07-11 19:37:51 +00:00
Vladimir Prus
2320c07267 Add todo
[SVN r38189]
2007-07-11 19:37:18 +00:00
Vladimir Prus
cd647f785a Fix #898. Two approximate matches followed by an exact match
no longer cause an ambiguity to be reported.


[SVN r38187]
2007-07-11 19:07:44 +00:00
Vladimir Prus
4223d3231d Fix typo
[SVN r38186]
2007-07-11 18:22:57 +00:00
Vladimir Prus
d1d5636365 Compilation fix for sun. Fixes #739.
[SVN r38109]
2007-06-28 07:09:38 +00:00
Vladimir Prus
c00c4a57db Define static const member in .cpp. Fixes #646.
[SVN r38108]
2007-06-28 07:05:50 +00:00
Vladimir Prus
8ad16ee97c Fix typo. Closes #749
[SVN r38107]
2007-06-28 06:54:11 +00:00
Vladimir Prus
0c3e43f2ce Fix typo. Closes #748
[SVN r38106]
2007-06-28 06:51:48 +00:00
Hartmut Kaiser
e42f028278 Fixed VC8 warnings about inconsistent dll export declarations.
[SVN r38099]
2007-06-26 19:13:33 +00:00
Eric Niebler
a29728e679 fix xincludes of doxygen-generated reference sections
[SVN r37571]
2007-05-03 01:18:48 +00:00
Vladimir Prus
232894cb3d Add missing include, to try to fix compilation on sun
[SVN r37005]
2007-02-19 19:27:54 +00:00
Daniel James
d39f2b5979 Merge fixed links from RC_1_34_0.
[SVN r36660]
2007-01-07 23:50:56 +00:00
Vladimir Prus
8c68a478c9 Fix dynamic linking
[SVN r35991]
2006-11-10 20:29:40 +00:00
Vladimir Prus
5d1345c5a9 Allow building of shared versions of some Boost.Test libraries.
Adjust tests to use always use static linking to Boost.Test, since
linking to the shared version requires test changes.

Patch from Juergen Hunold.


[SVN r35989]
2006-11-10 19:09:56 +00:00
Beman Dawes
a560d767fb Add copyright, license
[SVN r35905]
2006-11-07 19:11:57 +00:00
John Maddock
8c1982de82 Fix for Borland compilers.
[SVN r35652]
2006-10-18 12:33:54 +00:00
Vladimir Prus
928d7806f7 Make intel happy
[SVN r35034]
2006-09-07 08:06:16 +00:00
Hartmut Kaiser
b99ae04040 Fixed a dllimport/dllexport problem.
[SVN r34049]
2006-05-20 22:14:41 +00:00
Vladimir Prus
dc334deea7 Fix typo
[SVN r33990]
2006-05-18 06:06:18 +00:00
Vladimir Prus
de66d37405 Make positional_options_description::add return reference to *this.
[SVN r33989]
2006-05-18 05:59:56 +00:00
Vladimir Prus
a4375600a2 Make validation_error::what public, as it's public in std::exception.
[SVN r33969]
2006-05-15 14:05:47 +00:00
Vladimir Prus
bec34dd1b9 Note that variables_map is inherited from std::map, since BoostBook
"hides" that information.


[SVN r33786]
2006-04-24 09:50:30 +00:00
Vladimir Prus
7b73b2e84c Fix typos.
Thanks to Olaf van der Spek for the report!


[SVN r33784]
2006-04-24 09:41:22 +00:00
Vladimir Prus
2625de2dd0 If additional parser returns empty string as value, assume there's no value.
[SVN r33782]
2006-04-24 09:14:57 +00:00
Vladimir Prus
ac6de20f85 Clarify special handling of vectors.
[SVN r33780]
2006-04-24 08:51:38 +00:00
Vladimir Prus
3765e8e8e9 Fix accesses to first element of an empty string.
Thanks to Olaf van der Spek for the report.


[SVN r33778]
2006-04-24 08:25:12 +00:00
Vladimir Prus
026c527d8d Workaround "interator incremented past the end" assertion in MSVC-8.0.
[SVN r33776]
2006-04-24 08:00:13 +00:00
29 changed files with 413 additions and 3686 deletions

View File

@@ -22,7 +22,7 @@
not mean strict 7-bit ASCII encoding, but rather "char" strings in local
8-bit encoding.
</para>
<para>
Generally, &quot;Unicode support&quot; can mean
many things, but for the program_options library it means that:
@@ -54,7 +54,7 @@
passed to an ascii value will be converted using a codecvt
facet (which may be specified by the user).
</para>
</listitem>
</listitem>
</itemizedlist>
</para>
</listitem>
@@ -68,8 +68,8 @@
Second, imagine a reusable library which has some options and exposes
options description in its interface. If <emphasis>all</emphasis>
options are either ascii or Unicode, and the library does not use any
Unicode strings, then the author will likely to use ascii options, which
would make the library unusable inside Unicode
Unicode strings, then the author is likely to use ascii options, making
the library unusable inside Unicode
applications. Essentially, it would be necessary to provide two versions
of the library -- ascii and Unicode.
</para>
@@ -94,7 +94,7 @@
<para>The primary question in implementing the Unicode support is whether
to use templates and <code>std::basic_string</code> or to use some
internal encoding and convert between internal and external encodings on
the interface boundaries.
the interface boundaries.
</para>
<para>The choice, mostly, is between code size and execution
@@ -171,14 +171,14 @@
number of new instantiations.
</para>
</listitem>
</itemizedlist>
There's no clear leader, but the last point seems important, so UTF-8
will be used.
will be used.
</para>
<para>Choosing the UTF-8 encoding allows the use of existing parsers,
because 7-bit ascii characters retain their values in UTF-8,
<para>Choosing the UTF-8 encoding allows the use of existing parsers,
because 7-bit ascii characters retain their values in UTF-8,
so searching for 7-bit strings is simple. However, there are
two subtle issues:
<itemizedlist>
@@ -197,16 +197,16 @@
almost universal encoding and since composing characters following '=' (and
other characters with special meaning to the library) are not likely to appear.
</para>
</section>
</section>
<!--
Local Variables:
mode: xml
sgml-indent-data: t
sgml-indent-data: t
sgml-parent-document: ("program_options.xml" "section")
sgml-set-face: t
End:

View File

@@ -21,7 +21,7 @@ options groups/hidden options
-->
<section>
<title>Non-conventional Syntax</title>
<para>Sometimes, standard command line syntaxes are not enough. For
example, the gcc compiler has "-frtti" and -fno-rtti" options, and this
syntax is not directly supported.
@@ -57,14 +57,14 @@ store(command_line_parser(ac, av).options(desc).extra_parser(reg_foo)
.run(), vm);
</programlisting>
The complete example can be found in the "example/custom_syntax.cpp"
file.
file.
</para>
</section>
<section>
<title>Response Files</title>
<indexterm><primary>response files</primary></indexterm>
<indexterm><primary>response files</primary></indexterm>
<para>Some operating system have very low limits of the command line
length. The common way to work around those limitations is using
@@ -79,7 +79,7 @@ store(command_line_parser(ac, av).options(desc).extra_parser(reg_foo)
<para>
First, you need to define an option for the response file:
<programlisting>
("response-file", value&lt;string&gt;(),
("response-file", value&lt;string&gt;(),
"can be specified with '@name', too")
</programlisting>
</para>
@@ -120,14 +120,14 @@ if (vm.count("response-file")) {
vector<string> args;
copy(tok.begin(), tok.end(), back_inserter(args));
// Parse the file and store the options
store(command_line_parser(args).options(desc).run(), vm);
store(command_line_parser(args).options(desc).run(), vm);
}
]]>
</programlisting>
The complete example can be found in the "example/response_file.cpp"
file.
file.
</para>
</section>
<section>
@@ -146,7 +146,7 @@ if (vm.count("response-file")) {
<programlisting>
vector&lt;string&gt; args = split_winmain(lpCmdLine);
store(command_line_parser(args).options(desc).run(), vm);
</programlisting>
</programlisting>
The <code>split_winmain</code> function is overloaded for <code>wchar_t</code> strings, so can
also be used in Unicode applications.
</para>
@@ -223,7 +223,7 @@ visible.add(general).add(gui);
variables_map vm;
store(parse_command_line(ac, av, all), vm);
if (vm.count("help"))
if (vm.count("help"))
{
cout << visible;
return 0;
@@ -235,7 +235,7 @@ if (vm.count("help-module")) {
} else if (s == "backend") {
cout << backend;
} else {
cout << "Unknown module '"
cout << "Unknown module '"
<< s << "' in the --help-module option\n";
return 1;
}
@@ -243,8 +243,8 @@ if (vm.count("help-module")) {
}
if (vm.count("num-threads")) {
cout << "The 'num-threads' options was set to "
<< vm["num-threads"].as<int>() << "\n";
}
<< vm["num-threads"].as<int>() << "\n";
}
]]></programlisting>
When parsing the command line, all options are allowed. The "--help"
message, however, does not include the "Backend options" group -- the
@@ -253,7 +253,7 @@ if (vm.count("num-threads")) {
option. The complete example can be found in the
"example/option_groups.cpp" file.
</para>
</section>
<section>
@@ -276,7 +276,7 @@ public:
};
]]></programlisting> and then overload the <code>validate</code> function:
<programlisting><![CDATA[
void validate(boost::any& v,
void validate(boost::any& v,
const std::vector<std::string>& values,
magic_number* target_type, int)
{
@@ -290,16 +290,16 @@ void validate(boost::any& v,
// one string, it's an error, and exception will be thrown.
const string& s = validators::get_single_string(values);
// Do regex match and convert the interesting part to
// Do regex match and convert the interesting part to
// int.
smatch match;
if (regex_match(s, match, r)) {
v = any(magic_number(lexical_cast<int>(match[1])));
} else {
throw validation_error(validation_error::invalid_option_value);
}
}
}
]]>
]]>
</programlisting>The function takes four parameters. The first is the storage
for the value, and in this case is either empty or contains an instance of
the <code>magic_number</code> class. The second is the list of strings
@@ -372,7 +372,7 @@ void validate(boost::any& v,
locale::global(locale(""));
</programlisting>
which would set up the conversion facet according to the user's selected
locale.
locale.
</para>
<para>It's wise to check the status of the C++ locale support on your
@@ -382,7 +382,7 @@ locale::global(locale(""));
<para>Go the the "test" directory and build the "test_convert" binary.</para>
</listitem>
<listitem>
<para>Set some non-ascii locale in the environmemt. On Linux, one can
<para>Set some non-ascii locale in the environment. On Linux, one can
run, for example: <screen>
$ export LC_CTYPE=ru_RU.KOI8-R
</screen>
@@ -402,37 +402,37 @@ $ export LC_CTYPE=ru_RU.KOI8-R
<section>
<title>Allowing Unknown Options</title>
<para>Usually, the library throws an exception on unknown option names. This
behaviour can be changed. For example, only some part of your application uses
<para>Usually, the library throws an exception on unknown option names. This
behaviour can be changed. For example, only some part of your application uses
<libraryname>Program_options</libraryname>, and you wish to pass unrecognized options to another part of
the program, or even to another application.</para>
<para>To allow unregistered options on the command line, you need to use
<para>To allow unregistered options on the command line, you need to use
the &basic_command_line_parser; class for parsing (not &parse_command_line;)
and call the <methodname alt="boost::program_options::basic_command_line_parser::allow_unregistered">allow_unregistered</methodname>
and call the <methodname alt="boost::program_options::basic_command_line_parser::allow_unregistered">allow_unregistered</methodname>
method of that class:
<programlisting>
parsed_options parsed =
command_line_parser(argc, argv).options(desc).allow_unregistered().run();
parsed_options parsed =
command_line_parser(argc, argv).options(desc).allow_unregistered().run();
</programlisting>
For each token that looks like an option, but does not have a known name,
an instance of &basic_option; will be added to the result.
The <code>string_key</code> and <code>value</code> fields of the instance will contain results
For each token that looks like an option, but does not have a known name,
an instance of &basic_option; will be added to the result.
The <code>string_key</code> and <code>value</code> fields of the instance will contain results
of syntactic parsing of the token, the <code>unregistered</code> field will be set to <code>true</code>,
and the <code>original_tokens</code> field will contain the token as it appeared on the command line.
</para>
<para>If you want to pass the unrecognized options further, the
<para>If you want to pass the unrecognized options further, the
<functionname alt="boost::program_options::collect_unrecognized">collect_unrecognized</functionname> function can be used.
The function will collect original tokens for all unrecognized values, and optionally, all found positional options.
Say, if your code handles a few options, but does not handles positional options at all, you can use the function like this:
Say, if your code handles a few options, but does not handle positional options at all, you can use the function like this:
<programlisting>
vector&lt;string&gt; to_pass_further = collect_unrecognized(parsed.options, include_positional);
</programlisting>
</para>
</para>
</section>
</section>

View File

@@ -22,7 +22,7 @@
</listitem>
<listitem>
<para>The parsers component, which uses this information to find option names
and values in the input sources and return them.
and values in the input sources and return them.
</para>
</listitem>
<listitem>
@@ -72,10 +72,10 @@
</para>
</listitem>
<listitem>
<para>The storage component is focused on storing options values. It
<para>The storage component is focused on storing options values. It
</para>
</listitem>
</itemizedlist>
@@ -105,7 +105,7 @@ desc.add_options()
("help", "produce help")
("optimization", value&lt;int&gt;()->default_value(10), "optimization level")
;
</programlisting>
</programlisting>
</para>
<para>The call to the <code>value</code> function creates an instance of
@@ -116,14 +116,14 @@ desc.add_options()
essentially emulates named parameters of the constructor.) Calls to
<code>operator()</code> on the object returned by <code>add_options</code>
forward arguments to the constructor of the <code>option_description</code>
class and add the new instance.
class and add the new instance.
</para>
<para>
Note that in addition to the
<code>value</code>, library provides the <code>bool_switch</code>
function, and user can write his own function which will return
other subclasses of <code>value_semantic</code> with
other subclasses of <code>value_semantic</code> with
different behaviour. For the remainder of this section, we'll talk only
about the <code>value</code> function.
</para>
@@ -135,7 +135,7 @@ desc.add_options()
where value is just a vector of strings
(<code>std::vector&lt;std::string&gt;</code>). The semantic layer
is responsible for converting the value of the option into more usable C++
types.
types.
</para>
<para>This separation is an important part of library design. The parsers
@@ -153,7 +153,7 @@ desc.add_options()
<classname>boost::program_options::options_description</classname> class
and some methods of the
<classname>boost::program_options::value_semantic</classname> class
and includes:
and includes:
<itemizedlist>
<listitem>
<para>
@@ -193,7 +193,7 @@ desc.add_options()
span several tokens. For example, the following command line is OK:
<screen>
test --help --compression 10 --verbose --email beadle@mars beadle2@mars
</screen>
</screen>
</para>
<section>
@@ -208,18 +208,18 @@ desc.add_options()
<para>The description string has one or more paragraphs, separated by
the newline character ('\n'). When an option is output, the library
will compute the indentation for options's description. Each of the
paragraph is output as a separate line with that intentation. If
paragraph is output as a separate line with that intentation. If
a paragraph does not fit on one line it is spanned over multiple
lines (which will have the same indentation).
</para>
<para>You may specify additional indent for the first specified by
inserting spaces at the beginning of a paragraph. For example:
inserting spaces at the beginning of a paragraph. For example:
<programlisting>
options.add_options()
("help", " A long help msg a long help msg a long help msg a long help
msg a long help msg a long help msg a long help msg a long help msg ")
;
;
</programlisting>
will specify a four-space indent for the first line. The output will
look like:
@@ -230,14 +230,14 @@ msg a long help msg a long help msg a long help msg a long help msg ")
help msg a long help msg
a long help msg a long
help msg
</screen>
</para>
<para>For the case where line is wrapped, you can want an additional
indent for wrapped text. This can be done by
inserting a tabulator character ('\t') at the desired position. For
example:
example:
<programlisting>
options.add_options()
("well_formated", "As you can see this is a very well formatted
@@ -249,7 +249,7 @@ bla bla bla bla bla bla bla bla bla bla bla\n"
" Value2: \tdoes something else, bla bla bla bla
bla bla bla bla bla bla bla bla bla bla bla\n\n"
" This paragraph has a first line indent only,
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla");
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla");
</programlisting>
will produce:
<screen>
@@ -280,20 +280,20 @@ bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla");
bla bla bla
</screen>
The tab character is removed before output. Only one tabulator per
paragraph is allowed, otherwisee an exception of type
paragraph is allowed, otherwise an exception of type
program_options::error is thrown. Finally, the tabulator is ignored if
it's is not on the first line of the paragraph or is on the last
it is not on the first line of the paragraph or is on the last
possible position of the first line.
</para>
</section>
</section>
<section>
<title>Semantic Information</title>
<para>The semantic information is completely provided by the
<para>The semantic information is completely provided by the
<classname>boost::program_options::value_semantic</classname> class. For
example:
<programlisting>
@@ -303,18 +303,18 @@ desc.add_options()
("email", value&lt; vector&lt;string&gt; &gt;()
->composing()->notifier(&amp;your_function), "email")
;
</programlisting>
</programlisting>
These declarations specify that default value of the first option is 10,
that the second option can appear several times and all instances should
be merged, and that after parsing is done, the library will call
function <code>&amp;your_function</code>, passing the value of the
"email" option as argument.
"email" option as argument.
</para>
</section>
<section>
<title>Positional Options</title>
<para>Our definition of option as (name, value) pairs is simple and
useful, but in one special case of the command line, there's a
problem. A command line can include a <firstterm>positional option</firstterm>,
@@ -324,7 +324,7 @@ desc.add_options()
</screen>
Here, the "/etc/passwd" element does not have any option name.
</para>
<para>One solution is to ask the user to extract positional options
himself and process them as he likes. However, there's a nicer approach
-- provide a method to automatically assign the names for positional
@@ -334,7 +334,7 @@ desc.add_options()
archiver --compression=9 --input-file=/etc/passwd
</screen>
</para>
<para>The &positional_options_desc; class allows the command line
parser to assign the names. The class specifies how many positional options
are allowed, and for each allowed option, specifies the name. For example:
@@ -343,7 +343,7 @@ positional_options_description pd; pd.add("input-file", 1);
</programlisting> specifies that for exactly one, first, positional
option the name will be "input-file".
</para>
<para>It's possible to specify that a number, or even all positional options, be
given the same name.
<programlisting>
@@ -360,11 +360,11 @@ pd.add("output-file", 2).add("input-file", -1);
an instance of the &options_description; class.</para>
</warning>
</section>
<!-- Note that the classes are not modified during parsing -->
</section>
<section>
@@ -390,7 +390,7 @@ pd.add("output-file", 2).add("input-file", -1);
The results of parsing are returned as an instance of the &parsed_options;
class. Typically, that object is passed directly to the storage
component. However, it also can be used directly, or undergo some additional
processing.
processing.
</para>
<para>
@@ -422,8 +422,8 @@ pd.add("output-file", 2).add("input-file", -1);
</para>
</listitem>
</itemizedlist>
</para>
</para>
</section>
@@ -512,7 +512,7 @@ visual_bell=yes
<screen>
gui.accessibility.visual_bell=yes
</screen>
</section>
<section>
@@ -538,7 +538,7 @@ gui.accessibility.visual_bell=yes
what option names must correspond to it. To describe the second
parameter we need to consider naming conventions for environment
variables.</para>
<para>If you have an option that should be specified via environment
variable, you need make up the variable's name. To avoid name clashes,
we suggest that you use a sufficiently unique prefix for environment
@@ -551,9 +551,9 @@ gui.accessibility.visual_bell=yes
Say, if you pass <literal>BOOST_</literal> as the prefix, and there are
two variables, <envar>CVSROOT</envar> and <envar>BOOST_PROXY</envar>, the
first variable will be ignored, and the second one will be converted to
option <literal>proxy</literal>.
option <literal>proxy</literal>.
</para>
<para>The above logic is sufficient in many cases, but it is also
possible to pass, as the second parameter of the &parse_environment;
function, any function taking a <code>std::string</code> and returning
@@ -561,35 +561,35 @@ gui.accessibility.visual_bell=yes
environment variable and should return either the name of the option, or
empty string if the variable should be ignored.
</para>
</section>
</section>
<section>
<title>Annotated List of Symbols</title>
<para>The following table describes all the important symbols in the
library, for quick access.</para>
<informaltable pgwide="1">
<tgroup cols="2">
<colspec colname='c1'/>
<colspec colname='c2'/>
<thead>
<row>
<row>
<entry>Symbol</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<row>
<entry namest='c1' nameend='c2'>Options description component</entry>
</row>
<row>
<entry>&options_description;</entry>
<entry>describes a number of options</entry>
@@ -599,10 +599,10 @@ gui.accessibility.visual_bell=yes
<entry>defines the option's value</entry>
</row>
<row>
<row>
<entry namest='c1' nameend='c2'>Parsers component</entry>
</row>
<row>
<entry>&parse_command_line;</entry>
<entry>parses command line (simpified interface)</entry>
@@ -624,7 +624,7 @@ gui.accessibility.visual_bell=yes
<entry>parses environment</entry>
</row>
<row>
<row>
<entry namest='c1' nameend='c2'>Storage component</entry>
</row>
@@ -632,20 +632,20 @@ gui.accessibility.visual_bell=yes
<entry>&variables_map;</entry>
<entry>storage for option values</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
<!--
Local Variables:
mode: nxml
sgml-indent-data: t
sgml-indent-data: t
sgml-parent-document: ("program_options.xml" "section")
sgml-set-face: t
End:

View File

@@ -4,12 +4,12 @@ implement generic composition classes. The former was choosen,
mostly because of simplicity.
There were two implementation approaches for multiple option
occurences in options_and_arguments. First is store them
occurrences in options_and_arguments. First is store them
separately. The advantage is that it's easy to obtain all
occurences before certain position on command line. The
occurrences before certain position on command line. The
disadvantage is that we cannot return a reference to
vector<vector<string> > in get_all_values. It was considered
that if support for position-dependent options is to be
added, then we're be mostly interested in occurences of
added, then we're be mostly interested in occurrences of
a single option that were before some point. That's possible
with vector<vector<string> > storage.
with vector<vector<string> > storage.

View File

@@ -81,7 +81,7 @@
@section help_handling Handling of --help
It was suggested by Gennadiy Rozental that occurence of <tt>--help</tt>
It was suggested by Gennadiy Rozental that occurrence of <tt>--help</tt>
on command line results in throwing an exception. Actually, the
&quot;special&quot; option must have been configurable. This was not
implemented, because applications might reasonable want to process

View File

@@ -29,9 +29,9 @@ using namespace boost::program_options;
#include <iostream>
#include <fstream>
#include <exception>
using namespace std;
int main(int ac, char* av[])
{
try {
@@ -39,7 +39,7 @@ int main(int ac, char* av[])
options_description general("General options");
general.add_options()
("help", "produce a help message")
("help-module", value<string>()->implicit(),
("help-module", value<string>(),
"produce a help for a given module")
("version", "output the version number")
;
@@ -91,7 +91,7 @@ int main(int ac, char* av[])
<< vm["num-threads"].as<int>() << "\n";
}
}
catch(exception& e) {
catch(std::exception& e) {
cout << e.what() << "\n";
}
}

View File

@@ -18,7 +18,7 @@ using namespace std;
template<class T>
ostream& operator<<(ostream& os, const vector<T>& v)
{
copy(v.begin(), v.end(), ostream_iterator<T>(os, " "));
copy(v.begin(), v.end(), ostream_iterator<T>(os, " "));
return os;
}
@@ -30,26 +30,26 @@ int main(int ac, char* av[])
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("optimization", po::value<int>(&opt)->default_value(10),
("optimization", po::value<int>(&opt)->default_value(10),
"optimization level")
("verbose,v", po::value<int>()->implicit_value(1),
"enable verbosity (optionally specify level)")
("listen,l", po::value<int>(&portnum)->implicit_value(1001)
->default_value(0,"no"),
"listen on a port.")
("include-path,I", po::value< vector<string> >(),
("include-path,I", po::value< vector<string> >(),
"include path")
("input-file", po::value< vector<string> >(), "input file")
;
po::positional_options_description p;
p.add("input-file", -1);
po::variables_map vm;
po::store(po::command_line_parser(ac, av).
options(desc).positional(p).run(), vm);
po::notify(vm);
if (vm.count("help")) {
cout << "Usage: options_description [options]\n";
cout << desc;
@@ -58,13 +58,13 @@ int main(int ac, char* av[])
if (vm.count("include-path"))
{
cout << "Include paths are: "
cout << "Include paths are: "
<< vm["include-path"].as< vector<string> >() << "\n";
}
if (vm.count("input-file"))
{
cout << "Input files are: "
cout << "Input files are: "
<< vm["input-file"].as< vector<string> >() << "\n";
}
@@ -73,14 +73,14 @@ int main(int ac, char* av[])
<< "\n";
}
cout << "Optimization level is " << opt << "\n";
cout << "Optimization level is " << opt << "\n";
cout << "Listen port is " << portnum << "\n";
cout << "Listen port is " << portnum << "\n";
}
catch(std::exception& e)
{
cout << e.what() << "\n";
return 1;
}
}
return 0;
}

View File

@@ -8,7 +8,7 @@
#ifndef PROGRAM_OPTIONS_VP_2003_05_19
#define PROGRAM_OPTIONS_VP_2003_05_19
#if _MSC_VER >= 1020
#if defined(_MSC_VER)
#pragma once
#endif

View File

@@ -27,6 +27,11 @@
#include <boost/type_traits/is_same.hpp>
#include <boost/shared_ptr.hpp>
#ifdef BOOST_MSVC
# pragma warning(push)
# pragma warning(disable: 4251) // class XYZ needs to have dll-interface to be used by clients of class XYZ
#endif
namespace boost { namespace program_options { namespace detail {
@@ -62,7 +67,7 @@ namespace boost { namespace program_options { namespace detail {
TODO: maybe, we should just accept a pointer to options_description
class.
*/
class common_config_file_iterator
class BOOST_PROGRAM_OPTIONS_DECL common_config_file_iterator
: public eof_iterator<common_config_file_iterator, option>
{
public:
@@ -77,6 +82,11 @@ namespace boost { namespace program_options { namespace detail {
void get();
#if BOOST_WORKAROUND(_MSC_VER, <= 1900)
void decrement() {}
void advance(difference_type) {}
#endif
protected: // Stubs for derived classes
// Obtains next line from the config file
@@ -177,4 +187,8 @@ namespace boost { namespace program_options { namespace detail {
}}}
#ifdef BOOST_MSVC
# pragma warning(pop)
#endif
#endif

View File

@@ -40,7 +40,8 @@ namespace boost { namespace program_options {
: detail::cmdline(
// Explicit template arguments are required by gcc 3.3.1
// (at least mingw version), and do no harm on other compilers.
to_internal(detail::make_vector<charT, const charT* const*>(argv+1, argv+argc+!argc)))
to_internal(detail::make_vector<charT, const charT* const*>(argv+1, argv+argc+!argc))),
m_desc()
{}

View File

@@ -105,12 +105,9 @@ namespace boost { namespace program_options {
int);
#endif
// For some reason, this declaration, which is require by the standard,
// cause gcc 3.2 to not generate code to specialization defined in
// cause msvc 7.1 to not generate code to specialization defined in
// value_semantic.cpp
#if ! ( ( BOOST_WORKAROUND(__GNUC__, <= 3) &&\
BOOST_WORKAROUND(__GNUC_MINOR__, < 3) ) || \
( BOOST_WORKAROUND(BOOST_MSVC, == 1310) ) \
)
#if ! ( BOOST_WORKAROUND(BOOST_MSVC, == 1310) )
BOOST_PROGRAM_OPTIONS_DECL void validate(boost::any& v,
const std::vector<std::string>& xs,
std::string*,

View File

@@ -40,8 +40,9 @@ namespace boost {
assert(n != s.npos);
value().first = s.substr(0, n);
value().second = s.substr(n+1);
}
++m_environment;
++m_environment;
}
}
private:

View File

@@ -10,17 +10,17 @@
namespace boost {
/** The 'eof_iterator' class is useful for constructing forward iterators
in cases where iterator extract data from some source and it's easy
to detect 'eof' -- i.e. the situation where there's no data. One
/** The 'eof_iterator' class is useful for constructing forward iterators
in cases where iterator extract data from some source and it's easy
to detect 'eof' \-- i.e. the situation where there's no data. One
apparent example is reading lines from a file.
Implementing such iterators using 'iterator_facade' directly would
require to create class with three core operation, a couple of
constructors. When using 'eof_iterator', the derived class should define
require to create class with three core operation, a couple of
constructors. When using 'eof_iterator', the derived class should define
only one method to get new value, plus a couple of constructors.
The basic idea is that iterator has 'eof' bit. Two iterators are equal
The basic idea is that iterator has 'eof' bit. Two iterators are equal
only if both have their 'eof' bits set. The 'get' method either obtains
the new value or sets the 'eof' bit.
@@ -33,13 +33,13 @@ namespace boost {
3. The 'get' method. It should operate this way:
- look at some 'data pointer' to see if new element is available;
if not, it should call 'found_eof'.
- extract new element and store it at location returned by the 'value'
- extract new element and store it at location returned by the 'value'
method.
- advance the data pointer.
Essentially, the 'get' method has the functionality of both 'increment'
and 'dereference'. It's very good for the cases where data extraction
implicitly moves data pointer, like for stream operation.
Essentially, the 'get' method has the functionality of both 'increment'
and 'dereference'. It's very good for the cases where data extraction
implicitly moves data pointer, like for stream operation.
*/
template<class Derived, class ValueType>
class eof_iterator : public iterator_facade<Derived, const ValueType,
@@ -65,16 +65,16 @@ namespace boost {
{
m_at_eof = true;
}
private: // iterator core operations
friend class iterator_core_access;
void increment()
void increment()
{
static_cast<Derived&>(*this).get();
}
bool equal(const eof_iterator& other) const
{
if (m_at_eof && other.m_at_eof)
@@ -82,14 +82,14 @@ namespace boost {
else
return false;
}
const ValueType& dereference() const
{
return m_value;
}
bool m_at_eof;
ValueType m_value;
ValueType m_value;
};
}

View File

@@ -25,7 +25,8 @@ namespace boost { namespace program_options {
inline std::string strip_prefixes(const std::string& text)
{
return text.substr(text.find_last_of("-/") + 1);
// "--foo-bar" -> "foo-bar"
return text.substr(text.find_first_not_of("-/"));
}
/** Base class for all errors in the library. */
@@ -104,13 +105,13 @@ namespace boost { namespace program_options {
std::map<std::string, string_pair > m_substitution_defaults;
public:
/** template with placeholders */
std::string m_error_template;
/** template with placeholders */
std::string m_error_template;
error_with_option_name(const std::string& template_,
const std::string& option_name = "",
const std::string& original_token = "",
int option_style = 0);
error_with_option_name(const std::string& template_,
const std::string& option_name = "",
const std::string& original_token = "",
int option_style = 0);
/** gcc says that throw specification on dtor is loosened
* without this line
@@ -250,7 +251,7 @@ namespace boost { namespace program_options {
}
/** Does NOT set option name, because no option name makes sense */
virtual void set_option_name(const std::string& option_name){}
virtual void set_option_name(const std::string&) {}
~error_with_no_option_name() throw() {}
};

View File

@@ -15,7 +15,7 @@ namespace boost { namespace program_options {
/** Option found in input source.
Contains a key and a value. The key, in turn, can be a string (name of
an option), or an integer (position in input source) -- in case no name
an option), or an integer (position in input source) \-- in case no name
is specified. The latter is only possible for command line.
The template parameter specifies the type of char used for storing the
option's value.

View File

@@ -41,7 +41,7 @@ namespace program_options {
are used only to validate input. Second affect interpretation of the
option, for example default value for it or function that should be
called when the value is finally known. Routines which perform parsing
never use second kind of properties -- they are side effect free.
never use second kind of properties \-- they are side effect free.
@sa options_description
*/
class BOOST_PROGRAM_OPTIONS_DECL option_description {
@@ -61,8 +61,8 @@ namespace program_options {
Alas, derived->base conversion for auto_ptr does not really work,
see
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2000/n1232.pdf
http://std.dkuug.dk/jtc1/sc22/wg21/docs/cwg_defects.html#84
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2000/n1232.pdf
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#84
So, we have to use plain old pointers. Besides, users are not
expected to use the constructor directly.
@@ -71,7 +71,7 @@ namespace program_options {
The 'name' parameter is interpreted by the following rules:
- if there's no "," character in 'name', it specifies long name
- otherwise, the part before "," specifies long name and the part
after -- short name.
after \-- short name.
*/
option_description(const char* name,
const value_semantic* s);
@@ -199,6 +199,10 @@ namespace program_options {
*/
options_description& add(const options_description& desc);
/** Find the maximum width of the option column, including options
in groups. */
unsigned get_option_column_width() const;
public:
/** Returns an object of implementation-defined type suitable for adding
options to options_description. The returned object will
@@ -229,9 +233,14 @@ namespace program_options {
/** Outputs 'desc' to the specified stream, calling 'f' to output each
option_description element. */
void print(std::ostream& os) const;
void print(std::ostream& os, unsigned width = 0) const;
private:
#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1800))
// prevent warning C4512: assignment operator could not be generated
options_description& operator=(const options_description&);
#endif
typedef std::map<std::string, int>::const_iterator name2index_iterator;
typedef std::pair<name2index_iterator, name2index_iterator>
approximation_range;

View File

@@ -28,20 +28,20 @@ namespace boost { namespace program_options {
class positional_options_description;
/** Results of parsing an input source.
The primary use of this class is passing information from parsers
/** Results of parsing an input source.
The primary use of this class is passing information from parsers
component to value storage component. This class does not makes
much sense itself.
much sense itself.
*/
template<class charT>
class basic_parsed_options {
public:
explicit basic_parsed_options(const options_description* xdescription, int options_prefix = 0)
explicit basic_parsed_options(const options_description* xdescription, int options_prefix = 0)
: description(xdescription), m_options_prefix(options_prefix) {}
/** Options found in the source. */
std::vector< basic_option<charT> > options;
/** Options description that was used for parsing.
Parsers should return pointer to the instance of
/** Options description that was used for parsing.
Parsers should return pointer to the instance of
option_description passed to them, and issues of lifetime are
up to the caller. Can be NULL.
*/
@@ -55,7 +55,7 @@ namespace boost { namespace program_options {
* allow_long_disguise
* allow_dash_for_short
* allow_slash_for_short
*/
*/
int m_options_prefix;
};
@@ -74,7 +74,7 @@ namespace boost { namespace program_options {
/** Stores UTF8 encoded options that were passed to constructor,
to avoid reverse conversion in some cases. */
basic_parsed_options<char> utf8_encoded_options;
basic_parsed_options<char> utf8_encoded_options;
/** Mainly used for the diagnostic messages in exceptions.
* The canonical option prefix for the parser which generated these results,
@@ -84,7 +84,7 @@ namespace boost { namespace program_options {
* allow_long_disguise
* allow_dash_for_short
* allow_slash_for_short
*/
*/
int m_options_prefix;
};
@@ -101,14 +101,14 @@ namespace boost { namespace program_options {
The class allows one to specify all the information needed for parsing
and to parse the command line. It is primarily needed to
emulate named function parameters -- a regular function with 5
emulate named function parameters \-- a regular function with 5
parameters will be hard to use and creating overloads with a smaller
nuber of parameters will be confusing.
number of parameters will be confusing.
For the most common case, the function parse_command_line is a better
alternative.
For the most common case, the function parse_command_line is a better
alternative.
There are two typedefs -- command_line_parser and wcommand_line_parser,
There are two typedefs \-- command_line_parser and wcommand_line_parser,
for charT == char and charT == wchar_t cases.
*/
template<class charT>
@@ -146,10 +146,10 @@ namespace boost { namespace program_options {
instance of basic_option<charT> will be added to result,
with 'unrecognized' field set to 'true'. It's possible to
collect all unrecognized options with the 'collect_unrecognized'
funciton.
funciton.
*/
basic_command_line_parser& allow_unregistered();
using detail::cmdline::style_parser;
basic_command_line_parser& extra_style_parser(style_parser s);
@@ -162,19 +162,19 @@ namespace boost { namespace program_options {
typedef basic_command_line_parser<wchar_t> wcommand_line_parser;
/** Creates instance of 'command_line_parser', passes parameters to it,
and returns the result of calling the 'run' method.
and returns the result of calling the 'run' method.
*/
template<class charT>
basic_parsed_options<charT>
parse_command_line(int argc, const charT* const argv[],
const options_description&,
int style = 0,
function1<std::pair<std::string, std::string>,
function1<std::pair<std::string, std::string>,
const std::string&> ext
= ext_parser());
/** Parse a config file.
/** Parse a config file.
Read from given stream.
*/
template<class charT>
@@ -185,10 +185,10 @@ namespace boost { namespace program_options {
parse_config_file(std::basic_istream<charT>&, const options_description&,
bool allow_unregistered = false);
/** Parse a config file.
/** Parse a config file.
Read from file with the given name. The character type is
passed to the file stream.
passed to the file stream.
*/
template<class charT>
#if ! BOOST_WORKAROUND(__ICL, BOOST_TESTED_AT(700))
@@ -200,7 +200,7 @@ namespace boost { namespace program_options {
/** Controls if the 'collect_unregistered' function should
include positional options, or not. */
enum collect_unrecognized_mode
enum collect_unrecognized_mode
{ include_positional, exclude_positional };
/** Collects the original tokens for all named options with
@@ -210,34 +210,34 @@ namespace boost { namespace program_options {
options.
*/
template<class charT>
std::vector< std::basic_string<charT> >
std::vector< std::basic_string<charT> >
collect_unrecognized(const std::vector< basic_option<charT> >& options,
enum collect_unrecognized_mode mode);
/** Parse environment.
/** Parse environment.
For each environment variable, the 'name_mapper' function is called to
obtain the option name. If it returns empty string, the variable is
ignored.
obtain the option name. If it returns empty string, the variable is
ignored.
This is done since naming of environment variables is typically
different from the naming of command line options.
This is done since naming of environment variables is typically
different from the naming of command line options.
*/
BOOST_PROGRAM_OPTIONS_DECL parsed_options
parse_environment(const options_description&,
parse_environment(const options_description&,
const function1<std::string, std::string>& name_mapper);
/** Parse environment.
Takes all environment variables which start with 'prefix'. The option
name is obtained from variable name by removing the prefix and
name is obtained from variable name by removing the prefix and
converting the remaining string into lower case.
*/
BOOST_PROGRAM_OPTIONS_DECL parsed_options
parse_environment(const options_description&, const std::string& prefix);
/** @overload
This function exists to resolve ambiguity between the two above
This function exists to resolve ambiguity between the two above
functions when second argument is of 'char*' type. There's implicit
conversion to both function1 and string.
*/
@@ -252,13 +252,13 @@ namespace boost { namespace program_options {
and escape characters '\'
*/
BOOST_PROGRAM_OPTIONS_DECL std::vector<std::string>
split_unix(const std::string& cmdline, const std::string& seperator = " \t",
split_unix(const std::string& cmdline, const std::string& seperator = " \t",
const std::string& quote = "'\"", const std::string& escape = "\\");
#ifndef BOOST_NO_STD_WSTRING
/** @overload */
BOOST_PROGRAM_OPTIONS_DECL std::vector<std::wstring>
split_unix(const std::wstring& cmdline, const std::wstring& seperator = L" \t",
split_unix(const std::wstring& cmdline, const std::wstring& seperator = L" \t",
const std::wstring& quote = L"'\"", const std::wstring& escape = L"\\");
#endif
@@ -278,7 +278,7 @@ namespace boost { namespace program_options {
split_winmain(const std::wstring& cmdline);
#endif
#endif
}}

View File

@@ -13,10 +13,10 @@
#include <boost/function/function1.hpp>
#include <boost/lexical_cast.hpp>
#include <string>
#include <vector>
#include <typeinfo>
#include <limits>
namespace boost { namespace program_options {
@@ -38,6 +38,11 @@ namespace boost { namespace program_options {
should be present on the command line. */
virtual unsigned max_tokens() const = 0;
/** Returns true if the option should only take adjacent token,
not one from further command-line arguments.
*/
virtual bool adjacent_tokens_only() const = 0;
/** Returns true if values from different sources should be composed.
Otherwise, value from the first source is used and values from
other sources are discarded.
@@ -48,7 +53,7 @@ namespace boost { namespace program_options {
*/
virtual bool is_required() const = 0;
/** Parses a group of tokens that specify a value of option.
Stores the result in 'value_store', using whatever representation
is desired. May be be called several times if value of the same
@@ -134,6 +139,7 @@ namespace boost { namespace program_options {
unsigned min_tokens() const;
unsigned max_tokens() const;
bool adjacent_tokens_only() const { return false; }
bool is_composing() const { return false; }
@@ -156,6 +162,7 @@ namespace boost { namespace program_options {
bool m_zero_tokens;
};
#ifndef BOOST_NO_RTTI
/** Base class for all option that have a fixed type, and are
willing to announce this type to the outside world.
Any 'value_semantics' for which you want to find out the
@@ -172,20 +179,23 @@ namespace boost { namespace program_options {
// class is silly, but just in case.
virtual ~typed_value_base() {}
};
#endif
/** Class which handles value of a specific type. */
template<class T, class charT = char>
class typed_value : public value_semantic_codecvt_helper<charT>,
public typed_value_base
class typed_value : public value_semantic_codecvt_helper<charT>
#ifndef BOOST_NO_RTTI
, public typed_value_base
#endif
{
public:
/** Ctor. The 'store_to' parameter tells where to store
the value when it's known. The parameter can be NULL. */
typed_value(T* store_to)
: m_store_to(store_to), m_composing(false),
m_multitoken(false), m_zero_tokens(false),
m_required(false)
m_implicit(false), m_multitoken(false),
m_zero_tokens(false), m_required(false)
{}
/** Specifies default value, which will be used
@@ -313,7 +323,7 @@ namespace boost { namespace program_options {
unsigned max_tokens() const {
if (m_multitoken) {
return 32000;
return std::numeric_limits<unsigned>::max BOOST_PREVENT_MACRO_SUBSTITUTION();
} else if (m_zero_tokens) {
return 0;
} else {
@@ -321,6 +331,8 @@ namespace boost { namespace program_options {
}
}
bool adjacent_tokens_only() const { return !m_implicit_value.empty(); }
bool is_required() const { return m_required; }
/** Creates an instance of the 'validator' class and calls
@@ -350,10 +362,12 @@ namespace boost { namespace program_options {
public: // typed_value_base overrides
#ifndef BOOST_NO_RTTI
const std::type_info& value_type() const
{
return typeid(T);
}
#endif
private:

View File

@@ -31,35 +31,35 @@ namespace boost { namespace program_options {
// forward declaration
/** Stores in 'm' all options that are defined in 'options'.
/** Stores in 'm' all options that are defined in 'options'.
If 'm' already has a non-defaulted value of an option, that value
is not changed, even if 'options' specify some value.
is not changed, even if 'options' specify some value.
*/
BOOST_PROGRAM_OPTIONS_DECL
BOOST_PROGRAM_OPTIONS_DECL
void store(const basic_parsed_options<char>& options, variables_map& m,
bool utf8 = false);
/** Stores in 'm' all options that are defined in 'options'.
/** Stores in 'm' all options that are defined in 'options'.
If 'm' already has a non-defaulted value of an option, that value
is not changed, even if 'options' specify some value.
is not changed, even if 'options' specify some value.
This is wide character variant.
*/
BOOST_PROGRAM_OPTIONS_DECL
void store(const basic_parsed_options<wchar_t>& options,
BOOST_PROGRAM_OPTIONS_DECL
void store(const basic_parsed_options<wchar_t>& options,
variables_map& m);
/** Runs all 'notify' function for options in 'm'. */
BOOST_PROGRAM_OPTIONS_DECL void notify(variables_map& m);
/** Class holding value of option. Contains details about how the
/** Class holding value of option. Contains details about how the
value is set and allows to conveniently obtain the value.
*/
class BOOST_PROGRAM_OPTIONS_DECL variable_value {
public:
variable_value() : m_defaulted(false) {}
variable_value(const boost::any& xv, bool xdefaulted)
: v(xv), m_defaulted(xdefaulted)
variable_value(const boost::any& xv, bool xdefaulted)
: v(xv), m_defaulted(xdefaulted)
{}
/** If stored value if of type T, returns that value. Otherwise,
@@ -95,10 +95,10 @@ namespace boost { namespace program_options {
shared_ptr<const value_semantic> m_value_semantic;
friend BOOST_PROGRAM_OPTIONS_DECL
void store(const basic_parsed_options<char>& options,
void store(const basic_parsed_options<char>& options,
variables_map& m, bool);
friend BOOST_PROGRAM_OPTIONS_DECL class variables_map;
friend class BOOST_PROGRAM_OPTIONS_DECL variables_map;
};
/** Implements string->string mapping with convenient value casting
@@ -118,11 +118,11 @@ namespace boost { namespace program_options {
- otherwise, returns empty value
- if there's defaulted value
- if there's next varaible map, which has a non-defauled
- if there's next variable map, which has a non-defaulted
value, return that
- otherwise, return value from *this
- if there's a non-defauled value, returns it.
- if there's a non-defaulted value, returns it.
*/
const variable_value& operator[](const std::string& name) const;
@@ -138,8 +138,8 @@ namespace boost { namespace program_options {
const abstract_variables_map* m_next;
};
/** Concrete variables map which store variables in real map.
/** Concrete variables map which store variables in real map.
This class is derived from std::map<std::string, variable_value>,
so you can use all map operators to examine its content.
*/
@@ -155,8 +155,8 @@ namespace boost { namespace program_options {
{ return abstract_variables_map::operator[](name); }
// Override to clear some extra fields.
void clear();
void clear();
void notify();
private:
@@ -164,15 +164,15 @@ namespace boost { namespace program_options {
which does 'find' in *this. */
const variable_value& get(const std::string& name) const;
/** Names of option with 'final' values -- which should not
/** Names of option with 'final' values \-- which should not
be changed by subsequence assignments. */
std::set<std::string> m_final;
friend BOOST_PROGRAM_OPTIONS_DECL
void store(const basic_parsed_options<char>& options,
void store(const basic_parsed_options<char>& options,
variables_map& xm,
bool utf8);
/** Names of required options, filled by parser which has
access to options_description.
The map values are the "canonical" names for each corresponding option.

15
meta/libraries.json Normal file
View File

@@ -0,0 +1,15 @@
{
"key": "program_options",
"name": "Program Options",
"authors": [
"Vladimir Prus"
],
"description": "The program_options library allows program developers to obtain program options, that is (name, value) pairs from the user, via conventional methods such as command line and config file.",
"category": [
"IO",
"Miscellaneous"
],
"maintainers": [
"Vladimir Prus <vladimir.prus -at- gmail.com>"
]
}

View File

@@ -313,6 +313,9 @@ namespace boost { namespace program_options { namespace detail {
if (!xd)
continue;
if (xd->semantic()->adjacent_tokens_only())
continue;
unsigned min_tokens = xd->semantic()->min_tokens();
unsigned max_tokens = xd->semantic()->max_tokens();
if (min_tokens < max_tokens && opt.value.size() < max_tokens)
@@ -455,7 +458,7 @@ namespace boost { namespace program_options { namespace detail {
// if they look like options
if (opt.value.size() <= min_tokens)
{
min_tokens -= static_cast<unsigned>(opt.value.size());
min_tokens -= static_cast<unsigned>(opt.value.size());
}
else
{

View File

@@ -8,7 +8,7 @@
#define BOOST_PROGRAM_OPTIONS_SOURCE
#include <boost/program_options/config.hpp>
#include <boost/program_options/options_description.hpp>
// FIXME: this is only to get multiple_occurences class
// FIXME: this is only to get multiple_occurrences class
// should move that to a separate headers.
#include <boost/program_options/parsers.hpp>
@@ -604,12 +604,9 @@ namespace boost { namespace program_options {
}
}
void
options_description::print(std::ostream& os) const
unsigned
options_description::get_option_column_width() const
{
if (!m_caption.empty())
os << m_caption << ":\n";
/* Find the maximum width of the option column */
unsigned width(23);
unsigned i; // vc6 has broken for loop scoping
@@ -620,6 +617,11 @@ namespace boost { namespace program_options {
ss << " " << opt.format_name() << ' ' << opt.format_parameter();
width = (max)(width, static_cast<unsigned>(ss.str().size()));
}
/* Get width of groups as well*/
for (unsigned j = 0; j < groups.size(); ++j)
width = max(width, groups[j]->get_option_column_width());
/* this is the column were description should start, if first
column is longer, we go to a new line */
const unsigned start_of_description_column = m_line_length - m_min_description_length;
@@ -628,9 +630,20 @@ namespace boost { namespace program_options {
/* add an additional space to improve readability */
++width;
return width;
}
void
options_description::print(std::ostream& os, unsigned width) const
{
if (!m_caption.empty())
os << m_caption << ":\n";
if (!width)
width = get_option_column_width();
/* The options formatting style is stolen from Subversion. */
for (i = 0; i < m_options.size(); ++i)
for (unsigned i = 0; i < m_options.size(); ++i)
{
if (belong_to_group[i])
continue;
@@ -643,7 +656,8 @@ namespace boost { namespace program_options {
}
for (unsigned j = 0; j < groups.size(); ++j) {
os << "\n" << *groups[j];
os << "\n";
groups[j]->print(os, width);
}
}

View File

@@ -220,7 +220,7 @@ namespace boost { namespace program_options {
{
// Intel-Win-7.1 does not understand
// push_back on string.
result += tolower(s[n]);
result += static_cast<char>(tolower(s[n]));
}
}
return result;

View File

@@ -268,7 +268,7 @@ namespace boost { namespace program_options {
void error_with_option_name::replace_token(const string& from, const string& to) const
{
while (1)
for (;;)
{
std::size_t pos = m_message.find(from.c_str(), 0, from.length());
// not found: all replaced

View File

@@ -17,12 +17,12 @@ namespace boost { namespace program_options {
using namespace std;
// First, performs semantic actions for 'oa'.
// Then, stores in 'm' all options that are defined in 'desc'.
BOOST_PROGRAM_OPTIONS_DECL
// First, performs semantic actions for 'oa'.
// Then, stores in 'm' all options that are defined in 'desc'.
BOOST_PROGRAM_OPTIONS_DECL
void store(const parsed_options& options, variables_map& xm,
bool utf8)
{
{
// TODO: what if we have different definition
// for the same option name during different calls
// 'store'.
@@ -49,7 +49,7 @@ namespace boost { namespace program_options {
for (i = 0; i < options.options.size(); ++i) {
option_name = options.options[i].string_key;
original_token = options.options[i].original_tokens.size() ?
original_token = options.options[i].original_tokens.size() ?
options.options[i].original_tokens[0] :
option_name;
// Skip positional options without name
@@ -59,7 +59,7 @@ namespace boost { namespace program_options {
// Ignore unregistered option. The 'unregistered'
// field can be true only if user has explicitly asked
// to allow unregistered options. We can't store them
// to variables map (lacking any information about paring),
// to variables map (lacking any information about paring),
// so just ignore them.
if (options.options[i].unregistered)
continue;
@@ -68,21 +68,21 @@ namespace boost { namespace program_options {
if (xm.m_final.count(option_name))
continue;
string original_token = options.options[i].original_tokens.size() ?
string original_token = options.options[i].original_tokens.size() ?
options.options[i].original_tokens[0] : "";
const option_description& d = desc.find(option_name, false,
const option_description& d = desc.find(option_name, false,
false, false);
variable_value& v = m[option_name];
variable_value& v = m[option_name];
if (v.defaulted()) {
// Explicit assignment here erases defaulted value
v = variable_value();
}
d.semantic()->parse(v.value(), options.options[i].value, utf8);
v.m_value_semantic = d.semantic();
// The option is not composing, and the value is explicitly
// provided. Ignore values of this option for subsequent
// calls to 'store'. We store this to a temporary set,
@@ -91,7 +91,7 @@ namespace boost { namespace program_options {
if (!d.semantic()->is_composing())
new_final.insert(option_name);
}
}
}
#ifndef BOOST_NO_EXCEPTIONS
catch(error_with_option_name& e)
{
@@ -102,8 +102,8 @@ namespace boost { namespace program_options {
#endif
xm.m_final.insert(new_final.begin(), new_final.end());
// Second, apply default values and store required options.
const vector<shared_ptr<option_description> >& all = desc.options();
for(i = 0; i < all.size(); ++i)
@@ -112,21 +112,21 @@ namespace boost { namespace program_options {
string key = d.key("");
// FIXME: this logic relies on knowledge of option_description
// internals.
// The 'key' is empty if options description contains '*'.
// In that
// The 'key' is empty if options description contains '*'.
// In that
// case, default value makes no sense at all.
if (key.empty())
{
continue;
}
if (m.count(key) == 0) {
boost::any def;
if (d.semantic()->apply_default(def)) {
m[key] = variable_value(def, true);
m[key].m_value_semantic = d.semantic();
}
}
}
// add empty value if this is an required option
if (d.semantic()->is_required()) {
@@ -142,16 +142,16 @@ namespace boost { namespace program_options {
}
}
BOOST_PROGRAM_OPTIONS_DECL
BOOST_PROGRAM_OPTIONS_DECL
void store(const wparsed_options& options, variables_map& m)
{
store(options.utf8_encoded_options, m, true);
}
BOOST_PROGRAM_OPTIONS_DECL
BOOST_PROGRAM_OPTIONS_DECL
void notify(variables_map& vm)
{
vm.notify();
{
vm.notify();
}
abstract_variables_map::abstract_variables_map()
@@ -163,7 +163,7 @@ namespace boost { namespace program_options {
: m_next(next)
{}
const variable_value&
const variable_value&
abstract_variables_map::operator[](const std::string& name) const
{
const variable_value& v = get(name);
@@ -179,7 +179,7 @@ namespace boost { namespace program_options {
}
}
void
void
abstract_variables_map::next(abstract_variables_map* next)
{
m_next = next;
@@ -209,7 +209,7 @@ namespace boost { namespace program_options {
else
return i->second;
}
void
variables_map::notify()
{
@@ -221,29 +221,29 @@ namespace boost { namespace program_options {
const string& opt = r->first;
const string& display_opt = r->second;
map<string, variable_value>::const_iterator iter = find(opt);
if (iter == end() || iter->second.empty())
if (iter == end() || iter->second.empty())
{
boost::throw_exception(required_option(display_opt));
}
}
// Lastly, run notify actions.
for (map<string, variable_value>::iterator k = begin();
k != end();
++k)
for (map<string, variable_value>::iterator k = begin();
k != end();
++k)
{
/* Users might wish to use variables_map to store their own values
that are not parsed, and therefore will not have value_semantics
defined. Do no crash on such values. In multi-module programs,
defined. Do not crash on such values. In multi-module programs,
one module might add custom values, and the 'notify' function
will be called after that, so we check that value_sematics is
will be called after that, so we check that value_sematics is
not NULL. See:
https://svn.boost.org/trac/boost/ticket/2782
*/
if (k->second.m_value_semantic)
k->second.m_value_semantic->notify(k->second.value());
}
}
}
}}

View File

@@ -32,6 +32,8 @@ test-suite program_options :
[ po-test split_test.cpp ]
[ po-test unrecognized_test.cpp ]
[ po-test required_test.cpp : required_test.cfg ]
[ po-test exception_txt_test.cpp ]
[ run options_description_test.cpp : : : <rtti>off <define>BOOST_NO_RTTI <define>BOOST_NO_TYPEID : options_description_no_rtti_test ]
;
exe test_convert : test_convert.cpp ;

View File

@@ -63,7 +63,8 @@ struct test_case {
The "boost::program_options" in parameter type is needed because CW9
has std::detail and it causes an ambiguity.
*/
void apply_syntax(options_description& desc,
void apply_syntax(options_description& desc,
positional_options_description & m_positional,
const char* syntax)
{
@@ -77,8 +78,8 @@ void apply_syntax(options_description& desc,
v = value<string>();
s.resize(s.size()-1);
} else if (*(s.end()-1) == '?') {
//v = value<string>()->implicit();
v = value<string>();
v = value<string>()->implicit_value("bar");
m_positional.add("positional", -1);
s.resize(s.size()-1);
} else if (*(s.end()-1) == '*') {
v = value<vector<string> >()->multitoken();
@@ -113,12 +114,14 @@ void test_cmdline(const char* syntax,
}
}
options_description desc;
apply_syntax(desc, syntax);
positional_options_description m_positional;
apply_syntax(desc, m_positional, syntax);
cmdline cmd(xinput);
cmd.style(style);
cmd.set_options_description(desc);
if(m_positional.max_total_count())
cmd.set_positional_options(m_positional);
string result;
int status = 0;
@@ -126,11 +129,13 @@ void test_cmdline(const char* syntax,
try {
vector<option> options = cmd.run();
for(unsigned i = 0; i < options.size(); ++i)
for(unsigned j = 0; j < options.size(); ++j)
{
option opt = options[i];
option opt = options[j];
if (opt.position_key != -1) {
if (opt.position_key != -1
&& (m_positional.max_total_count() == 0 || (size_t)opt.position_key >= m_positional.max_total_count()
|| m_positional.name_for_position(opt.position_key) != "positional")) {
if (!result.empty())
result += " ";
result += opt.value[0];
@@ -138,18 +143,18 @@ void test_cmdline(const char* syntax,
if (!result.empty())
result += " ";
result += opt.string_key + ":";
for (size_t j = 0; j < opt.value.size(); ++j) {
if (j != 0)
for (size_t k = 0; k < opt.value.size(); ++k) {
if (k != 0)
result += "-";
result += opt.value[j];
result += opt.value[k];
}
}
}
}
catch(unknown_option& e) {
catch(unknown_option&) {
status = s_unknown_option;
}
catch(ambiguous_option& e) {
catch(ambiguous_option&) {
status = s_ambiguous_option;
}
catch(invalid_command_line_syntax& e) {
@@ -228,7 +233,7 @@ void test_long_options()
{"--giz", s_success, "Giz:"},
{0, 0, 0}
};
test_cmdline("foo bar= baz? Giz", style, test_cases4);
test_cmdline("foo bar= Giz", style, test_cases4);
}
void test_short_options()
@@ -348,7 +353,7 @@ void test_disguised_long()
{"-bee=x -by", s_success, "bee:x bee:y"},
{0, 0, 0}
};
test_cmdline("foo,f goo,g= bee,b?", style, test_cases1);
test_cmdline("foo,f goo,g= bee,b=", style, test_cases1);
style = cmdline::style_t(style | allow_slash_for_short);
test_case test_cases2[] = {
@@ -356,7 +361,7 @@ void test_disguised_long()
{"/goo=x", s_success, "goo:x"},
{0, 0, 0}
};
test_cmdline("foo,f goo,g= bee,b?", style, test_cases2);
test_cmdline("foo,f goo,g=", style, test_cases2);
}
void test_guessing()
@@ -607,6 +612,35 @@ void test_unregistered()
// It's not clear yet, so I'm leaving the decision till later.
}
void test_implicit_value()
{
using namespace command_line_style;
cmdline::style_t style;
style = cmdline::style_t(
allow_long | long_allow_adjacent
);
test_case test_cases1[] = {
{"--foo bar", s_success, "foo: positional:bar"},
{"--foo=bar foobar", s_success, "foo:bar positional:foobar"},
{0, 0, 0}
};
test_cmdline("positional= foo?", style, test_cases1);
style = cmdline::style_t(
allow_short | allow_dash_for_short
| short_allow_adjacent);
test_case test_cases2[] = {
{"-f bar", s_success, "-f: positional:bar"},
{"-fbar foobar", s_success, "-f:bar positional:foobar"},
{0, 0, 0}
};
test_cmdline("positional= ,f?", style, test_cases2);
}
int main(int /*ac*/, char** /*av*/)
{
test_long_options();
@@ -619,6 +653,7 @@ int main(int /*ac*/, char** /*av*/)
test_additional_parser();
test_style_parser();
test_unregistered();
test_implicit_value();
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@@ -25,6 +25,7 @@ void test_type()
("bar", value<string>(), "")
;
#ifndef BOOST_NO_RTTI
const typed_value_base* b = dynamic_cast<const typed_value_base*>
(desc.find("foo", false).semantic().get());
BOOST_CHECK(b);
@@ -34,6 +35,7 @@ void test_type()
(desc.find("bar", false).semantic().get());
BOOST_CHECK(b2);
BOOST_CHECK(b2->value_type() == typeid(string));
#endif
}
void test_approximation()