Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=xfcetesting.git;a=commitdiff;h=ebb3694254df0a2586a5dca8c575953266e3aa1e

commit ebb3694254df0a2586a5dca8c575953266e3aa1e
Author: Devil505 <devil505li...@gmail.com>
Date:   Sun Jan 2 09:37:53 2011 +0100

docky-2.0.9-1-i686
* version bump
* removing mono2.8 patch

diff --git a/source/gnome-extra/docky/FrugalBuild 
b/source/gnome-extra/docky/FrugalBuild
index a2f61fd..c30c8f4 100644
--- a/source/gnome-extra/docky/FrugalBuild
+++ b/source/gnome-extra/docky/FrugalBuild
@@ -2,7 +2,7 @@
# Maintainer: Devil505 <devil505li...@gmail.com>

pkgname=docky
-pkgver=2.0.8
+pkgver=2.0.9
pkgrel=1
pkgdesc="The Finest Dock No Money Can Buy"
url="https://launchpad.net/docky";
@@ -18,9 +18,8 @@ _F_gnome_desktop="y"
_F_mono_aot=0
Finclude mono gnome-scriptlet
up2date="Flasttar $url"
-source=($url/2.0/$pkgver/+download/$pkgname-$pkgver.tar.gz mono28.diff)
-sha1sums=('508ef4046e76289adae34f4cfd499a6d13362a39' \
-          '4b99dc96e2b75019d67266a8675aaee5b22496ae')
+source=($url/2.0/$pkgver/+download/$pkgname-$pkgver.tar.gz)
+sha1sums=('905d8f36a0f0ae52461e79becc7523349999937e')

build()
{
diff --git a/source/gnome-extra/docky/mono28.diff 
b/source/gnome-extra/docky/mono28.diff
deleted file mode 100644
index 74c886f..0000000
--- a/source/gnome-extra/docky/mono28.diff
+++ /dev/null
@@ -1,1415 +0,0 @@
-diff -u -Nr docky-2.0.7/configure.ac docky-2.0.7.build/configure.ac
---- docky-2.0.7/configure.ac   2010-08-31 23:28:08.847531997 -0700
-+++ docky-2.0.7.build/configure.ac     2010-10-19 01:54:40.136682364 -0700
-@@ -76,7 +76,6 @@
- SHAMROCK_EXPAND_BINDIR
- SHAMROCK_EXPAND_DATADIR
-
--
- PKG_CHECK_MODULES([GCONF_SHARP_20], [gconf-sharp-2.0])
- PKG_CHECK_MODULES([GLADE_SHARP_20], [glade-sharp-2.0])
- PKG_CHECK_MODULES([GLIB_SHARP_20], [glib-sharp-2.0])
-@@ -90,7 +89,6 @@
- PKG_CHECK_MODULES([MONO_ADDINS_GUI], [mono-addins-gui])
- PKG_CHECK_MODULES([MONO_ADDINS_SETUP], [mono-addins-setup])
- PKG_CHECK_MODULES([MONO_CAIRO], [mono-cairo])
--PKG_CHECK_MODULES([MONO_OPTIONS], [mono-options])
- PKG_CHECK_MODULES([NDESK_DBUS_10], [ndesk-dbus-1.0])
- PKG_CHECK_MODULES([NDESK_DBUS_GLIB_10], [ndesk-dbus-glib-1.0])
- PKG_CHECK_MODULES([NOTIFY_SHARP], [notify-sharp])
-@@ -120,7 +118,6 @@
- MONO_CAIRO_LIBS="-r:Mono.Cairo"
- AC_SUBST([MONO_CAIRO_LIBS])
-
--AC_SUBST([MONO_OPTIONS_LIBS])
- AC_SUBST([NDESK_DBUS_10_LIBS])
- AC_SUBST([NDESK_DBUS_GLIB_10_LIBS])
- AC_SUBST([NOTIFY_SHARP_LIBS])
-diff -u -Nr docky-2.0.7/Docky/AssemblyInfo.cs 
docky-2.0.7.build/Docky/AssemblyInfo.cs
---- docky-2.0.7/Docky/AssemblyInfo.cs  2010-10-02 04:01:38.090463001 -0700
-+++ docky-2.0.7.build/Docky/AssemblyInfo.cs    2010-10-19 01:55:41.430017686 
-0700
-@@ -17,7 +17,6 @@
-
- using System.Reflection;
- using System.Runtime.CompilerServices;
--using Mono.GetOptions;
-
- // Information about this assembly is defined by the following
- // attributes.
-diff -u -Nr docky-2.0.7/Docky/AssemblyInfo.cs.in 
docky-2.0.7.build/Docky/AssemblyInfo.cs.in
---- docky-2.0.7/Docky/AssemblyInfo.cs.in       2010-06-26 06:47:36.543229000 
-0700
-+++ docky-2.0.7.build/Docky/AssemblyInfo.cs.in 2010-10-19 01:54:37.573351289 
-0700
-@@ -17,7 +17,6 @@
-
- using System.Reflection;
- using System.Runtime.CompilerServices;
--using Mono.GetOptions;
-
- // Information about this assembly is defined by the following
- // attributes.
-@@ -33,13 +32,6 @@
- [assembly: AssemblyTrademark("")]
- [assembly: AssemblyCulture("")]
-
--[assembly: Mono.About ("For more information, please visit 
http://launchpad.net/docky/";)]
--[assembly: Mono.Author ("Daniel For\u0233 <daniel.p.f...@gmail.com>")]
--[assembly: Mono.Author ("Chris Szikszoy <ch...@szikszoy.com>")]
--[assembly: Mono.Author ("Robert Dyer <psyb...@gmail.com>")]
--[assembly: Mono.Author ("Jason Smith <jassm...@gmail.com>")]
--[assembly: Mono.UsageComplement ("")]
--
- // The assembly version has following format:
- //
- // Major.Minor.Build.Revision
-diff -u -Nr docky-2.0.7/Docky/Docky/Docky.cs 
docky-2.0.7.build/Docky/Docky/Docky.cs
---- docky-2.0.7/Docky/Docky/Docky.cs   2010-08-24 11:41:52.206278994 -0700
-+++ docky-2.0.7.build/Docky/Docky/Docky.cs     2010-10-19 02:05:26.020019496 
-0700
-@@ -37,7 +37,7 @@
- {
-       public static class Docky
-       {
--              public static UserArgs CommandLinePreferences { get; private 
set; }
-+              public static UserArgs UserArgs { get; private set; }
-
-               static DockController controller;
-               internal static DockController Controller {
-@@ -66,7 +66,8 @@
-                       GLib.GType.Init ();
-
-                       // process the command line args
--                      CommandLinePreferences = new UserArgs (args);
-+                      if (!UserArgs.Parse (args))
-+                              return;
-
-                       Wnck.Global.ClientType = Wnck.ClientType.Pager;
-
-diff -u -Nr docky-2.0.7/Docky/Docky/Interface/CursorTracker.cs 
docky-2.0.7.build/Docky/Docky/Interface/CursorTracker.cs
---- docky-2.0.7/Docky/Docky/Interface/CursorTracker.cs 2010-06-26 
06:47:36.543229000 -0700
-+++ docky-2.0.7.build/Docky/Docky/Interface/CursorTracker.cs   2010-10-19 
01:54:40.130014783 -0700
-@@ -113,7 +113,7 @@
-                       if (timer_speed != length) {
-                               if (timer > 0)
-                                       GLib.Source.Remove (timer);
--                              if (!Docky.CommandLinePreferences.NoPollCursor)
-+                              if (!UserArgs.NoPollCursor)
-                                       timer = GLib.Timeout.Add (length, 
OnTimerTick);
-                               timer_speed = length;
-                       }
-diff -u -Nr docky-2.0.7/Docky/Docky/Interface/DockWindow.cs 
docky-2.0.7.build/Docky/Docky/Interface/DockWindow.cs
---- docky-2.0.7/Docky/Docky/Interface/DockWindow.cs    2010-10-01 
00:00:03.733783001 -0700
-+++ docky-2.0.7.build/Docky/Docky/Interface/DockWindow.cs      2010-10-19 
02:07:49.340017589 -0700
-@@ -730,8 +730,8 @@
-                       Wnck.Screen.Default.WindowOpened += HandleWindowOpened;
-
-                       // fix for nvidia bug
--                      if (Docky.CommandLinePreferences.BufferTime > 0)
--                              GLib.Timeout.Add 
(Docky.CommandLinePreferences.BufferTime * 60 * 1000, delegate {
-+                      if (UserArgs.BufferTime > 0)
-+                              GLib.Timeout.Add (UserArgs.BufferTime * 60 * 
1000, delegate {
-                                       ResetBuffers ();
-                                       return true;
-                               });
-@@ -1498,14 +1498,14 @@
-                       UpdateMonitorGeometry ();
-
-                       if (VerticalDock) {
--                              Height = Math.Min 
(Docky.CommandLinePreferences.MaxSize, monitor_geo.Height);
-+                              Height = Math.Min (UserArgs.MaxSize, 
monitor_geo.Height);
-                               Width = DockHeightBuffer + ZoomedIconSize + 
UrgentBounceHeight;
-                       } else {
--                              Width = Math.Min 
(Docky.CommandLinePreferences.MaxSize, monitor_geo.Width);
-+                              Width = Math.Min (UserArgs.MaxSize, 
monitor_geo.Width);
-                               Height = DockHeightBuffer + ZoomedIconSize + 
UrgentBounceHeight;
-                       }
-
--                      if (Docky.CommandLinePreferences.NetbookMode) {
-+                      if (UserArgs.NetbookMode) {
-                               // Currently the intel i945 series of cards 
(used on netbooks frequently) will
-                               // for some mystical reason get terrible 
drawing performance if the window is
-                               // between 1009 pixels and 1024 pixels in width 
OR height. We just pad it out an extra
-diff -u -Nr docky-2.0.7/Docky/Docky/UserArgs.cs 
docky-2.0.7.build/Docky/Docky/UserArgs.cs
---- docky-2.0.7/Docky/Docky/UserArgs.cs        2010-06-26 06:47:36.543229000 
-0700
-+++ docky-2.0.7.build/Docky/Docky/UserArgs.cs  2010-10-19 01:54:40.136682364 
-0700
-@@ -19,57 +19,106 @@
-
- using Docky.Services;
-
--using Mono.GetOptions;
--
--// disable the warning message about Mono.GetOptions.Options being obsolete
--#pragma warning disable 618
-+using Mono.Options;
-
- namespace Docky
- {
--      public class UserArgs : Options
-+      public class UserArgs
-       {
--              [Option ("Disable cursor polling (for testing)", 'p', 
"disable-polling")]
--              public bool NoPollCursor;
--
--              [Option ("Maximum window dimension (min 500)", 'm', "max-size")]
--              public int MaxSize;
--
--              [Option ("Enable debug level logging", 'd', "debug")]
--              public bool Debug;
-+              const int FORCE_BUFFER_REFRESH = 10;
-
--              [Option ("Netbook mode", 'n', "netbook")]
--              public bool NetbookMode;
-+              /// <summary>
-+              /// Gets or sets a value indicating whether cursor polling 
should be disabled.
-+              /// </summary>
-+              /// <value>
-+              /// <c>true</c> cursor polling should be disabled; otherwise, 
<c>false</c>.
-+              /// </value>
-+              public static bool NoPollCursor { get; private set; }
-+              /// <summary>
-+              /// Gets or sets the maximum dock window size.
-+              /// </summary>
-+              /// <value>
-+              /// The max size of the dock window.
-+              /// </value>
-+              public static int MaxSize { get; private set; }
-+              /// <summary>
-+              /// Gets or sets a value indicating whether Docky should run in 
netbook mode.
-+              /// </summary>
-+              /// <value>
-+              /// <c>true</c> if netbook mode; otherwise, <c>false</c>.
-+              /// </value>
-+              public static bool NetbookMode { get; private set; }
-+              /// <summary>
-+              /// The number of minutes to keep buffers.
-+              /// </summary>
-+              /// <value>
-+              /// The buffer refresh interval.
-+              /// </value>
-+              public static uint BufferTime { get; private set; }
-
--              [Option ("Nvidia mode (for Nvidia cards that lag after awhile) 
[-b 10]", "nvidia")]
--              public bool NvidiaMode;
-+              static bool HelpShown { get; set; }
-+              static OptionSet Options { get; set; }
-
--              [Option ("Maximum time (in minutes) to keep buffers", 'b', 
"buffer-time")]
--              public uint BufferTime;
--
--              public UserArgs (string[] args)
-+              static UserArgs ()
-               {
--                      Log.DisplayLevel = LogLevel.Warn;
-+                      MaxSize = int.MaxValue;
-
--                      ParsingMode = OptionsParsingMode.GNU_DoubleDash;
--                      ProcessArgs (args);
-+                      Options = new OptionSet () {
-+                              { "p|disable-polling", "Disable cursor polling 
(for testing)", val => NoPollCursor = true },
-+                              { "m|max-size=", "Maximum window dimension (min 
500)", (int max) => MaxSize = Math.Max (max, 500) },
-+                              { "d|debug", "Enable debug logging", debug => {
-+                                              Log.DisplayLevel = (debug == 
null) ? LogLevel.Warn : LogLevel.Debug;
-+                                      } },
-+                              { "n|netbook", "Netbook mode", netbook => 
NetbookMode = true },
-+                              { "nv|nvidia", "Nvidia mode (for Nvidia cards 
that lag after a while).  Equivalent to '-b 10'.",
-+                                      nv => {
-+                                              if (BufferTime == 0)
-+                                                      BufferTime = 
FORCE_BUFFER_REFRESH;
-+                                      } },
-+                              { "b|buffer-time=", "Maximum time (in minutes) 
to keep buffers", (uint buf) => BufferTime = buf },
-+                              { "h|?|help", "Show this help list", help => 
ShowHelp () },
-+                      };
-+              }
-+
-+              /// <summary>
-+              /// Parse the specified command line args.
-+              /// </summary>
-+              /// <param name='args'>
-+              /// The arguments to parse.
-+              /// </param>
-+              /// <returns>
-+              /// <c>true</c> if help was shown, otherwise <c>false</c>.
-+              /// </returns>
-+              public static bool Parse (string[] args)
-+              {
-+                      try {
-+                              Options.Parse (args);
-+                      } catch (OptionException ex) {
-+                              Log<UserArgs>.Error ("Error parsing options: 
{0}", ex.Message);
-+                              ShowHelp ();
-+                      }
-
--                      // defaults
--                      NvidiaMode |= DockServices.System.HasNvidia;
--                      if (MaxSize == 0)
--                              MaxSize = int.MaxValue;
--                      MaxSize = Math.Max (MaxSize, 500);
--                      if (NvidiaMode && BufferTime == 0)
--                              BufferTime = 10;
--                      // if the debug option was passed, set it to debug
--                      // otherwise leave it to the default, which is warn
--                      if (Debug)
--                              Log.DisplayLevel = LogLevel.Debug;
-+                      // if the buffer time wasn't explicity set, and a 
Nvidia card is present,
-+                      // force the buffer refresh time to 10 minutes
-+                      if (DockServices.System.HasNvidia && BufferTime == 0)
-+                              BufferTime = FORCE_BUFFER_REFRESH;
-
-                       // log the parsed user args
-                       Log<UserArgs>.Debug ("BufferTime = " + BufferTime);
-                       Log<UserArgs>.Debug ("MaxSize = " + MaxSize);
-                       Log<UserArgs>.Debug ("NetbookMode = " + NetbookMode);
-                       Log<UserArgs>.Debug ("NoPollCursor = " + NoPollCursor);
-+
-+                      // if the help was shown, return false, alerting the 
main thread to exit
-+                      return !HelpShown;
-+              }
-+
-+              static void ShowHelp ()
-+              {
-+                      Console.WriteLine ("usage: docky [options]");
-+                      Console.WriteLine ();
-+                      Options.WriteOptionDescriptions (Console.Out);
-+                      HelpShown = true;
-               }
-       }
- }
-diff -u -Nr docky-2.0.7/Docky/Makefile.am docky-2.0.7.build/Docky/Makefile.am
---- docky-2.0.7/Docky/Makefile.am      2010-09-15 23:54:05.277920997 -0700
-+++ docky-2.0.7.build/Docky/Makefile.am        2010-10-19 01:55:27.843351708 
-0700
-@@ -10,6 +10,7 @@
-       gtk-gui/Docky.Interface.DockPreferences.cs \
-       gtk-gui/Docky.ConfigurationWindow.cs \
-       Gtk/Widget_Extensions.cs \
-+      Mono/Options.cs \
-       Docky/ConfigurationWindow.cs \
-       Docky/DockController.cs \
-       Docky/Docky.cs \
-@@ -65,7 +66,6 @@
-       System \
-       System.Core \
-       Mono.Posix \
--      Mono.GetOptions \
-       $(MONO_CAIRO_LIBS) \
-       $(GIO_SHARP_LIBS) \
-       $(GLIB_SHARP_20_LIBS) \
-@@ -90,4 +90,4 @@
- module_DATA += Docky.addins
- bin_SCRIPTS = docky
-
--MCS_FLAGS += -unsafe
-+MCS_FLAGS += -d:LINQ -unsafe
-diff -u -Nr docky-2.0.7/Docky/Makefile.in docky-2.0.7.build/Docky/Makefile.in
---- docky-2.0.7/Docky/Makefile.in      2010-10-02 04:01:31.670463001 -0700
-+++ docky-2.0.7.build/Docky/Makefile.in        2010-10-19 01:55:15.670019205 
-0700
-@@ -382,7 +382,6 @@
-       System \
-       System.Core \
-       Mono.Posix \
--      Mono.GetOptions \
-       $(MONO_CAIRO_LIBS) \
-       $(GIO_SHARP_LIBS) \
-       $(GLIB_SHARP_20_LIBS) \
-diff -u -Nr docky-2.0.7/Docky/Mono/Options.cs 
docky-2.0.7.build/Docky/Mono/Options.cs
---- docky-2.0.7/Docky/Mono/Options.cs  1969-12-31 16:00:00.000000000 -0800
-+++ docky-2.0.7.build/Docky/Mono/Options.cs    2010-10-19 01:54:40.136682364 
-0700
-@@ -0,0 +1,1101 @@
-+//
-+// Options.cs
-+//
-+// Authors:
-+//  Jonathan Pryor <jpr...@novell.com>
-+//
-+// Copyright (C) 2008 Novell (http://www.novell.com)
-+//
-+// Permission is hereby granted, free of charge, to any person obtaining
-+// a copy of this software and associated documentation files (the
-+// "Software"), to deal in the Software without restriction, including
-+// without limitation the rights to use, copy, modify, merge, publish,
-+// distribute, sublicense, and/or sell copies of the Software, and to
-+// permit persons to whom the Software is furnished to do so, subject to
-+// the following conditions:
-+//
-+// The above copyright notice and this permission notice shall be
-+// included in all copies or substantial portions of the Software.
-+//
-+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+//
-+
-+// Compile With:
-+//   gmcs -debug+ -r:System.Core Options.cs -o:NDesk.Options.dll
-+//   gmcs -debug+ -d:LINQ -r:System.Core Options.cs -o:NDesk.Options.dll
-+//
-+// The LINQ version just changes the implementation of
-+// OptionSet.Parse(IEnumerable<string>), and confers no semantic changes.
-+
-+//
-+// A Getopt::Long-inspired option parsing library for C#.
-+//
-+// NDesk.Options.OptionSet is built upon a key/value table, where the
-+// key is a option format string and the value is a delegate that is
-+// invoked when the format string is matched.
-+//
-+// Option format strings:
-+//  Regex-like BNF Grammar:
-+//    name: .+
-+//    type: [=:]
-+//    sep: ( [^{}]+ | '{' .+ '}' )?
-+//    aliases: ( name type sep ) ( '|' name type sep )*
-+//
-+// Each '|'-delimited name is an alias for the associated action.  If the
-+// format string ends in a '=', it has a required value.  If the format
-+// string ends in a ':', it has an optional value.  If neither '=' or ':'
-+// is present, no value is supported.  `=' or `:' need only be defined on one
-+// alias, but if they are provided on more than one they must be consistent.
-+//
-+// Each alias portion may also end with a "key/value separator", which is used
-+// to split option values if the option accepts > 1 value.  If not specified,
-+// it defaults to '=' and ':'.  If specified, it can be any character except
-+// '{' and '}' OR the *string* between '{' and '}'.  If no separator should be
-+// used (i.e. the separate values should be distinct arguments), then "{}"
-+// should be used as the separator.
-+//
-+// Options are extracted either from the current option by looking for
-+// the option name followed by an '=' or ':', or is taken from the
-+// following option IFF:
-+//  - The current option does not contain a '=' or a ':'
-+//  - The current option requires a value (i.e. not a Option type of ':')
-+//
-+// The `name' used in the option format string does NOT include any leading
-+// option indicator, such as '-', '--', or '/'.  All three of these are
-+// permitted/required on any named option.
-+//
-+// Option bundling is permitted so long as:
-+//   - '-' is used to start the option group
-+//   - all of the bundled options are a single character
-+//   - at most one of the bundled options accepts a value, and the value
-+//     provided starts from the next character to the end of the string.
-+//
-+// This allows specifying '-a -b -c' as '-abc', and specifying '-D name=value'
-+// as '-Dname=value'.
-+//
-+// Option processing is disabled by specifying "--".  All options after "--"
-+// are returned by OptionSet.Parse() unchanged and unprocessed.
-+//
-+// Unprocessed options are returned from OptionSet.Parse().
-+//
-+// Examples:
-+//  int verbose = 0;
-+//  OptionSet p = new OptionSet ()
-+//    .Add ("v", v => ++verbose)
-+//    .Add ("name=|value=", v => Console.WriteLine (v));
-+//  p.Parse (new string[]{"-v", "--v", "/v", "-name=A", "/name", "B", 
"extra"});
-+//
-+// The above would parse the argument string array, and would invoke the
-+// lambda expression three times, setting `verbose' to 3 when complete.
-+// It would also print out "A" and "B" to standard output.
-+// The returned array would contain the string "extra".
-+//
-+// C# 3.0 collection initializers are supported and encouraged:
-+//  var p = new OptionSet () {
-+//    { "h|?|help", v => ShowHelp () },
-+//  };
-+//
-+// System.ComponentModel.TypeConverter is also supported, allowing the use of
-+// custom data types in the callback type; TypeConverter.ConvertFromString()
-+// is used to convert the value option to an instance of the specified
-+// type:
-+//
-+//  var p = new OptionSet () {
-+//    { "foo=", (Foo f) => Console.WriteLine (f.ToString ()) },
-+//  };
-+//
-+// Random other tidbits:
-+//  - Boolean options (those w/o '=' or ':' in the option format string)
-+//    are explicitly enabled if they are followed with '+', and explicitly
-+//    disabled if they are followed with '-':
-+//      string a = null;
-+//      var p = new OptionSet () {
-+//        { "a", s => a = s },
-+//      };
-+//      p.Parse (new string[]{"-a"});   // sets v != null
-+//      p.Parse (new string[]{"-a+"});  // sets v != null
-+//      p.Parse (new string[]{"-a-"});  // sets v == null
-+//
-+
-+using System;
-+using System.Collections;
-+using System.Collections.Generic;
-+using System.Collections.ObjectModel;
-+using System.ComponentModel;
-+using System.Globalization;
-+using System.IO;
-+using System.Runtime.Serialization;
-+using System.Security.Permissions;
-+using System.Text;
-+using System.Text.RegularExpressions;
-+
-+#if LINQ
-+using System.Linq;
-+#endif
-+
-+#if TEST
-+using NDesk.Options;
-+#endif
-+
-+#if NDESK_OPTIONS
-+namespace NDesk.Options
-+#else
-+namespace Mono.Options
-+#endif
-+{
-+      public class OptionValueCollection : IList, IList<string> {
-+
-+              List<string> values = new List<string> ();
-+              OptionContext c;
-+
-+              internal OptionValueCollection (OptionContext c)
-+              {
-+                      this.c = c;
-+              }
-+
-+              #region ICollection
-+              void ICollection.CopyTo (Array array, int index)  {(values as 
ICollection).CopyTo (array, index);}
-+              bool ICollection.IsSynchronized                   {get {return 
(values as ICollection).IsSynchronized;}}
-+              object ICollection.SyncRoot                       {get {return 
(values as ICollection).SyncRoot;}}
-+              #endregion
-+
-+              #region ICollection<T>
-+              public void Add (string item)                       {values.Add 
(item);}
-+              public void Clear ()                                
{values.Clear ();}
-+              public bool Contains (string item)                  {return 
values.Contains (item);}
-+              public void CopyTo (string[] array, int arrayIndex) 
{values.CopyTo (array, arrayIndex);}
-+              public bool Remove (string item)                    {return 
values.Remove (item);}
-+              public int Count                                    {get 
{return values.Count;}}
-+              public bool IsReadOnly                              {get 
{return false;}}
-+              #endregion
-+
-+              #region IEnumerable
-+              IEnumerator IEnumerable.GetEnumerator () {return 
values.GetEnumerator ();}
-+              #endregion
-+
-+              #region IEnumerable<T>
-+              public IEnumerator<string> GetEnumerator () {return 
values.GetEnumerator ();}
-+              #endregion
-+
-+              #region IList
-+              int IList.Add (object value)                {return (values as 
IList).Add (value);}
-+              bool IList.Contains (object value)          {return (values as 
IList).Contains (value);}
-+              int IList.IndexOf (object value)            {return (values as 
IList).IndexOf (value);}
-+              void IList.Insert (int index, object value) {(values as 
IList).Insert (index, value);}
-+              void IList.Remove (object value)            {(values as 
IList).Remove (value);}
-+              void IList.RemoveAt (int index)             {(values as 
IList).RemoveAt (index);}
-+              bool IList.IsFixedSize                      {get {return 
false;}}
-+              object IList.this [int index]               {get {return this 
[index];} set {(values as IList)[index] = value;}}
-+              #endregion
-+
-+              #region IList<T>
-+              public int IndexOf (string item)            {return 
values.IndexOf (item);}
-+              public void Insert (int index, string item) {values.Insert 
(index, item);}
-+              public void RemoveAt (int index)            {values.RemoveAt 
(index);}
-+
-+              private void AssertValid (int index)
-+              {
-+                      if (c.Option == null)
-+                              throw new InvalidOperationException 
("OptionContext.Option is null.");
-+                      if (index >= c.Option.MaxValueCount)
-+                              throw new ArgumentOutOfRangeException ("index");
-+                      if (c.Option.OptionValueType == 
OptionValueType.Required &&
-+                                      index >= values.Count)
-+                              throw new OptionException (string.Format (
-+                                                      
c.OptionSet.MessageLocalizer ("Missing required value for option '{0}'."), 
c.OptionName),
-+                                              c.OptionName);
-+              }
-+
-+              public string this [int index] {
-+                      get {
-+                              AssertValid (index);
-+                              return index >= values.Count ? null : values 
[index];
-+                      }
-+                      set {
-+                              values [index] = value;
-+                      }
-+              }
-+              #endregion
-+
-+              public List<string> ToList ()
-+              {
-+                      return new List<string> (values);
-+              }
-+
-+              public string[] ToArray ()
-+              {
-+                      return values.ToArray ();
-+              }
-+
-+              public override string ToString ()
-+              {
-+                      return string.Join (", ", values.ToArray ());
-+              }
-+      }
-+
-+      public class OptionContext {
-+              private Option                option;
-+              private string                name;
-+              private int                   index;
-+              private OptionSet             set;
-+              private OptionValueCollection c;
-+
-+              public OptionContext (OptionSet set)
-+              {
-+                      this.set = set;
-+                      this.c   = new OptionValueCollection (this);
-+              }
-+
-+              public Option Option {
-+                      get {return option;}
-+                      set {option = value;}
-+              }
-+
-+              public string OptionName {
-+                      get {return name;}
-+                      set {name = value;}
-+              }
-+
-+              public int OptionIndex {
-+                      get {return index;}
-+                      set {index = value;}
-+              }
-+
-+              public OptionSet OptionSet {
-+                      get {return set;}
-+              }
-+
-+              public OptionValueCollection OptionValues {
-+                      get {return c;}
-+              }
-+      }
-+
-+      public enum OptionValueType {
-+              None,
-+              Optional,
-+              Required,
-+      }
-+
-+      public abstract class Option {
-+              string prototype, description;
-+              string[] names;
-+              OptionValueType type;
-+              int count;
-+              string[] separators;
-+
-+              protected Option (string prototype, string description)
-+                      : this (prototype, description, 1)
-+              {
-+              }
-+
-+              protected Option (string prototype, string description, int 
maxValueCount)
-+              {
-+                      if (prototype == null)
-+                              throw new ArgumentNullException ("prototype");
-+                      if (prototype.Length == 0)
-+                              throw new ArgumentException ("Cannot be the 
empty string.", "prototype");
-+                      if (maxValueCount < 0)
-+                              throw new ArgumentOutOfRangeException 
("maxValueCount");
-+
-+                      this.prototype   = prototype;
-+                      this.names       = prototype.Split ('|');
-+                      this.description = description;
-+                      this.count       = maxValueCount;
-+                      this.type        = ParsePrototype ();
-+
-+                      if (this.count == 0 && type != OptionValueType.None)
-+                              throw new ArgumentException (
-+                                              "Cannot provide maxValueCount 
of 0 for OptionValueType.Required or " +
-+                                                      
"OptionValueType.Optional.",
-+                                              "maxValueCount");
-+                      if (this.type == OptionValueType.None && maxValueCount 
> 1)
-+                              throw new ArgumentException (
-+                                              string.Format ("Cannot provide 
maxValueCount of {0} for OptionValueType.None.", maxValueCount),
-+                                              "maxValueCount");
-+                      if (Array.IndexOf (names, "<>") >= 0 &&
-+                                      ((names.Length == 1 && this.type != 
OptionValueType.None) ||
-+                                       (names.Length > 1 && 
this.MaxValueCount > 1)))
-+                              throw new ArgumentException (
-+                                              "The default option handler 
'<>' cannot require values.",
-+                                              "prototype");
-+              }
-+
-+              public string           Prototype       {get {return 
prototype;}}
-+              public string           Description     {get {return 
description;}}
-+              public OptionValueType  OptionValueType {get {return type;}}
-+              public int              MaxValueCount   {get {return count;}}
-+
-+              public string[] GetNames ()
-+              {
-+                      return (string[]) names.Clone ();
-+              }
-+
-+              public string[] GetValueSeparators ()
-+              {
-+                      if (separators == null)
-+                              return new string [0];
-+                      return (string[]) separators.Clone ();
-+              }
-+
-+              protected static T Parse<T> (string value, OptionContext c)
-+              {
-+                      Type tt = typeof (T);
-+                      bool nullable = tt.IsValueType && tt.IsGenericType &&
-+                              !tt.IsGenericTypeDefinition &&
-+                              tt.GetGenericTypeDefinition () == typeof 
(Nullable<>);
-+                      Type targetType = nullable ? tt.GetGenericArguments () 
[0] : typeof (T);
-+                      TypeConverter conv = TypeDescriptor.GetConverter 
(targetType);
-+                      T t = default (T);
-+                      try {
-+                              if (value != null)
-+                                      t = (T) conv.ConvertFromString (value);
-+                      }
-+                      catch (Exception e) {
-+                              throw new OptionException (
-+                                              string.Format (
-+                                                      
c.OptionSet.MessageLocalizer ("Could not convert string `{0}' to type {1} for 
option `{2}'."),
-+                                                      value, targetType.Name, 
c.OptionName),
-+                                              c.OptionName, e);
-+                      }
-+                      return t;
-+              }
-+
-+              internal string[] Names           {get {return names;}}
-+              internal string[] ValueSeparators {get {return separators;}}
-+
-+              static readonly char[] NameTerminator = new char[]{'=', ':'};
-+
-+              private OptionValueType ParsePrototype ()
-+              {
-+                      char type = '\0';
-+                      List<string> seps = new List<string> ();
-+                      for (int i = 0; i < names.Length; ++i) {
-+                              string name = names [i];
-+                              if (name.Length == 0)
-+                                      throw new ArgumentException ("Empty 
option names are not supported.", "prototype");
-+
-+                              int end = name.IndexOfAny (NameTerminator);
-+                              if (end == -1)
-+                                      continue;
-+                              names [i] = name.Substring (0, end);
-+                              if (type == '\0' || type == name [end])
-+                                      type = name [end];
-+                              else
-+                                      throw new ArgumentException (
-+                                                      string.Format 
("Conflicting option types: '{0}' vs. '{1}'.", type, name [end]),
-+                                                      "prototype");
-+                              AddSeparators (name, end, seps);
-+                      }
-+
-+                      if (type == '\0')
-+                              return OptionValueType.None;
-+
-+                      if (count <= 1 && seps.Count != 0)
-+                              throw new ArgumentException (
-+                                              string.Format ("Cannot provide 
key/value separators for Options taking {0} value(s).", count),
-+                                              "prototype");
-+                      if (count > 1) {
-+                              if (seps.Count == 0)
-+                                      this.separators = new string[]{":", 
"="};
-+                              else if (seps.Count == 1 && seps [0].Length == 
0)
-+                                      this.separators = null;
-+                              else
-+                                      this.separators = seps.ToArray ();
-+                      }
-+
-+                      return type == '=' ? OptionValueType.Required : 
OptionValueType.Optional;
-+              }
-+
-+              private static void AddSeparators (string name, int end, 
ICollection<string> seps)
-+              {
-+                      int start = -1;
-+                      for (int i = end+1; i < name.Length; ++i) {
-+                              switch (name [i]) {
-+                                      case '{':
-+                                              if (start != -1)
-+                                                      throw new 
ArgumentException (
-+                                                                      
string.Format ("Ill-formed name/value separator found in \"{0}\".", name),
-+                                                                      
"prototype");
-+                                              start = i+1;
-+                                              break;
-+                                      case '}':
-+                                              if (start == -1)
-+                                                      throw new 
ArgumentException (
-+                                                                      
string.Format ("Ill-formed name/value separator found in \"{0}\".", name),
-+                                                                      
"prototype");
-+                                              seps.Add (name.Substring 
(start, i-start));
-+                                              start = -1;
-+                                              break;
-+                                      default:
-+                                              if (start == -1)
-+                                                      seps.Add (name 
[i].ToString ());
-+                                              break;
-+                              }
-+                      }
-+                      if (start != -1)
-+                              throw new ArgumentException (
-+                                              string.Format ("Ill-formed 
name/value separator found in \"{0}\".", name),
-+                                              "prototype");
-+              }
-+
-+              public void Invoke (OptionContext c)
-+              {
-+                      OnParseComplete (c);
-+                      c.OptionName  = null;
-+                      c.Option      = null;
-+                      c.OptionValues.Clear ();
-+              }
-+
-+              protected abstract void OnParseComplete (OptionContext c);
-+
-+              public override string ToString ()
-+              {
-+                      return Prototype;
-+              }
-+      }
-+
-+      [Serializable]
-+      public class OptionException : Exception {
-+              private string option;
-+
-+              public OptionException ()
-+              {
-+              }
-+
-+              public OptionException (string message, string optionName)
-+                      : base (message)
-+              {
-+                      this.option = optionName;
-+              }
-+
-+              public OptionException (string message, string optionName, 
Exception innerException)
-+                      : base (message, innerException)
-+              {
-+                      this.option = optionName;
-+              }
-+
-+              protected OptionException (SerializationInfo info, 
StreamingContext context)
-+                      : base (info, context)
-+              {
-+                      this.option = info.GetString ("OptionName");
-+              }
-+
-+              public string OptionName {
-+                      get {return this.option;}
-+              }
-+
-+              [SecurityPermission (SecurityAction.LinkDemand, 
SerializationFormatter = true)]
-+              public override void GetObjectData (SerializationInfo info, 
StreamingContext context)
-+              {
-+                      base.GetObjectData (info, context);
-+                      info.AddValue ("OptionName", option);
-+              }
-+      }
-+
-+      public delegate void OptionAction<TKey, TValue> (TKey key, TValue 
value);
-+
-+      public class OptionSet : KeyedCollection<string, Option>
-+      {
-+              public OptionSet ()
-+                      : this (delegate (string f) {return f;})
-+              {
-+              }
-+
-+              public OptionSet (Converter<string, string> localizer)
-+              {
-+                      this.localizer = localizer;
-+              }
-+
-+              Converter<string, string> localizer;
-+
-+              public Converter<string, string> MessageLocalizer {
-+                      get {return localizer;}
-+              }
-+
-+              protected override string GetKeyForItem (Option item)
-+              {
-+                      if (item == null)
-+                              throw new ArgumentNullException ("option");
-+                      if (item.Names != null && item.Names.Length > 0)
-+                              return item.Names [0];
-+                      // This should never happen, as it's invalid for Option 
to be
-+                      // constructed w/o any names.
-+                      throw new InvalidOperationException ("Option has no 
names!");
-+              }
-+
-+              [Obsolete ("Use KeyedCollection.this[string]")]
-+              protected Option GetOptionForName (string option)
-+              {
-+                      if (option == null)
-+                              throw new ArgumentNullException ("option");
-+                      try {
-+                              return base [option];
-+                      }
-+                      catch (KeyNotFoundException) {
-+                              return null;
-+                      }
-+              }
-+
-+              protected override void InsertItem (int index, Option item)
-+              {
-+                      base.InsertItem (index, item);
-+                      AddImpl (item);
-+              }
-+
-+              protected override void RemoveItem (int index)
-+              {
-+                      base.RemoveItem (index);
-+                      Option p = Items [index];
-+                      // KeyedCollection.RemoveItem() handles the 0th item
-+                      for (int i = 1; i < p.Names.Length; ++i) {
-+                              Dictionary.Remove (p.Names [i]);
-+                      }
-+              }
-+
-+              protected override void SetItem (int index, Option item)
-+              {
-+                      base.SetItem (index, item);
-+                      RemoveItem (index);
-+                      AddImpl (item);
-+              }
-+
-+              private void AddImpl (Option option)
-+              {
-+                      if (option == null)
-+                              throw new ArgumentNullException ("option");
-+                      List<string> added = new List<string> 
(option.Names.Length);
-+                      try {
-+                              // KeyedCollection.InsertItem/SetItem handle 
the 0th name.
-+                              for (int i = 1; i < option.Names.Length; ++i) {
-+                                      Dictionary.Add (option.Names [i], 
option);
-+                                      added.Add (option.Names [i]);
-+                              }
-+                      }
-+                      catch (Exception) {
-+                              foreach (string name in added)
-+                                      Dictionary.Remove (name);
-+                              throw;
-+                      }
-+              }
-+
-+              public new OptionSet Add (Option option)
-+              {
-+                      base.Add (option);
-+                      return this;
-+              }
-+
-+              sealed class ActionOption : Option {
-+                      Action<OptionValueCollection> action;
-+
-+                      public ActionOption (string prototype, string 
description, int count, Action<OptionValueCollection> action)
-+                              : base (prototype, description, count)
-+                      {
-+                              if (action == null)
-+                                      throw new ArgumentNullException 
("action");
-+                              this.action = action;
-+                      }
-+
-+                      protected override void OnParseComplete (OptionContext 
c)
-+                      {
-+                              action (c.OptionValues);
-+                      }
-+              }
-+
-+              public OptionSet Add (string prototype, Action<string> action)
-+              {
-+                      return Add (prototype, null, action);
-+              }
-+
-+              public OptionSet Add (string prototype, string description, 
Action<string> action)
-+              {
-+                      if (action == null)
-+                              throw new ArgumentNullException ("action");
-+                      Option p = new ActionOption (prototype, description, 1,
-+                                      delegate (OptionValueCollection v) { 
action (v [0]); });
-+                      base.Add (p);
-+                      return this;
-+              }
-+
-+              public OptionSet Add (string prototype, OptionAction<string, 
string> action)
-+              {
-+                      return Add (prototype, null, action);
-+              }
-+
-+              public OptionSet Add (string prototype, string description, 
OptionAction<string, string> action)
-+              {
-+                      if (action == null)
-+                              throw new ArgumentNullException ("action");
-+                      Option p = new ActionOption (prototype, description, 2,
-+                                      delegate (OptionValueCollection v) 
{action (v [0], v [1]);});
-+                      base.Add (p);
-+                      return this;
-+              }
-+
-+              sealed class ActionOption<T> : Option {
-+                      Action<T> action;
-+
-+                      public ActionOption (string prototype, string 
description, Action<T> action)
-+                              : base (prototype, description, 1)
-+                      {
-+                              if (action == null)
-+                                      throw new ArgumentNullException 
("action");
-+                              this.action = action;
-+                      }
-+
-+                      protected override void OnParseComplete (OptionContext 
c)
-+                      {
-+                              action (Parse<T> (c.OptionValues [0], c));
-+                      }
-+              }
-+
-+              sealed class ActionOption<TKey, TValue> : Option {
-+                      OptionAction<TKey, TValue> action;
-+
-+                      public ActionOption (string prototype, string 
description, OptionAction<TKey, TValue> action)
-+                              : base (prototype, description, 2)
-+                      {
-+                              if (action == null)
-+                                      throw new ArgumentNullException 
("action");
-+                              this.action = action;
-+                      }
-+
-+                      protected override void OnParseComplete (OptionContext 
c)
-+                      {
-+                              action (
-+                                              Parse<TKey> (c.OptionValues 
[0], c),
-+                                              Parse<TValue> (c.OptionValues 
[1], c));
-+                      }
-+              }
-+
-+              public OptionSet Add<T> (string prototype, Action<T> action)
-+              {
-+                      return Add (prototype, null, action);
-+              }
-+
-+              public OptionSet Add<T> (string prototype, string description, 
Action<T> action)
-+              {
-+                      return Add (new ActionOption<T> (prototype, 
description, action));
-+              }
-+
-+              public OptionSet Add<TKey, TValue> (string prototype, 
OptionAction<TKey, TValue> action)
-+              {
-+                      return Add (prototype, null, action);
-+              }
-+
-+              public OptionSet Add<TKey, TValue> (string prototype, string 
description, OptionAction<TKey, TValue> action)
-+              {
-+                      return Add (new ActionOption<TKey, TValue> (prototype, 
description, action));
-+              }
-+
-+              protected virtual OptionContext CreateOptionContext ()
-+              {
-+                      return new OptionContext (this);
-+              }
-+
-+#if LINQ
-+              public List<string> Parse (IEnumerable<string> arguments)
-+              {
-+                      bool process = true;
-+                      OptionContext c = CreateOptionContext ();
-+                      c.OptionIndex = -1;
-+                      var def = GetOptionForName ("<>");
-+                      var unprocessed =
-+                              from argument in arguments
-+                              where ++c.OptionIndex >= 0 && (process || def 
!= null)
-+                                      ? process
-+                                              ? argument == "--"
-+                                                      ? (process = false)
-+                                                      : !Parse (argument, c)
-+                                                              ? def != null
-+                                                                      ? 
Unprocessed (null, def, c, argument)
-+                                                                      : true
-+                                                              : false
-+                                              : def != null
-+                                                      ? Unprocessed (null, 
def, c, argument)
-+                                                      : true
-+                                      : true
-+                              select argument;
-+                      List<string> r = unprocessed.ToList ();
-+                      if (c.Option != null)
-+                              c.Option.Invoke (c);
-+                      return r;
-+              }
-+#else
-+              public List<string> Parse (IEnumerable<string> arguments)
-+              {
-+                      OptionContext c = CreateOptionContext ();
-+                      c.OptionIndex = -1;
-+                      bool process = true;
-+                      List<string> unprocessed = new List<string> ();
-+                      Option def = Contains ("<>") ? this ["<>"] : null;
-+                      foreach (string argument in arguments) {
-+                              ++c.OptionIndex;
-+                              if (argument == "--") {
-+                                      process = false;
-+                                      continue;
-+                              }
-+                              if (!process) {
-+                                      Unprocessed (unprocessed, def, c, 
argument);
-+                                      continue;
-+                              }
-+                              if (!Parse (argument, c))
-+                                      Unprocessed (unprocessed, def, c, 
argument);
-+                      }
-+                      if (c.Option != null)
-+                              c.Option.Invoke (c);
-+                      return unprocessed;
-+              }
-+#endif
-+
-+              private static bool Unprocessed (ICollection<string> extra, 
Option def, OptionContext c, string argument)
-+              {
-+                      if (def == null) {
-+                              extra.Add (argument);
-+                              return false;
-+                      }
-+                      c.OptionValues.Add (argument);
-+                      c.Option = def;
-+                      c.Option.Invoke (c);
-+                      return false;
-+              }
-+
-+              private readonly Regex ValueOption = new Regex (
-+                      
@"^(?<flag>--|-|/)(?<name>[^:=]+)((?<sep>[:=])(?<value>.*))?$");
-+
-+              protected bool GetOptionParts (string argument, out string 
flag, out string name, out string sep, out string value)
-+              {
-+                      if (argument == null)
-+                              throw new ArgumentNullException ("argument");
-+
-+                      flag = name = sep = value = null;
-+                      Match m = ValueOption.Match (argument);
-+                      if (!m.Success) {
-+                              return false;
-+                      }
-+                      flag  = m.Groups ["flag"].Value;
-+                      name  = m.Groups ["name"].Value;
-+                      if (m.Groups ["sep"].Success && m.Groups 
["value"].Success) {
-+                              sep   = m.Groups ["sep"].Value;
-+                              value = m.Groups ["value"].Value;
-+                      }
-+                      return true;
-+              }
-+
-+              protected virtual bool Parse (string argument, OptionContext c)
-+              {
-+                      if (c.Option != null) {
-+                              ParseValue (argument, c);
-+                              return true;
-+                      }
-+
-+                      string f, n, s, v;
-+                      if (!GetOptionParts (argument, out f, out n, out s, out 
v))
-+                              return false;
-+
-+                      Option p;
-+                      if (Contains (n)) {
-+                              p = this [n];
-+                              c.OptionName = f + n;
-+                              c.Option     = p;
-+                              switch (p.OptionValueType) {
-+                                      case OptionValueType.None:
-+                                              c.OptionValues.Add (n);
-+                                              c.Option.Invoke (c);
-+                                              break;
-+                                      case OptionValueType.Optional:
-+                                      case OptionValueType.Required:
-+                                              ParseValue (v, c);
-+                                              break;
-+                              }
-+                              return true;
-+                      }
-+                      // no match; is it a bool option?
-+                      if (ParseBool (argument, n, c))
-+                              return true;
-+                      // is it a bundled option?
-+                      if (ParseBundledValue (f, string.Concat (n + s + v), c))
-+                              return true;
-+
-+                      return false;
-+              }
-+
-+              private void ParseValue (string option, OptionContext c)
-+              {
-+                      if (option != null)
-+                              foreach (string o in c.Option.ValueSeparators 
!= null
-+                                              ? option.Split 
(c.Option.ValueSeparators, StringSplitOptions.None)
-+                                              : new string[]{option}) {
-+                                      c.OptionValues.Add (o);
-+                              }
-+                      if (c.OptionValues.Count == c.Option.MaxValueCount ||
-+                                      c.Option.OptionValueType == 
OptionValueType.Optional)
-+                              c.Option.Invoke (c);
-+                      else if (c.OptionValues.Count > c.Option.MaxValueCount) 
{
-+                              throw new OptionException (localizer 
(string.Format (
-+                                                              "Error: Found 
{0} option values when expecting {1}.",
-+                                                              
c.OptionValues.Count, c.Option.MaxValueCount)),
-+                                              c.OptionName);
-+                      }
-+              }
-+
-+              private bool ParseBool (string option, string n, OptionContext 
c)
-+              {
-+                      Option p;
-+                      string rn;
-+                      if (n.Length >= 1 && (n [n.Length-1] == '+' || n 
[n.Length-1] == '-') &&
-+                                      Contains ((rn = n.Substring (0, 
n.Length-1)))) {
-+                              p = this [rn];
-+                              string v = n [n.Length-1] == '+' ? option : 
null;
-+                              c.OptionName  = option;
-+                              c.Option      = p;
-+                              c.OptionValues.Add (v);
-+                              p.Invoke (c);
-+                              return true;
-+                      }
-+                      return false;
-+              }
-+
-+              private bool ParseBundledValue (string f, string n, 
OptionContext c)
-+              {
-+                      if (f != "-")
-+                              return false;
-+                      for (int i = 0; i < n.Length; ++i) {
-+                              Option p;
-+                              string opt = f + n [i].ToString ();
-+                              string rn = n [i].ToString ();
-+                              if (!Contains (rn)) {
-+                                      if (i == 0)
-+                                              return false;
-+                                      throw new OptionException 
(string.Format (localizer (
-+                                                                      "Cannot 
bundle unregistered option '{0}'."), opt), opt);
-+                              }
-+                              p = this [rn];
-+                              switch (p.OptionValueType) {
-+                                      case OptionValueType.None:
-+                                              Invoke (c, opt, n, p);
-+                                              break;
-+                                      case OptionValueType.Optional:
-+                                      case OptionValueType.Required: {
-+                                              string v     = n.Substring 
(i+1);
-+                                              c.Option     = p;
-+                                              c.OptionName = opt;
-+                                              ParseValue (v.Length != 0 ? v : 
null, c);
-+                                              return true;
-+                                      }
-+                                      default:
-+                                              throw new 
InvalidOperationException ("Unknown OptionValueType: " + p.OptionValueType);
-+                              }
-+                      }
-+                      return true;
-+              }
-+
-+              private static void Invoke (OptionContext c, string name, 
string value, Option option)
-+              {
-+                      c.OptionName  = name;
-+                      c.Option      = option;
-+                      c.OptionValues.Add (value);
-+                      option.Invoke (c);
-+              }
-+
-+              private const int OptionWidth = 29;
-+
-+              public void WriteOptionDescriptions (TextWriter o)
-+              {
-+                      foreach (Option p in this) {
-+                              int written = 0;
-+                              if (!WriteOptionPrototype (o, p, ref written))
-+                                      continue;
-+
-+                              if (written < OptionWidth)
-+                                      o.Write (new string (' ', OptionWidth - 
written));
-+                              else {
-+                                      o.WriteLine ();
-+                                      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;
-+                              }
-+                      }
-+              }
-+
-+              bool WriteOptionPrototype (TextWriter o, Option p, ref int 
written)
-+              {
-+                      string[] names = p.Names;
-+
-+                      int i = GetNextOptionIndex (names, 0);
-+                      if (i == names.Length)
-+                              return false;
-+
-+                      if (names [i].Length == 1) {
-+                              Write (o, ref written, "  -");
-+                              Write (o, ref written, names [0]);
-+                      }
-+                      else {
-+                              Write (o, ref written, "      --");
-+                              Write (o, ref written, names [0]);
-+                      }
-+
-+                      for ( i = GetNextOptionIndex (names, i+1);
-+                                      i < names.Length; i = 
GetNextOptionIndex (names, i+1)) {
-+                              Write (o, ref written, ", ");
-+                              Write (o, ref written, names [i].Length == 1 ? 
"-" : "--");
-+                              Write (o, ref written, names [i]);
-+                      }
-+
-+                      if (p.OptionValueType == OptionValueType.Optional ||
-+                                      p.OptionValueType == 
OptionValueType.Required) {
-+                              if (p.OptionValueType == 
OptionValueType.Optional) {
-+                                      Write (o, ref written, localizer ("["));
-+                              }
-+                              Write (o, ref written, localizer ("=" + 
GetArgumentName (0, p.MaxValueCount, p.Description)));
-+                              string sep = p.ValueSeparators != null && 
p.ValueSeparators.Length > 0
-+                                      ? p.ValueSeparators [0]
-+                                      : " ";
-+                              for (int c = 1; c < p.MaxValueCount; ++c) {
-+                                      Write (o, ref written, localizer (sep + 
GetArgumentName (c, p.MaxValueCount, p.Description)));
-+                              }
-+                              if (p.OptionValueType == 
OptionValueType.Optional) {
-+                                      Write (o, ref written, localizer ("]"));
-+                              }
-+                      }
-+                      return true;
-+              }
-+
-+              static int GetNextOptionIndex (string[] names, int i)
-+              {
-+                      while (i < names.Length && names [i] == "<>") {
-+                              ++i;
-+                      }
-+                      return i;
-+              }
-+
-+              static void Write (TextWriter o, ref int n, string s)
-+              {
-+                      n += s.Length;
-+                      o.Write (s);
-+              }
-+
-+              private static string GetArgumentName (int index, int maxIndex, 
string description)
-+              {
-+                      if (description == null)
-+                              return maxIndex == 1 ? "VALUE" : "VALUE" + 
(index + 1);
-+                      string[] nameStart;
-+                      if (maxIndex == 1)
-+                              nameStart = new string[]{"{0:", "{"};
-+                      else
-+                              nameStart = new string[]{"{" + index + ":"};
-+                      for (int i = 0; i < nameStart.Length; ++i) {
-+                              int start, j = 0;
-+                              do {
-+                                      start = description.IndexOf (nameStart 
[i], j);
-+                              } while (start >= 0 && j != 0 ? description 
[j++ - 1] == '{' : false);
-+                              if (start == -1)
-+                                      continue;
-+                              int end = description.IndexOf ("}", start);
-+                              if (end == -1)
-+                                      continue;
-+                              return description.Substring (start + nameStart 
[i].Length, end - start - nameStart [i].Length);
-+                      }
-+                      return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
-+              }
-+
-+              private static string GetDescription (string description)
-+              {
-+                      if (description == null)
-+                              return string.Empty;
-+                      StringBuilder sb = new StringBuilder 
(description.Length);
-+                      int start = -1;
-+                      for (int i = 0; i < description.Length; ++i) {
-+                              switch (description [i]) {
-+                                      case '{':
-+                                              if (i == start) {
-+                                                      sb.Append ('{');
-+                                                      start = -1;
-+                                              }
-+                                              else if (start < 0)
-+                                                      start = i + 1;
-+                                              break;
-+                                      case '}':
-+                                              if (start < 0) {
-+                                                      if ((i+1) == 
description.Length || description [i+1] != '}')
-+                                                              throw new 
InvalidOperationException ("Invalid option description: " + description);
-+                                                      ++i;
-+                                                      sb.Append ("}");
-+                                              }
-+                                              else {
-+                                                      sb.Append 
(description.Substring (start, i - start));
-+                                                      start = -1;
-+                                              }
-+                                              break;
-+                                      case ':':
-+                                              if (start < 0)
-+                                                      goto default;
-+                                              start = i + 1;
-+                                              break;
-+                                      default:
-+                                              if (start < 0)
-+                                                      sb.Append (description 
[i]);
-+                                              break;
-+                              }
-+                      }
-+                      return sb.ToString ();
-+              }
-+
-+              private static IEnumerable<string> GetLines (string description)
-+              {
-+                      if (string.IsNullOrEmpty (description)) {
-+                              yield return string.Empty;
-+                              yield break;
-+                      }
-+                      int length = 80 - OptionWidth - 1;
-+                      int start = 0, end;
-+                      do {
-+                              end = GetLineEnd (start, length, description);
-+                              char c = description [end-1];
-+                              if (char.IsWhiteSpace (c))
-+                                      --end;
-+                              bool writeContinuation = end != 
description.Length && !IsEolChar (c);
-+                              string line = description.Substring (start, end 
- start) +
-+                                              (writeContinuation ? "-" : "");
-+                              yield return line;
-+                              start = end;
-+                              if (char.IsWhiteSpace (c))
-+                                      ++start;
-+                              length = 80 - OptionWidth - 2 - 1;
-+                      } while (end < description.Length);
-+              }
-+
-+              private static bool IsEolChar (char c)
-+              {
-+                      return !char.IsLetterOrDigit (c);
-+              }
-+
-+              private static int GetLineEnd (int start, int length, string 
description)
-+              {
-+                      int end = System.Math.Min (start + length, 
description.Length);
-+                      int sep = -1;
-+                      for (int i = start+1; i < end; ++i) {
-+                              if (description [i] == '\n')
-+                                      return i+1;
-+                              if (IsEolChar (description [i]))
-+                                      sep = i+1;
-+                      }
-+                      if (sep == -1 || end == description.Length)
-+                              return end;
-+                      return sep;
-+              }
-+      }
-+}
-+
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to