[Mono.Options] Add option header support.
authorJonathan Pryor <jonpryor@vt.edu>
Mon, 7 Mar 2011 00:30:48 +0000 (19:30 -0500)
committerJonathan Pryor <jonpryor@vt.edu>
Mon, 7 Mar 2011 06:59:44 +0000 (01:59 -0500)
Option headers can be provided via OptionSet.Add(string), and allows
forgoing the use of a separate mechanism to provide contextual output.

For example, one used to do this:

bool show_help = false;
new OptionSet  {
// ...
{ "help|h|?", v => show_help = v != null },
}.Parse (args);

if (show_help) {
Console.WriteLine ("usage: sample-app ARGS");
p.WriteOptionDescriptions (Console.Out);
// ...
}

Using the new header support, the "contextual" output can be merged
with the option specification:

bool show_help = false;
new OptionSet {
"usage: sample-app ARGS",
{ "help|h|?", v => show_help = v != null },
}.Parse (args);

if (show_help)
p.WriteOptionDescriptions (Console.Out);

Furthermore, headers can be provided "inline", thus serving as a
mechanism to categorize options:

// mcs options
var p = new OptionSet {
"Mono C# compiler, Copyright 2001 - 2011 Novell, Inc.",
"mcs [options] source-files",
// ...
"Resources:",
{ "linkresource|linkres:", v => /* ... */ },
// ...
"",
"Options can be of the form -option or /option",
};

17 files changed:
data/mono-options.pc.in
mcs/class/Mono.Options/Assembly/AssemblyInfo.cs
mcs/class/Mono.Options/Documentation/en/Mono.Options/ArgumentSource.xml
mcs/class/Mono.Options/Documentation/en/Mono.Options/Option.xml
mcs/class/Mono.Options/Documentation/en/Mono.Options/OptionAction`2.xml
mcs/class/Mono.Options/Documentation/en/Mono.Options/OptionContext.xml
mcs/class/Mono.Options/Documentation/en/Mono.Options/OptionException.xml
mcs/class/Mono.Options/Documentation/en/Mono.Options/OptionSet.xml
mcs/class/Mono.Options/Documentation/en/Mono.Options/OptionValueCollection.xml
mcs/class/Mono.Options/Documentation/en/Mono.Options/OptionValueType.xml
mcs/class/Mono.Options/Documentation/en/Mono.Options/ResponseFileSource.xml
mcs/class/Mono.Options/Documentation/en/examples/bundling.cs
mcs/class/Mono.Options/Documentation/en/examples/bundling.txt
mcs/class/Mono.Options/Documentation/en/examples/greet.cs
mcs/class/Mono.Options/Documentation/en/index.xml
mcs/class/Mono.Options/Mono.Options/Options.cs
mcs/class/Mono.Options/Test/Mono.Options/OptionSetTest.cs

index 8c569820d4e7169453f66f1953ad99416a8211c8..8569ffc2efbfde08a56bfd081fcf32a7bca3ed1c 100644 (file)
@@ -4,4 +4,4 @@ Sources=${assemblies_dir}/Options.cs
 
 Name: Mono.Options
 Description: Command Line Parsing Library
-Version: 0.2.2
+Version: 0.2.3
index 281d53b44f98fb4508ad2d7fa2c577ac3e0b9086..fa9c43f3772ba53d9680f444a899db68a8beddc1 100644 (file)
@@ -41,7 +41,7 @@ using System.Security.Permissions;
        //
        // DO NOT MODIFY STRINGS BELOW WITHOUT UPDATING mono/data/mono-options.pc.in
        //
-       "0.2.2.0"
+       "0.2.3.0"
        //
        // DO NOT MODIFY STRINGS ABOVE WITHOUT UPDATING mono/data/mono-options.pc.in
        //
index 83d920606599b3c7b82c8324eb1a5457e2229b32..0e7d0c5446214aac33413e528c398bcca5a5b56b 100644 (file)
@@ -4,6 +4,7 @@
   <AssemblyInfo>
     <AssemblyName>Mono.Options</AssemblyName>
     <AssemblyVersion>0.2.2.0</AssemblyVersion>
+    <AssemblyVersion>0.2.3.0</AssemblyVersion>
   </AssemblyInfo>
   <Base>
     <BaseTypeName>System.Object</BaseTypeName>
@@ -48,6 +49,7 @@
       <MemberType>Constructor</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Parameters />
       <Docs>
@@ -65,6 +67,7 @@
       <MemberType>Property</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String</ReturnType>
@@ -89,6 +92,7 @@
       <MemberType>Method</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Collections.Generic.IEnumerable&lt;System.String&gt;</ReturnType>
       <MemberType>Method</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Boolean</ReturnType>
       <MemberType>Method</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Collections.Generic.IEnumerable&lt;System.String&gt;</ReturnType>
       <MemberType>Method</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String[]</ReturnType>
index 46f5e241e9e2bfd6d9b74652bcbb10649dc0bed6..661c9a51b79a09a9f667048fe88d461a519f556e 100644 (file)
@@ -6,6 +6,7 @@
     <AssemblyVersion>0.2.0.0</AssemblyVersion>
     <AssemblyVersion>0.2.1.0</AssemblyVersion>
     <AssemblyVersion>0.2.2.0</AssemblyVersion>
+    <AssemblyVersion>0.2.3.0</AssemblyVersion>
   </AssemblyInfo>
   <ThreadingSafetyStatement>
     All members of this type are safe for multithreaded operations.
@@ -94,6 +95,7 @@
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Parameters>
         <Parameter Name="prototype" Type="System.String" />
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Parameters>
         <Parameter Name="prototype" Type="System.String" />
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String[]</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String[]</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Int32</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
@@ -754,6 +763,7 @@ class Demo {
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionValueType</ReturnType>
@@ -784,6 +794,7 @@ class Demo {
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>T</ReturnType>
@@ -845,6 +856,7 @@ class Demo {
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String</ReturnType>
@@ -880,6 +892,7 @@ class Demo {
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String</ReturnType>
index 0fbd6ce3d7bc3205c7219a04ec517bd0452fc42b..e5b4b073e167aa9eb12a2bbddd96ff2ce003db97 100644 (file)
@@ -6,6 +6,7 @@
     <AssemblyVersion>0.2.0.0</AssemblyVersion>
     <AssemblyVersion>0.2.1.0</AssemblyVersion>
     <AssemblyVersion>0.2.2.0</AssemblyVersion>
+    <AssemblyVersion>0.2.3.0</AssemblyVersion>
   </AssemblyInfo>
   <TypeParameters>
     <TypeParameter Name="TKey" />
index 96262f7702d04e1d0db6d8ea582da09974314252..bac394cc090782a8eb6b460ac7d5b076cbc3ea97 100644 (file)
@@ -6,6 +6,7 @@
     <AssemblyVersion>0.2.0.0</AssemblyVersion>
     <AssemblyVersion>0.2.1.0</AssemblyVersion>
     <AssemblyVersion>0.2.2.0</AssemblyVersion>
+    <AssemblyVersion>0.2.3.0</AssemblyVersion>
   </AssemblyInfo>
   <Base>
     <BaseTypeName>System.Object</BaseTypeName>
@@ -30,6 +31,7 @@
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Parameters>
         <Parameter Name="set" Type="Mono.Options.OptionSet" />
@@ -56,6 +58,7 @@
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.Option</ReturnType>
@@ -75,6 +78,7 @@
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Int32</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionSet</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionValueCollection</ReturnType>
index 5ebfb683fd66358e53a33ae39363097034651fca..f47db8ba35720f86acbb700eab9230ac291c8725 100644 (file)
@@ -6,6 +6,7 @@
     <AssemblyVersion>0.2.0.0</AssemblyVersion>
     <AssemblyVersion>0.2.1.0</AssemblyVersion>
     <AssemblyVersion>0.2.2.0</AssemblyVersion>
+    <AssemblyVersion>0.2.3.0</AssemblyVersion>
   </AssemblyInfo>
   <Base>
     <BaseTypeName>System.Exception</BaseTypeName>
@@ -51,6 +52,7 @@
       <AssemblyInfo>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Parameters />
       <Docs>
@@ -66,6 +68,7 @@
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Parameters>
         <Parameter Name="info" Type="System.Runtime.Serialization.SerializationInfo" />
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Parameters>
         <Parameter Name="message" Type="System.String" />
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Parameters>
         <Parameter Name="message" Type="System.String" />
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String</ReturnType>
index 90fc5ee9d2ada653fb90d4b46b4f9acd550db7fe..bddc27c5b671c5522da349cba25c75d93eaaf86d 100644 (file)
@@ -6,6 +6,7 @@
     <AssemblyVersion>0.2.0.0</AssemblyVersion>
     <AssemblyVersion>0.2.1.0</AssemblyVersion>
     <AssemblyVersion>0.2.2.0</AssemblyVersion>
+    <AssemblyVersion>0.2.3.0</AssemblyVersion>
   </AssemblyInfo>
   <ThreadingSafetyStatement>
     All public static members of this type are safe for multithreaded
         Response files, as used by <c>mcs</c> and other compiler tools, may be
         supported by using <see cref="T:Mono.Options.ResponseFileSource" />.
       </para>
+      <para>
+        "Headers" -- string constants which allow grouping of options in the
+        output of
+        <see cref="M:Mono.Options.OptionSet.WriteOptionDescriptions(System.IO.TextWriter)" />
+        -- may be provided "inline" with the actual options. The <c>greet</c>
+        example below shows such usage.
+      </para>
       <para>
         Three conditions must be met for a sequence of arguments to be
         considered as a match for an <see cref="T:Mono.Options.Option" />:
     </remarks>
     <example>
       <para>
-        The following example demonstrates some simple usage of 
+        The following <c>greet</c> example demonstrates some simple usage of
         <see cref="T:Mono.Options.OptionSet" />.
       </para>
       <code lang="C#" src="examples/greet.cs">using System;
@@ -308,6 +316,11 @@ class Test {
                int repeat = 1;
 
                var p = new OptionSet () {
+                       "Usage: greet [OPTIONS]+ message",
+                       "Greet a list of individuals with an optional message.",
+                       "If no message is specified, a generic greeting is used.",
+                       "",
+                       "Options:",
                        { "n|name=", "the {NAME} of someone to greet.",
                          v =&gt; names.Add (v) },
                        { "r|repeat=", 
@@ -332,7 +345,7 @@ class Test {
                }
 
                if (show_help) {
-                       ShowHelp (p);
+                       p.WriteOptionDescriptions (Console.Out);
                        return;
                }
 
@@ -352,16 +365,6 @@ class Test {
                }
        }
 
-       static void ShowHelp (OptionSet p)
-       {
-               Console.WriteLine ("Usage: greet [OPTIONS]+ message");
-               Console.WriteLine ("Greet a list of individuals with an optional message.");
-               Console.WriteLine ("If no message is specified, a generic greeting is used.");
-               Console.WriteLine ();
-               Console.WriteLine ("Options:");
-               p.WriteOptionDescriptions (Console.Out);
-       }
-
        static void Debug (string format, params object[] args)
        {
                if (verbosity &gt; 0) {
@@ -455,7 +458,10 @@ class Test {
                string color  = null;
 
                var p = new OptionSet () {
-                       // gcc-like options
+                       "Usage: bundling [OPTIONS]+",
+                       "Demo program to show the effects of bundling options and their values",
+                       "",
+                       "gcc-like options:",
                        { "D:", "Predefine a macro with an (optional) value.",
                                (m, v) =&gt; {
                                        if (m == null)
@@ -467,17 +473,20 @@ class Test {
                                (m, v) =&gt; macros.Add (m, v) },
                        { "o=", "Specify the output file", v =&gt; output = v },
 
-                       // tar-like options
+                       "",
+                       "tar-like options:",
                        { "f=", "The input file",   v =&gt; input = v },
                        { "x",  "Extract the file", v =&gt; extract = v != null },
                        { "c",  "Create the file",  v =&gt; create = v != null },
                        { "t",  "List the file",    v =&gt; list = v != null },
 
-                       // ls-like optional values
+                       "",
+                       "ls-like optional values:",
                        { "color:", "control whether and when color is used", 
                                v =&gt; color = v },
 
-                       // other...
+                       "",
+                       "other:",
                        { "h|help",  "show this message and exit", 
                          v =&gt; show_help = v != null },
                        // default
@@ -496,7 +505,7 @@ class Test {
                }
 
                if (show_help) {
-                       ShowHelp (p);
+                       p.WriteOptionDescriptions (Console.Out);
                        return;
                }
 
@@ -512,15 +521,6 @@ class Test {
                Console.WriteLine ("\t       List: {0}", list);
                Console.WriteLine ("\t      Color: {0}", color ?? "&lt;null&gt;");
        }
-
-       static void ShowHelp (OptionSet p)
-       {
-               Console.WriteLine ("Usage: bundling [OPTIONS]+");
-               Console.WriteLine ("Demo program to show the effects of bundling options and their values");
-               Console.WriteLine ();
-               Console.WriteLine ("Options:");
-               p.WriteOptionDescriptions (Console.Out);
-       }
 }
 
 </code>
@@ -531,15 +531,21 @@ class Test {
 Usage: bundling [OPTIONS]+
 Demo program to show the effects of bundling options and their values
 
-Options:
+gcc-like options:
   -D[=VALUE1:VALUE2]         Predefine a macro with an (optional) value.
   -d=VALUE1--&gt;VALUE2         Alternate macro syntax.
   -o=VALUE                   Specify the output file
+
+tar-like options:
   -f=VALUE                   The input file
   -x                         Extract the file
   -c                         Create the file
   -t                         List the file
+
+ls-like optional values:
       --color[=VALUE]        control whether and when color is used
+
+other:
   -h, --help                 show this message and exit
 
 $ mono bundling.exe -D
@@ -830,6 +836,7 @@ Key: a\b\c=d\e\f
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Parameters />
       <Docs>
@@ -856,6 +863,7 @@ Key: a\b\c=d\e\f
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Parameters>
         <Parameter Name="localizer" Type="System.Converter&lt;System.String,System.String&gt;" />
@@ -1026,6 +1034,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
       <MemberType>Method</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionSet</ReturnType>
@@ -1062,6 +1071,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionSet</ReturnType>
@@ -1099,6 +1109,41 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         </exception>
       </Docs>
     </Member>
+    <Member MemberName="Add">
+      <MemberSignature Language="C#" Value="public Mono.Options.OptionSet Add (string header);" />
+      <MemberSignature Language="ILAsm" Value=".method public hidebysig instance class Mono.Options.OptionSet Add(string header) cil managed" />
+      <MemberType>Method</MemberType>
+      <AssemblyInfo>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
+      </AssemblyInfo>
+      <ReturnValue>
+        <ReturnType>Mono.Options.OptionSet</ReturnType>
+      </ReturnValue>
+      <Parameters>
+        <Parameter Name="header" Type="System.String" />
+      </Parameters>
+      <Docs>
+        <param name="header">
+          A <see cref="T:System.String" /> containing the header to display
+          during <see cref="M:Mono.Options.OptionSet.WriteOptionDescriptions(System.IO.TextWriter)" />.
+        </param>
+        <summary>
+          Declare a header to be printed during
+          <see cref="M:Mono.Options.OptionSet.WriteOptionDescriptions(System.IO.TextWriter)" />.
+        </summary>
+        <returns>
+          The current <see cref="T:Mono.Options.OptionSet" /> instance.
+          This is to permit method chaining.
+        </returns>
+        <remarks>
+          <para>
+            The <c>Add(string)</c> method can be used to provide option groupin
+            in the output generatedy by
+            <see cref="M:Mono.Options.OptionSet.WriteOptionDescriptions(System.IO.TextWriter)" />.
+          </para>
+        </remarks>
+      </Docs>
+    </Member>
     <Member MemberName="Add">
       <MemberSignature Language="C#" Value="public Mono.Options.OptionSet Add (string prototype, Mono.Options.OptionAction&lt;string,string&gt; action);" />
       <MemberSignature Language="ILAsm" Value=".method public hidebysig instance class Mono.Options.OptionSet Add(string prototype, class Mono.Options.OptionAction`2&lt;string, string&gt; action) cil managed" />
@@ -1107,6 +1152,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionSet</ReturnType>
@@ -1168,6 +1214,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionSet</ReturnType>
@@ -1229,6 +1276,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionSet</ReturnType>
@@ -1300,6 +1348,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionSet</ReturnType>
@@ -1361,6 +1410,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionSet</ReturnType>
@@ -1422,6 +1472,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionSet</ReturnType>
@@ -1517,6 +1568,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionSet</ReturnType>
@@ -1590,6 +1642,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionSet</ReturnType>
@@ -1674,6 +1727,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
       <MemberType>Property</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Collections.ObjectModel.ReadOnlyCollection&lt;Mono.Options.ArgumentSource&gt;</ReturnType>
@@ -1703,6 +1757,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionContext</ReturnType>
@@ -1742,6 +1797,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
       <AssemblyInfo>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String</ReturnType>
@@ -1794,6 +1850,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Attributes>
         <Attribute>
@@ -1842,6 +1899,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Boolean</ReturnType>
@@ -1936,6 +1994,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
@@ -1968,6 +2027,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Converter&lt;System.String,System.String&gt;</ReturnType>
@@ -1999,6 +2059,7 @@ localization: hello:Could not convert string `not-an-int' to type Int32 for opti
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Collections.Generic.List&lt;System.String&gt;</ReturnType>
@@ -2104,6 +2165,11 @@ class Test {
                int repeat = 1;
 
                var p = new OptionSet () {
+                       "Usage: greet [OPTIONS]+ message",
+                       "Greet a list of individuals with an optional message.",
+                       "If no message is specified, a generic greeting is used.",
+                       "",
+                       "Options:",
                        { "n|name=", "the {NAME} of someone to greet.",
                          v =&gt; names.Add (v) },
                        { "r|repeat=", 
@@ -2128,7 +2194,7 @@ class Test {
                }
 
                if (show_help) {
-                       ShowHelp (p);
+                       p.WriteOptionDescriptions (Console.Out);
                        return;
                }
 
@@ -2148,16 +2214,6 @@ class Test {
                }
        }
 
-       static void ShowHelp (OptionSet p)
-       {
-               Console.WriteLine ("Usage: greet [OPTIONS]+ message");
-               Console.WriteLine ("Greet a list of individuals with an optional message.");
-               Console.WriteLine ("If no message is specified, a generic greeting is used.");
-               Console.WriteLine ();
-               Console.WriteLine ("Options:");
-               p.WriteOptionDescriptions (Console.Out);
-       }
-
        static void Debug (string format, params object[] args)
        {
                if (verbosity &gt; 0) {
@@ -2179,6 +2235,7 @@ class Test {
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Boolean</ReturnType>
@@ -2276,6 +2333,7 @@ class Test {
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
@@ -2304,6 +2362,7 @@ class Test {
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
@@ -2338,6 +2397,7 @@ class Test {
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
@@ -2411,6 +2471,11 @@ class Test {
                int repeat = 1;
 
                var p = new OptionSet () {
+                       "Usage: greet [OPTIONS]+ message",
+                       "Greet a list of individuals with an optional message.",
+                       "If no message is specified, a generic greeting is used.",
+                       "",
+                       "Options:",
                        { "n|name=", "the {NAME} of someone to greet.",
                          v =&gt; names.Add (v) },
                        { "r|repeat=", 
@@ -2435,7 +2500,7 @@ class Test {
                }
 
                if (show_help) {
-                       ShowHelp (p);
+                       p.WriteOptionDescriptions (Console.Out);
                        return;
                }
 
@@ -2455,16 +2520,6 @@ class Test {
                }
        }
 
-       static void ShowHelp (OptionSet p)
-       {
-               Console.WriteLine ("Usage: greet [OPTIONS]+ message");
-               Console.WriteLine ("Greet a list of individuals with an optional message.");
-               Console.WriteLine ("If no message is specified, a generic greeting is used.");
-               Console.WriteLine ();
-               Console.WriteLine ("Options:");
-               p.WriteOptionDescriptions (Console.Out);
-       }
-
        static void Debug (string format, params object[] args)
        {
                if (verbosity &gt; 0) {
index eb98dc99a67381bb58d53b605387b98206482415..070daace68c9d9b7278cd7dbdef2a44104544c37 100644 (file)
@@ -6,6 +6,7 @@
     <AssemblyVersion>0.2.0.0</AssemblyVersion>
     <AssemblyVersion>0.2.1.0</AssemblyVersion>
     <AssemblyVersion>0.2.2.0</AssemblyVersion>
+    <AssemblyVersion>0.2.3.0</AssemblyVersion>
   </AssemblyInfo>
   <Base>
     <BaseTypeName>System.Object</BaseTypeName>
@@ -64,6 +65,7 @@
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
@@ -85,6 +87,7 @@
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Boolean</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Int32</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Collections.Generic.IEnumerator&lt;System.String&gt;</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Int32</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Boolean</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Boolean</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Boolean</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Object</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Collections.IEnumerator</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Int32</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Boolean</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Int32</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Boolean</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Object</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Void</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String[]</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Collections.Generic.List&lt;System.String&gt;</ReturnType>
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String</ReturnType>
index aa035c500d6af5bc134145d6853f9e2e38b21fde..c16f5608f27f50a3d968069c1a6ac72afe727a73 100644 (file)
@@ -6,6 +6,7 @@
     <AssemblyVersion>0.2.0.0</AssemblyVersion>
     <AssemblyVersion>0.2.1.0</AssemblyVersion>
     <AssemblyVersion>0.2.2.0</AssemblyVersion>
+    <AssemblyVersion>0.2.3.0</AssemblyVersion>
   </AssemblyInfo>
   <Base>
     <BaseTypeName>System.Enum</BaseTypeName>
@@ -28,6 +29,7 @@
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionValueType</ReturnType>
@@ -51,6 +53,7 @@
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionValueType</ReturnType>
@@ -79,6 +82,7 @@
         <AssemblyVersion>0.2.0.0</AssemblyVersion>
         <AssemblyVersion>0.2.1.0</AssemblyVersion>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>Mono.Options.OptionValueType</ReturnType>
index f97cb570494f91bb7525784634d935981b34d099..566f4a3fcdaca6d488182af73ff169e5f7affee0 100644 (file)
@@ -4,6 +4,7 @@
   <AssemblyInfo>
     <AssemblyName>Mono.Options</AssemblyName>
     <AssemblyVersion>0.2.2.0</AssemblyVersion>
+    <AssemblyVersion>0.2.3.0</AssemblyVersion>
   </AssemblyInfo>
   <Base>
     <BaseTypeName>Mono.Options.ArgumentSource</BaseTypeName>
@@ -28,6 +29,7 @@
       <MemberType>Constructor</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <Parameters />
       <Docs>
@@ -45,6 +47,7 @@
       <MemberType>Property</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String</ReturnType>
@@ -67,6 +70,7 @@
       <MemberType>Method</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.Boolean</ReturnType>
       <MemberType>Method</MemberType>
       <AssemblyInfo>
         <AssemblyVersion>0.2.2.0</AssemblyVersion>
+        <AssemblyVersion>0.2.3.0</AssemblyVersion>
       </AssemblyInfo>
       <ReturnValue>
         <ReturnType>System.String[]</ReturnType>
index b13ebbc557455b0c5bf88712c54aba768633b7b9..4694128671b39ce3fbf4d5b76dc6fe48b6ae126d 100644 (file)
@@ -13,7 +13,10 @@ class Test {
                string color  = null;
 
                var p = new OptionSet () {
-                       // gcc-like options
+                       "Usage: bundling [OPTIONS]+",
+                       "Demo program to show the effects of bundling options and their values",
+                       "",
+                       "gcc-like options:",
                        { "D:", "Predefine a macro with an (optional) value.",
                                (m, v) => {
                                        if (m == null)
@@ -25,17 +28,20 @@ class Test {
                                (m, v) => macros.Add (m, v) },
                        { "o=", "Specify the output file", v => output = v },
 
-                       // tar-like options
+                       "",
+                       "tar-like options:",
                        { "f=", "The input file",   v => input = v },
                        { "x",  "Extract the file", v => extract = v != null },
                        { "c",  "Create the file",  v => create = v != null },
                        { "t",  "List the file",    v => list = v != null },
 
-                       // ls-like optional values
+                       "",
+                       "ls-like optional values:",
                        { "color:", "control whether and when color is used", 
                                v => color = v },
 
-                       // other...
+                       "",
+                       "other:",
                        { "h|help",  "show this message and exit", 
                          v => show_help = v != null },
                        // default
@@ -54,7 +60,7 @@ class Test {
                }
 
                if (show_help) {
-                       ShowHelp (p);
+                       p.WriteOptionDescriptions (Console.Out);
                        return;
                }
 
@@ -70,14 +76,5 @@ class Test {
                Console.WriteLine ("\t       List: {0}", list);
                Console.WriteLine ("\t      Color: {0}", color ?? "<null>");
        }
-
-       static void ShowHelp (OptionSet p)
-       {
-               Console.WriteLine ("Usage: bundling [OPTIONS]+");
-               Console.WriteLine ("Demo program to show the effects of bundling options and their values");
-               Console.WriteLine ();
-               Console.WriteLine ("Options:");
-               p.WriteOptionDescriptions (Console.Out);
-       }
 }
 
index 034a6bea1467f8e9c251f54c46f180d970ef51fa..0ef6432f6d1c6c030d6ad030d19a96b506bbfe97 100644 (file)
@@ -2,15 +2,21 @@ $ mono bundling.exe --help
 Usage: bundling [OPTIONS]+
 Demo program to show the effects of bundling options and their values
 
-Options:
+gcc-like options:
   -D[=VALUE1:VALUE2]         Predefine a macro with an (optional) value.
   -d=VALUE1-->VALUE2         Alternate macro syntax.
   -o=VALUE                   Specify the output file
+
+tar-like options:
   -f=VALUE                   The input file
   -x                         Extract the file
   -c                         Create the file
   -t                         List the file
+
+ls-like optional values:
       --color[=VALUE]        control whether and when color is used
+
+other:
   -h, --help                 show this message and exit
 
 $ mono bundling.exe -D
index 6327862fa4ec156d78b1d5470061319d29403448..129228bbea01c9a7912b3a52c536339d867370ab 100644 (file)
@@ -12,6 +12,11 @@ class Test {
                int repeat = 1;
 
                var p = new OptionSet () {
+                       "Usage: greet [OPTIONS]+ message",
+                       "Greet a list of individuals with an optional message.",
+                       "If no message is specified, a generic greeting is used.",
+                       "",
+                       "Options:",
                        { "n|name=", "the {NAME} of someone to greet.",
                          v => names.Add (v) },
                        { "r|repeat=", 
@@ -36,7 +41,7 @@ class Test {
                }
 
                if (show_help) {
-                       ShowHelp (p);
+                       p.WriteOptionDescriptions (Console.Out);
                        return;
                }
 
@@ -56,16 +61,6 @@ class Test {
                }
        }
 
-       static void ShowHelp (OptionSet p)
-       {
-               Console.WriteLine ("Usage: greet [OPTIONS]+ message");
-               Console.WriteLine ("Greet a list of individuals with an optional message.");
-               Console.WriteLine ("If no message is specified, a generic greeting is used.");
-               Console.WriteLine ();
-               Console.WriteLine ("Options:");
-               p.WriteOptionDescriptions (Console.Out);
-       }
-
        static void Debug (string format, params object[] args)
        {
                if (verbosity > 0) {
index 81b205391764390f41fbfa970b04f0fda5906104..00061a953b0a4ff329a1daec7d15b4d7758f568a 100644 (file)
@@ -3,7 +3,7 @@
   <Remarks>Program option parser.</Remarks>
   <Copyright>2008 Novell, Inc.</Copyright>
   <Assemblies>
-    <Assembly Name="Mono.Options" Version="0.2.2.0">
+    <Assembly Name="Mono.Options" Version="0.2.3.0">
       <AssemblyPublicKey>[00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00 00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00 79 15 99 77 d2 d0 3a 8e 6b ea 7a 2e 74 e8 d1 af cc 93 e8 85 19 74 95 2b b4 80 a1 2c 91 34 47 4d 04 06 24 47 c3 7e 0e 68 c0 80 53 6f cf 3c 3f be 2f f9 c9 79 ce 99 84 75 e5 06 e8 ce 82 dd 5b 0f 35 0d c1 0e 93 bf 2e ee cf 87 4b 24 77 0c 50 81 db ea 74 47 fd da fa 27 7b 22 de 47 d6 ff ea 44 96 74 a4 f9 fc cf 84 d1 50 69 08 93 80 28 4d bd d3 5f 46 cd ff 12 a1 bd 78 e4 ef 00 65 d0 16 df ]</AssemblyPublicKey>
       <Attributes>
         <Attribute>
index ecba10ba176fbf12d2a016ef9e79b9c351f2ec5e..c8385271f9d09b8ffb0bbcecea838b3a83aaf940 100644 (file)
@@ -388,9 +388,17 @@ namespace Mono.Options
                                throw new ArgumentOutOfRangeException ("maxValueCount");
 
                        this.prototype   = prototype;
-                       this.names       = prototype.Split ('|');
                        this.description = description;
                        this.count       = maxValueCount;
+                       this.names       = (this is OptionSet.Category)
+                               // append GetHashCode() so that "duplicate" categories have distinct
+                               // names, e.g. adding multiple "" categories should be valid.
+                               ? new[]{prototype + this.GetHashCode ()}
+                               : prototype.Split ('|');
+
+                       if (this is OptionSet.Category)
+                               return;
+
                        this.type        = ParsePrototype ();
 
                        if (this.count == 0 && type != OptionValueType.None)
@@ -762,6 +770,31 @@ namespace Mono.Options
                        }
                }
 
+               public OptionSet Add (string header)
+               {
+                       if (header == null)
+                               throw new ArgumentNullException ("header");
+                       Add (new Category (header));
+                       return this;
+               }
+
+               internal sealed class Category : Option {
+
+                       // Prototype starts with '=' because this is an invalid prototype
+                       // (see Option.ParsePrototype(), and thus it'll prevent Category
+                       // instances from being accidentally used as normal options.
+                       public Category (string description)
+                               : base ("=:Category:= " + description, description)
+                       {
+                       }
+
+                       protected override void OnParseComplete (OptionContext c)
+                       {
+                               throw new NotSupportedException ("Category.OnParseComplete should not be invoked.");
+                       }
+               }
+
+
                public new OptionSet Add (Option option)
                {
                        base.Add (option);
@@ -1109,11 +1142,20 @@ namespace Mono.Options
                }
 
                private const int OptionWidth = 29;
+               private const int Description_FirstWidth  = 80 - OptionWidth;
+               private const int Description_RemWidth    = 80 - OptionWidth - 2;
 
                public void WriteOptionDescriptions (TextWriter o)
                {
                        foreach (Option p in this) {
                                int written = 0;
+
+                               Category c = p as Category;
+                               if (c != null) {
+                                       WriteDescription (o, p.Description, "", 80, 80);
+                                       continue;
+                               }
+
                                if (!WriteOptionPrototype (o, p, ref written))
                                        continue;
 
@@ -1124,14 +1166,8 @@ namespace Mono.Options
                                        o.Write (new string (' ', OptionWidth));
                                }
 
-                               bool indent = false;
-                               string prefix = new string (' ', OptionWidth+2);
-                               foreach (string line in GetLines (localizer (GetDescription (p.Description)))) {
-                                       if (indent) 
-                                               o.Write (prefix);
-                                       o.WriteLine (line);
-                                       indent = true;
-                               }
+                               WriteDescription (o, p.Description, new string (' ', OptionWidth+2),
+                                               Description_FirstWidth, Description_RemWidth);
                        }
 
                        foreach (ArgumentSource s in sources) {
@@ -1155,14 +1191,19 @@ namespace Mono.Options
                                        o.Write (new string (' ', OptionWidth));
                                }
 
-                               bool indent = false;
-                               string prefix = new string (' ', OptionWidth+2);
-                               foreach (string line in GetLines (localizer (GetDescription (s.Description)))) {
-                                       if (indent) 
-                                               o.Write (prefix);
-                                       o.WriteLine (line);
-                                       indent = true;
-                               }
+                               WriteDescription (o, s.Description, new string (' ', OptionWidth+2),
+                                               Description_FirstWidth, Description_RemWidth);
+                       }
+               }
+
+               void WriteDescription (TextWriter o, string value, string prefix, int firstWidth, int remWidth)
+               {
+                       bool indent = false;
+                       foreach (string line in GetLines (localizer (GetDescription (value)), firstWidth, remWidth)) {
+                               if (indent)
+                                       o.Write (prefix);
+                               o.WriteLine (line);
+                               indent = true;
                        }
                }
 
@@ -1289,11 +1330,9 @@ namespace Mono.Options
                        return sb.ToString ();
                }
 
-               private static IEnumerable<string> GetLines (string description)
+               private static IEnumerable<string> GetLines (string description, int firstWidth, int remWidth)
                {
-                       return StringCoda.WrappedLines (description, 
-                                       80 - OptionWidth, 
-                                       80 - OptionWidth - 2);
+                       return StringCoda.WrappedLines (description, firstWidth, remWidth);
                }
        }
 }
index 0d1433cdce6b3a18e5657c3c5d59df2a4791545b..b012fed03f5fc3d869d870d22ee592559fe21169 100644 (file)
@@ -356,6 +356,9 @@ namespace Tests.Mono.Options
                        Utils.AssertException (typeof(ArgumentNullException),
                                        "Argument cannot be null.\nParameter name: option",
                                        p, v => { v.Add ((Option) null); });
+                       Utils.AssertException (typeof(ArgumentNullException),
+                                       "Argument cannot be null.\nParameter name: header",
+                                       p, v => { v.Add ((string) null); });
 
                        // bad type
                        Utils.AssertException (typeof(OptionException),
@@ -382,6 +385,7 @@ namespace Tests.Mono.Options
                public void WriteOptionDescriptions ()
                {
                        var p = new OptionSet () {
+                               "\n:Category 1:",
                                { "p|indicator-style=", "append / indicator to directories",    v => {} },
                                { "color:",             "controls color info",                  v => {} },
                                { "color2:",            "set {color}",                          v => {} },
@@ -407,10 +411,14 @@ namespace Tests.Mono.Options
                                { "long-desc5",
                                        "Lots of spaces in the middle - . - . - . - . - . - . - . - and more until the end.",
                                        v => {} },
+                               "",
+                               "==This is a really long category name which will involve line wrapping, just because...==",
                                { "o|out=",
                                        "The {DIRECTORY} to place the generated files and directories.\n\n" +
                                        "If not specified, defaults to\n`dirname FILE`/cache/`basename FILE .tree`.",
                                        v => {} },
+                               "",
+                               "Category 3:",
                                { "h|?|help",           "show help text",                       v => {} },
                                { "version",            "output version information and exit",  v => {} },
                                { "<>", v => {} },
@@ -418,6 +426,8 @@ namespace Tests.Mono.Options
                        };
 
                        StringWriter expected = new StringWriter ();
+                       expected.WriteLine ("");
+                       expected.WriteLine (":Category 1:");
                        expected.WriteLine ("  -p, --indicator-style=VALUE");
                        expected.WriteLine ("                             append / indicator to directories");
                        expected.WriteLine ("      --color[=VALUE]        controls color info");
@@ -441,11 +451,16 @@ namespace Tests.Mono.Options
                        expected.WriteLine ("                               2 3 4 5 and more until the end.");
                        expected.WriteLine ("      --long-desc5           Lots of spaces in the middle - . - . - . - . - . -");
                        expected.WriteLine ("                               . - . - and more until the end.");
+                       expected.WriteLine ("");
+                       expected.WriteLine ("==This is a really long category name which will involve line wrapping, just");
+                       expected.WriteLine ("because...==");
                        expected.WriteLine ("  -o, --out=DIRECTORY        The DIRECTORY to place the generated files and");
                        expected.WriteLine ("                               directories.");
                        expected.WriteLine ("                               ");
                        expected.WriteLine ("                               If not specified, defaults to");
                        expected.WriteLine ("                               `dirname FILE`/cache/`basename FILE .tree`.");
+                       expected.WriteLine ("");
+                       expected.WriteLine ("Category 3:");
                        expected.WriteLine ("  -h, -?, --help             show help text");
                        expected.WriteLine ("      --version              output version information and exit");
                        expected.WriteLine ("  @s1, @s2                   Read Response File for More Options");