Menu

Argumenty

7.12.2016 - C#

Pokud je potřeba zpracovat argumenty nějak inteligentně, existují různé knihovny. Níže je ale kus kódu, který řeší většinu problematiky. Už nevím, kde jsem ho vyštrachal 🙂

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace Some.Namespace
{
 /// <summary>
 /// Arguments class
 /// </summary>
 public class Arguments
 {
 // Variables
 private StringDictionary Parameters;

 // Constructor
 public Arguments(string[] Args)
 {
 Parameters = new StringDictionary();
 Regex Spliter = new Regex(@"^-{1,2}|^/|=|:",
 RegexOptions.IgnoreCase | RegexOptions.Compiled);

 Regex Remover = new Regex(@"^['""]?(.*?)['""]?$",
 RegexOptions.IgnoreCase | RegexOptions.Compiled);

 string Parameter = null;
 string[] Parts;

 // Valid parameters forms:
 // {-,/,--}param{ ,=,:}((",')value(",'))
 // Examples: 
 // -param1 value1 --param2 /param3:"Test-:-work" 
 // /param4=happy -param5 '--=nice=--'
 foreach (string Txt in Args)
 {
 // Look for new parameters (-,/ or --) and a
 // possible enclosed value (=,:)
 Parts = Spliter.Split(Txt, 3);

 switch (Parts.Length)
 {
 // Found a value (for the last parameter 
 // found (space separator))
 case 1:
 if (Parameter != null)
 {
 if (!Parameters.ContainsKey(Parameter))
 {
 Parts[0] =
 Remover.Replace(Parts[0], "$1");

 Parameters.Add(Parameter, Parts[0]);
 }
 Parameter = null;
 }
 // else Error: no parameter waiting for a value (skipped)
 break;

 // Found just a parameter
 case 2:
 // The last parameter is still waiting. 
 // With no value, set it to true.
 if (Parameter != null)
 {
 if (!Parameters.ContainsKey(Parameter))
 Parameters.Add(Parameter, "true");
 }
 Parameter = Parts[1];
 break;

 // Parameter with enclosed value
 case 3:
 // The last parameter is still waiting. 
 // With no value, set it to true.
 if (Parameter != null)
 {
 if (!Parameters.ContainsKey(Parameter))
 Parameters.Add(Parameter, "true");
 }

 Parameter = Parts[1];

 // Remove possible enclosing characters (",')
 if (!Parameters.ContainsKey(Parameter))
 {
 Parts[2] = Remover.Replace(Parts[2], "$1");
 Parameters.Add(Parameter, Parts[2]);
 }

 Parameter = null;
 break;
 }
 }
 // In case a parameter is still waiting
 if (Parameter != null)
 {
 if (!Parameters.ContainsKey(Parameter))
 Parameters.Add(Parameter, "true");
 }
 }

 // Retrieve a parameter value if it exists 
 // (overriding C# indexer property)
 public string this[string Param]
 {
 get
 {
 return (Parameters[Param]);
 }
 }

 public string GetParam(string Param, string DefaultValue)
 {
 if (this[Param] != null)
 return this[Param];
 else
 return DefaultValue;
 }
 }
}

/*Příklad
 * 
 * 
 * // Command line parsing
 Arguments CommandLine=new Arguments(Args);

 // Look for specific arguments values and display 
 // them if they exist (return null if they don't)
 if(CommandLine["param1"] != null) 
 Console.WriteLine("Param1 value: " + 
 CommandLine["param1"]);
 else
 Console.WriteLine("Param1 not defined !");

 if(CommandLine["height"] != null) 
 Console.WriteLine("Height value: " + 
 CommandLine["height"]);
 else 
 Console.WriteLine("Height not defined !");

 if(CommandLine["width"] != null) 
 Console.WriteLine("Width value: " + 
 CommandLine["width"]);
 else 
 Console.WriteLine("Width not defined !");

 if(CommandLine["size"] != null) 
 Console.WriteLine("Size value: " + 
 CommandLine["size"]);
 else 
 Console.WriteLine("Size not defined !");

 if(CommandLine["debug"] != null) 
 Console.WriteLine("Debug value: " + 
 CommandLine["debug"]);
 else 
 Console.WriteLine("Debug not defined !");
 * 
 * 
 * 
 */