overview.xml 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. <?xml version="1.0" standalone="yes"?>
  2. <!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
  3. "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd"
  4. [
  5. <!ENTITY % entities SYSTEM "program_options.ent" >
  6. %entities;
  7. ]>
  8. <section id="program_options.overview">
  9. <title>Library Overview</title>
  10. <para>In the tutorial section, we saw several examples of library usage.
  11. Here we will describe the overall library design including the primary
  12. components and their function.
  13. </para>
  14. <para>The library has three main components:
  15. <itemizedlist>
  16. <listitem>
  17. <para>The options description component, which describes the allowed options
  18. and what to do with the values of the options.
  19. </para>
  20. </listitem>
  21. <listitem>
  22. <para>The parsers component, which uses this information to find option names
  23. and values in the input sources and return them.
  24. </para>
  25. </listitem>
  26. <listitem>
  27. <para>The storage component, which provides the
  28. interface to access the value of an option. It also converts the string
  29. representation of values that parsers return into desired C++ types.
  30. </para>
  31. </listitem>
  32. </itemizedlist>
  33. </para>
  34. <para>To be a little more concrete, the <code>options_description</code>
  35. class is from the options description component, the
  36. <code>parse_command_line</code> function is from the parsers component, and the
  37. <code>variables_map</code> class is from the storage component. </para>
  38. <para>In the tutorial we've learned how those components can be used by the
  39. <code>main</code> function to parse the command line and config
  40. file. Before going into the details of each component, a few notes about
  41. the world outside of <code>main</code>.
  42. </para>
  43. <para>
  44. For that outside world, the storage component is the most important. It
  45. provides a class which stores all option values and that class can be
  46. freely passed around your program to modules which need access to the
  47. options. All the other components can be used only in the place where
  48. the actual parsing is the done. However, it might also make sense for the
  49. individual program modules to describe their options and pass them to the
  50. main module, which will merge all options. Of course, this is only
  51. important when the number of options is large and declaring them in one
  52. place becomes troublesome.
  53. </para>
  54. <!--
  55. <para>The design looks very simple and straight-forward, but it is worth
  56. noting some important points:
  57. <itemizedlist>
  58. <listitem>
  59. <para>The options description is not tied to specific source. Once
  60. options are described, all parsers can use that description.</para>
  61. </listitem>
  62. <listitem>
  63. <para>The parsers are intended to be fairly dumb. They just
  64. split the input into (name, value) pairs, using strings to represent
  65. names and values. No meaningful processing of values is done.
  66. </para>
  67. </listitem>
  68. <listitem>
  69. <para>The storage component is focused on storing options values. It
  70. </para>
  71. </listitem>
  72. </itemizedlist>
  73. </para>
  74. -->
  75. <section>
  76. <title>Options Description Component</title>
  77. <para>The options description component has three main classes:
  78. &option_description;, &value_semantic; and &options_description;. The
  79. first two together describe a single option. The &option_description;
  80. class contains the option's name, description and a pointer to &value_semantic;,
  81. which, in turn, knows the type of the option's value and can parse the value,
  82. apply the default value, and so on. The &options_description; class is a
  83. container for instances of &option_description;.
  84. </para>
  85. <para>For almost every library, those classes could be created in a
  86. conventional way: that is, you'd create new options using constructors and
  87. then call the <code>add</code> method of &options_description;. However,
  88. that's overly verbose for declaring 20 or 30 options. This concern led
  89. to creation of the syntax that you've already seen:
  90. <programlisting>
  91. options_description desc;
  92. desc.add_options()
  93. ("help", "produce help")
  94. ("optimization", value&lt;int&gt;()->default_value(10), "optimization level")
  95. ;
  96. </programlisting>
  97. </para>
  98. <para>The call to the <code>value</code> function creates an instance of
  99. a class derived from the <code>value_semantic</code> class: <code>typed_value</code>.
  100. That class contains the code to parse
  101. values of a specific type, and contains a number of methods which can be
  102. called by the user to specify additional information. (This
  103. essentially emulates named parameters of the constructor.) Calls to
  104. <code>operator()</code> on the object returned by <code>add_options</code>
  105. forward arguments to the constructor of the <code>option_description</code>
  106. class and add the new instance.
  107. </para>
  108. <para>
  109. Note that in addition to the
  110. <code>value</code>, library provides the <code>bool_switch</code>
  111. function, and user can write his own function which will return
  112. other subclasses of <code>value_semantic</code> with
  113. different behaviour. For the remainder of this section, we'll talk only
  114. about the <code>value</code> function.
  115. </para>
  116. <para>The information about an option is divided into syntactic and
  117. semantic. Syntactic information includes the name of the option and the
  118. number of tokens which can be used to specify the value. This
  119. information is used by parsers to group tokens into (name, value) pairs,
  120. where value is just a vector of strings
  121. (<code>std::vector&lt;std::string&gt;</code>). The semantic layer
  122. is responsible for converting the value of the option into more usable C++
  123. types.
  124. </para>
  125. <para>This separation is an important part of library design. The parsers
  126. use only the syntactic layer, which takes away some of the freedom to
  127. use overly complex structures. For example, it's not easy to parse
  128. syntax like: <screen>calc --expression=1 + 2/3</screen> because it's not
  129. possible to parse <screen>1 + 2/3</screen> without knowing that it's a C
  130. expression. With a little help from the user the task becomes trivial,
  131. and the syntax clear: <screen>calc --expression="1 + 2/3"</screen>
  132. </para>
  133. <section>
  134. <title>Syntactic Information</title>
  135. <para>The syntactic information is provided by the
  136. <classname>boost::program_options::options_description</classname> class
  137. and some methods of the
  138. <classname>boost::program_options::value_semantic</classname> class
  139. and includes:
  140. <itemizedlist>
  141. <listitem>
  142. <para>
  143. name of the option, used to identify the option inside the
  144. program,
  145. </para>
  146. </listitem>
  147. <listitem>
  148. <para>
  149. description of the option, which can be presented to the user,
  150. </para>
  151. </listitem>
  152. <listitem>
  153. <para>
  154. the allowed number of source tokens that comprise options's
  155. value, which is used during parsing.
  156. </para>
  157. </listitem>
  158. </itemizedlist>
  159. </para>
  160. <para>Consider the following example:
  161. <programlisting>
  162. options_description desc;
  163. desc.add_options()
  164. ("help", "produce help message")
  165. ("compression", value&lt;string&gt;(), "compression level")
  166. ("verbose", value&lt;string&gt;()->implicit_value("0"), "verbosity level")
  167. ("email", value&lt;string&gt;()->multitoken(), "email to send to")
  168. ;
  169. </programlisting>
  170. For the first parameter, we specify only the name and the
  171. description. No value can be specified in the parsed source.
  172. For the first option, the user must specify a value, using a single
  173. token. For the third option, the user may either provide a single token
  174. for the value, or no token at all. For the last option, the value can
  175. span several tokens. For example, the following command line is OK:
  176. <screen>
  177. test --help --compression 10 --verbose --email beadle@mars beadle2@mars
  178. </screen>
  179. </para>
  180. <section>
  181. <title>Description formatting</title>
  182. <para>
  183. Sometimes the description can get rather long, for example, when
  184. several option's values need separate documentation. Below we
  185. describe some simple formatting mechanisms you can use.
  186. </para>
  187. <para>The description string has one or more paragraphs, separated by
  188. the newline character ('\n'). When an option is output, the library
  189. will compute the indentation for options's description. Each of the
  190. paragraph is output as a separate line with that intentation. If
  191. a paragraph does not fit on one line it is spanned over multiple
  192. lines (which will have the same indentation).
  193. </para>
  194. <para>You may specify additional indent for the first specified by
  195. inserting spaces at the beginning of a paragraph. For example:
  196. <programlisting>
  197. options.add_options()
  198. ("help", " A long help msg a long help msg a long help msg a long help
  199. msg a long help msg a long help msg a long help msg a long help msg ")
  200. ;
  201. </programlisting>
  202. will specify a four-space indent for the first line. The output will
  203. look like:
  204. <screen>
  205. --help A long help msg a long
  206. help msg a long help msg
  207. a long help msg a long
  208. help msg a long help msg
  209. a long help msg a long
  210. help msg
  211. </screen>
  212. </para>
  213. <para>For the case where line is wrapped, you can want an additional
  214. indent for wrapped text. This can be done by
  215. inserting a tabulator character ('\t') at the desired position. For
  216. example:
  217. <programlisting>
  218. options.add_options()
  219. ("well_formated", "As you can see this is a very well formatted
  220. option description.\n"
  221. "You can do this for example:\n\n"
  222. "Values:\n"
  223. " Value1: \tdoes this and that, bla bla bla bla
  224. bla bla bla bla bla bla bla bla bla bla bla\n"
  225. " Value2: \tdoes something else, bla bla bla bla
  226. bla bla bla bla bla bla bla bla bla bla bla\n\n"
  227. " This paragraph has a first line indent only,
  228. bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla");
  229. </programlisting>
  230. will produce:
  231. <screen>
  232. --well_formated As you can see this is a
  233. very well formatted
  234. option description.
  235. You can do this for
  236. example:
  237. Values:
  238. Value1: does this and
  239. that, bla bla
  240. bla bla bla bla
  241. bla bla bla bla
  242. bla bla bla bla
  243. bla
  244. Value2: does something
  245. else, bla bla
  246. bla bla bla bla
  247. bla bla bla bla
  248. bla bla bla bla
  249. bla
  250. This paragraph has a
  251. first line indent only,
  252. bla bla bla bla bla bla
  253. bla bla bla bla bla bla
  254. bla bla bla
  255. </screen>
  256. The tab character is removed before output. Only one tabulator per
  257. paragraph is allowed, otherwise an exception of type
  258. program_options::error is thrown. Finally, the tabulator is ignored if
  259. it is not on the first line of the paragraph or is on the last
  260. possible position of the first line.
  261. </para>
  262. </section>
  263. </section>
  264. <section>
  265. <title>Semantic Information</title>
  266. <para>The semantic information is completely provided by the
  267. <classname>boost::program_options::value_semantic</classname> class. For
  268. example:
  269. <programlisting>
  270. options_description desc;
  271. desc.add_options()
  272. ("compression", value&lt;int&gt;()->default_value(10), "compression level")
  273. ("email", value&lt; vector&lt;string&gt; &gt;()
  274. ->composing()->notifier(&amp;your_function), "email")
  275. ;
  276. </programlisting>
  277. These declarations specify that default value of the first option is 10,
  278. that the second option can appear several times and all instances should
  279. be merged, and that after parsing is done, the library will call
  280. function <code>&amp;your_function</code>, passing the value of the
  281. "email" option as argument.
  282. </para>
  283. </section>
  284. <section>
  285. <title>Positional Options</title>
  286. <para>Our definition of option as (name, value) pairs is simple and
  287. useful, but in one special case of the command line, there's a
  288. problem. A command line can include a <firstterm>positional option</firstterm>,
  289. which does not specify any name at all, for example:
  290. <screen>
  291. archiver --compression=9 /etc/passwd
  292. </screen>
  293. Here, the "/etc/passwd" element does not have any option name.
  294. </para>
  295. <para>One solution is to ask the user to extract positional options
  296. himself and process them as he likes. However, there's a nicer approach
  297. -- provide a method to automatically assign the names for positional
  298. options, so that the above command line can be interpreted the same way
  299. as:
  300. <screen>
  301. archiver --compression=9 --input-file=/etc/passwd
  302. </screen>
  303. </para>
  304. <para>The &positional_options_desc; class allows the command line
  305. parser to assign the names. The class specifies how many positional options
  306. are allowed, and for each allowed option, specifies the name. For example:
  307. <programlisting>
  308. positional_options_description pd; pd.add("input-file", 1);
  309. </programlisting> specifies that for exactly one, first, positional
  310. option the name will be "input-file".
  311. </para>
  312. <para>It's possible to specify that a number, or even all positional options, be
  313. given the same name.
  314. <programlisting>
  315. positional_options_description pd;
  316. pd.add("output-file", 2).add("input-file", -1);
  317. </programlisting>
  318. In the above example, the first two positional options will be associated
  319. with name "output-file", and any others with the name "input-file".
  320. </para>
  321. <warning>
  322. <para>The &positional_options_desc; class only specifies translation from
  323. position to name, and the option name should still be registered with
  324. an instance of the &options_description; class.</para>
  325. </warning>
  326. </section>
  327. <!-- Note that the classes are not modified during parsing -->
  328. </section>
  329. <section>
  330. <title>Parsers Component</title>
  331. <para>The parsers component splits input sources into (name, value) pairs.
  332. Each parser looks for possible options and consults the options
  333. description component to determine if the option is known and how its value
  334. is specified. In the simplest case, the name is explicitly specified,
  335. which allows the library to decide if such option is known. If it is known, the
  336. &value_semantic; instance determines how the value is specified. (If
  337. it is not known, an exception is thrown.) Common
  338. cases are when the value is explicitly specified by the user, and when
  339. the value cannot be specified by the user, but the presence of the
  340. option implies some value (for example, <code>true</code>). So, the
  341. parser checks that the value is specified when needed and not specified
  342. when not needed, and returns new (name, value) pair.
  343. </para>
  344. <para>
  345. To invoke a parser you typically call a function, passing the options
  346. description and command line or config file or something else.
  347. The results of parsing are returned as an instance of the &parsed_options;
  348. class. Typically, that object is passed directly to the storage
  349. component. However, it also can be used directly, or undergo some additional
  350. processing.
  351. </para>
  352. <para>
  353. There are three exceptions to the above model -- all related to
  354. traditional usage of the command line. While they require some support
  355. from the options description component, the additional complexity is
  356. tolerable.
  357. <itemizedlist>
  358. <listitem>
  359. <para>The name specified on the command line may be
  360. different from the option name -- it's common to provide a "short option
  361. name" alias to a longer name. It's also common to allow an abbreviated name
  362. to be specified on the command line.
  363. </para>
  364. </listitem>
  365. <listitem>
  366. <para>Sometimes it's desirable to specify value as several
  367. tokens. For example, an option "--email-recipient" may be followed
  368. by several emails, each as a separate command line token. This
  369. behaviour is supported, though it can lead to parsing ambiguities
  370. and is not enabled by default.
  371. </para>
  372. </listitem>
  373. <listitem>
  374. <para>The command line may contain positional options -- elements
  375. which don't have any name. The command line parser provides a
  376. mechanism to guess names for such options, as we've seen in the
  377. tutorial.
  378. </para>
  379. </listitem>
  380. </itemizedlist>
  381. </para>
  382. </section>
  383. <section>
  384. <title>Storage Component</title>
  385. <para>The storage component is responsible for:
  386. <itemizedlist>
  387. <listitem>
  388. <para>Storing the final values of an option into a special class and in
  389. regular variables</para>
  390. </listitem>
  391. <listitem>
  392. <para>Handling priorities among different sources.</para>
  393. </listitem>
  394. <listitem>
  395. <para>Calling user-specified <code>notify</code> functions with the final
  396. values of options.</para>
  397. </listitem>
  398. </itemizedlist>
  399. </para>
  400. <para>Let's consider an example:
  401. <programlisting>
  402. variables_map vm;
  403. store(parse_command_line(argc, argv, desc), vm);
  404. store(parse_config_file("example.cfg", desc), vm);
  405. notify(vm);
  406. </programlisting>
  407. The <code>variables_map</code> class is used to store the option
  408. values. The two calls to the <code>store</code> function add values
  409. found on the command line and in the config file. Finally the call to
  410. the <code>notify</code> function runs the user-specified notify
  411. functions and stores the values into regular variables, if needed.
  412. </para>
  413. <para>The priority is handled in a simple way: the <code>store</code>
  414. function will not change the value of an option if it's already
  415. assigned. In this case, if the command line specifies the value for an
  416. option, any value in the config file is ignored.
  417. </para>
  418. <warning>
  419. <para>Don't forget to call the <code>notify</code> function after you've
  420. stored all parsed values.</para>
  421. </warning>
  422. </section>
  423. <section>
  424. <title>Specific parsers</title>
  425. <section>
  426. <title>Configuration file parser</title>
  427. <para>The &parse_config_file; function implements parsing
  428. of simple INI-like configuration files. Configuration file
  429. syntax is line based:
  430. </para>
  431. <itemizedlist>
  432. <listitem><para>A line in the form:</para>
  433. <screen>
  434. <replaceable>name</replaceable>=<replaceable>value</replaceable>
  435. </screen>
  436. <para>gives a value to an option.</para>
  437. </listitem>
  438. <listitem><para>A line in the form:</para>
  439. <screen>
  440. [<replaceable>section name</replaceable>]
  441. </screen>
  442. <para>introduces a new section in the configuration file.</para>
  443. </listitem>
  444. <listitem><para>The <literal>#</literal> character introduces a
  445. comment that spans until the end of the line.</para>
  446. </listitem>
  447. </itemizedlist>
  448. <para>The option names are relative to the section names, so
  449. the following configuration file part:</para>
  450. <screen>
  451. [gui.accessibility]
  452. visual_bell=yes
  453. </screen>
  454. <para>is equivalent to</para>
  455. <screen>
  456. gui.accessibility.visual_bell=yes
  457. </screen>
  458. <para>When the option "gui.accessibility.visual_bell" has been added to the options</para>
  459. <programlisting>
  460. options_description desc;
  461. desc.add_options()
  462. ("gui.accessibility.visual_bell", value&lt;string&gt;(), "flash screen for bell")
  463. ;
  464. </programlisting>
  465. </section>
  466. <section>
  467. <title>Environment variables parser</title>
  468. <para><firstterm>Environment variables</firstterm> are string variables
  469. which are available to all programs via the <code>getenv</code> function
  470. of C runtime library. The operating system allows to set initial values
  471. for a given user, and the values can be further changed on the command
  472. line. For example, on Windows one can use the
  473. <filename>autoexec.bat</filename> file or (on recent versions) the
  474. <filename>Control Panel/System/Advanced/Environment Variables</filename>
  475. dialog, and on Unix &#x2014;, the <filename>/etc/profile</filename>,
  476. <filename>~/.profile</filename> and <filename>~/.bash_profile</filename>
  477. files. Because environment variables can be set for the entire system,
  478. they are particularly suitable for options which apply to all programs.
  479. </para>
  480. <para>The environment variables can be parsed with the
  481. &parse_environment; function. The function have several overloaded
  482. versions. The first parameter is always an &options_description;
  483. instance, and the second specifies what variables must be processed, and
  484. what option names must correspond to it. To describe the second
  485. parameter we need to consider naming conventions for environment
  486. variables.</para>
  487. <para>If you have an option that should be specified via environment
  488. variable, you need make up the variable's name. To avoid name clashes,
  489. we suggest that you use a sufficiently unique prefix for environment
  490. variables. Also, while option names are most likely in lower case,
  491. environment variables conventionally use upper case. So, for an option
  492. name <literal>proxy</literal> the environment variable might be called
  493. <envar>BOOST_PROXY</envar>. During parsing, we need to perform reverse
  494. conversion of the names. This is accomplished by passing the choosen
  495. prefix as the second parameter of the &parse_environment; function.
  496. Say, if you pass <literal>BOOST_</literal> as the prefix, and there are
  497. two variables, <envar>CVSROOT</envar> and <envar>BOOST_PROXY</envar>, the
  498. first variable will be ignored, and the second one will be converted to
  499. option <literal>proxy</literal>.
  500. </para>
  501. <para>The above logic is sufficient in many cases, but it is also
  502. possible to pass, as the second parameter of the &parse_environment;
  503. function, any function taking a <code>std::string</code> and returning
  504. <code>std::string</code>. That function will be called for each
  505. environment variable and should return either the name of the option, or
  506. empty string if the variable should be ignored. An example showing this
  507. method can be found in "example/env_options.cpp".
  508. </para>
  509. </section>
  510. </section>
  511. <section>
  512. <title>Types</title>
  513. <para>Everything that is passed in on the command line, as an environmental
  514. variable, or in a config file is a string. For values that need to be used
  515. as a non-string type, the value in the variables_map will attempt to
  516. convert it to the correct type.</para>
  517. <para>Integers and floating point values are converted using Boost's
  518. lexical_cast. It will accept integer values such as "41" or "-42". It will
  519. accept floating point numbers such as "51.1", "-52.1", "53.1234567890" (as
  520. a double), "54", "55.", ".56", "57.1e5", "58.1E5", ".591e5", "60.1e-5",
  521. "-61.1e5", "-62.1e-5", etc. Unfortunately, hex, octal, and binary
  522. representations that are available in C++ literals are not supported by
  523. lexical_cast, and thus will not work with program_options.</para>
  524. <para>Booleans a special in that there are multiple ways to come at them.
  525. Similar to another value type, it can be specified as <code>("my-option",
  526. value&lt;bool&gt;())</code>, and then set as:</para>
  527. <screen>
  528. example --my-option=true
  529. </screen>
  530. <para>However, more typical is that boolean values are set by the simple
  531. presence of a switch. This is enabled by &bool_switch; as in <code>
  532. ("other-option", bool_switch())</code>. This will cause the value to
  533. default to false and it will become true if the switch is found:</para>
  534. <screen>
  535. example --other-switch
  536. </screen>
  537. <para>When a boolean does take a parameter, there are several options.
  538. Those that evaluate to true in C++ are: "true", "yes", "on", "1". Those
  539. that evaluate to false in C++ are: "false", "no", "off", "0". In addition,
  540. when reading from a config file, the option name with an equal sign and no
  541. value after it will also evaluate to true.</para>
  542. </section>
  543. <section>
  544. <title>Annotated List of Symbols</title>
  545. <para>The following table describes all the important symbols in the
  546. library, for quick access.</para>
  547. <informaltable pgwide="1">
  548. <tgroup cols="2">
  549. <colspec colname='c1'/>
  550. <colspec colname='c2'/>
  551. <thead>
  552. <row>
  553. <entry>Symbol</entry>
  554. <entry>Description</entry>
  555. </row>
  556. </thead>
  557. <tbody>
  558. <row>
  559. <entry namest='c1' nameend='c2'>Options description component</entry>
  560. </row>
  561. <row>
  562. <entry>&options_description;</entry>
  563. <entry>describes a number of options</entry>
  564. </row>
  565. <row>
  566. <entry>&value;</entry>
  567. <entry>defines the option's value</entry>
  568. </row>
  569. <row>
  570. <entry namest='c1' nameend='c2'>Parsers component</entry>
  571. </row>
  572. <row>
  573. <entry>&parse_command_line;</entry>
  574. <entry>parses command line (simpified interface)</entry>
  575. </row>
  576. <row>
  577. <entry>&basic_command_line_parser;</entry>
  578. <entry>parses command line (extended interface)</entry>
  579. </row>
  580. <row>
  581. <entry>&parse_config_file;</entry>
  582. <entry>parses config file</entry>
  583. </row>
  584. <row>
  585. <entry>&parse_environment;</entry>
  586. <entry>parses environment</entry>
  587. </row>
  588. <row>
  589. <entry namest='c1' nameend='c2'>Storage component</entry>
  590. </row>
  591. <row>
  592. <entry>&variables_map;</entry>
  593. <entry>storage for option values</entry>
  594. </row>
  595. </tbody>
  596. </tgroup>
  597. </informaltable>
  598. </section>
  599. </section>
  600. <!--
  601. Local Variables:
  602. mode: nxml
  603. sgml-indent-data: t
  604. sgml-parent-document: ("program_options.xml" "section")
  605. sgml-set-face: t
  606. End:
  607. -->