/// <summary>
		/// Construct a Getopt instance with given input data that is capable
		/// of parsing long options and short options.  Contrary to what you
		/// might think, the flag <paramref name="longOnly"/> does not
		/// determine whether or not we scan for only long arguments. Instead,
		/// a value of true here allows long arguments to start with a
		/// '<c>-</c>' instead of "<c>--</c>" unless there is a conflict with
		/// a short option name.
		/// </summary>
		/// <param name="progname">
		/// The name to display as the program name when printing errors
		/// </param>
		/// <param name="argv">
		/// The string array passed as the command ilne to the program.
		/// </param>
		/// <param name="optstring">
		/// A string containing a description of the valid short args for this
		/// program.
		/// </param>
		/// <param name="longOptions">
		/// An array of <see cref="LongOpt"/> objects that describes the valid
		/// long args for this program.
		/// </param>
		/// <param name="longOnly">
		/// true if long options that do not conflict with short options can
		/// start with a '<c>-</c>' as well as "<c>--</c>".
		/// </param>
		public Getopt(string progname, string[] argv, string optstring,
			LongOpt[] longOptions, bool longOnly)
		{
			if (optstring.Length == 0)
				optstring = " ";
			
			// This function is essentially _getopt_initialize from GNU getopt
			this.progname = progname;
			this.argv = argv;
			this.optstring = optstring;
			this.longOptions = longOptions;
			this.longOnly = longOnly;
			
			// Check for application setting "Gnu.PosixlyCorrect" to determine
			// whether to strictly follow the POSIX standard. This replaces the
			// "POSIXLY_CORRECT" environment variable in the C version
			try 
			{
				if((bool) new AppSettingsReader().GetValue(
					"Gnu.PosixlyCorrect", typeof(bool))) 
				{
					this.posixlyCorrect = true;
					this.cultureInfo = new CultureInfo("en-US");
				}
				else
					this.posixlyCorrect = false;
			}
			catch(Exception) 
			{
				this.posixlyCorrect = false;
			}
			
			// Determine how to handle the ordering of options and non-options
			if (optstring[0] == '-')
			{
				this.ordering = Order.ReturnInOrder;
				if (optstring.Length > 1)
					this.optstring = optstring.Substring(1);
			}
			else if (optstring[0] == '+')
			{
				this.ordering = Order.RequireOrder;
				if (optstring.Length > 1)
					this.optstring = optstring.Substring(1);
			}
			else if (this.posixlyCorrect)
			{
				this.ordering = Order.RequireOrder;
			}
			else
			{
				this.ordering = Order.Permute; // The normal default case
			}
		}
		/// <summary>
		/// Construct a Getopt instance with given input data that is capable
		/// of parsing long options as well as short.
		/// </summary>
		/// <param name="progname">
		/// The name to display as the program name when printing errors.
		/// </param>
		/// <param name="argv">
		/// The string array passed as the command ilne to the program.
		/// </param>
		/// <param name="optstring">
		/// A string containing a description of the valid short args for this
		/// program.
		/// </param>
		/// <param name="longOptions">
		/// An array of <see cref="LongOpt"/> objects that describes the valid
		/// long args for this program.
		/// </param>
		public Getopt(string progname, string[] argv, string optstring,
			LongOpt[] longOptions) : this(progname, argv, optstring,
			longOptions, false)
		{
		}