Author: rafael
Date: 2005-02-28 13:13:26 -0500 (Mon, 28 Feb 2005)
New Revision: 41291
Modified:
trunk/mcs/class/Mono.GetOptions/Assembly/AssemblyInfo.cs
trunk/mcs/class/Mono.GetOptions/ChangeLog
trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionAttribute.cs
trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionDetails.cs
trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionList.cs
trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/Options.cs
Log:
2005-02-28 Rafael Teixeira <[EMAIL PROTECTED]>
* Mono.GetOptions/OptionAttribute.cs, Mono.GetOptions/OptionDetails.cs,
Mono.GetOptions/OptionList:
Implemented support for vbc style booleans: /debug+ /debug- .
Usage: [Option("debug", VBCStyleBoolean = true)]
Implemented support for second level help screen. Usage:
[Option("advanced stuff", SecondLevelHelp = true)]
Better alignment for descriptions, specially multiline
ArgumentProcessor-marked method now is called while processing
options to allow positional processing
Modified: trunk/mcs/class/Mono.GetOptions/Assembly/AssemblyInfo.cs
===================================================================
--- trunk/mcs/class/Mono.GetOptions/Assembly/AssemblyInfo.cs 2005-02-28
18:11:24 UTC (rev 41290)
+++ trunk/mcs/class/Mono.GetOptions/Assembly/AssemblyInfo.cs 2005-02-28
18:13:26 UTC (rev 41291)
@@ -33,7 +33,7 @@
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Mono")]
-[assembly: AssemblyCopyright("(C)2002,2003,2004 Rafael Teixeira")]
+[assembly: AssemblyCopyright("(C)2002,2003,2004,2005 Rafael Teixeira")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: CLSCompliant(true)]
Modified: trunk/mcs/class/Mono.GetOptions/ChangeLog
===================================================================
--- trunk/mcs/class/Mono.GetOptions/ChangeLog 2005-02-28 18:11:24 UTC (rev
41290)
+++ trunk/mcs/class/Mono.GetOptions/ChangeLog 2005-02-28 18:13:26 UTC (rev
41291)
@@ -1,3 +1,10 @@
+2005-02-28 Rafael Teixeira <[EMAIL PROTECTED]>
+ * Mono.GetOptions/OptionAttribute.cs, Mono.GetOptions/OptionDetails.cs,
Mono.GetOptions/OptionList:
+ Implemented support for vbc style booleans: /debug+ /debug- .
Usage: [Option("debug", VBCStyleBoolean = true)]
+ Implemented support for second level help screen. Usage:
[Option("advanced stuff", SecondLevelHelp = true)]
+ Better alignment for descriptions, specially multiline
+ ArgumentProcessor-marked method now is called while processing
options to allow positional processing
+
2005-02-03 Manjula GHM <[EMAIL PROTECTED]>
* Mono.GetOptions.csproj modifed to reflect new changes
Modified: trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionAttribute.cs
===================================================================
--- trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionAttribute.cs
2005-02-28 18:11:24 UTC (rev 41290)
+++ trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionAttribute.cs
2005-02-28 18:13:26 UTC (rev 41291)
@@ -39,6 +39,9 @@
public string LongForm;
public string AlternateForm;
public int MaxOccurs; // negative means there is no limit
+
+ public bool VBCStyleBoolean;
+ public bool SecondLevelHelp;
private void SetValues(
string shortDescription,
Modified: trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionDetails.cs
===================================================================
--- trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionDetails.cs
2005-02-28 18:11:24 UTC (rev 41290)
+++ trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionDetails.cs
2005-02-28 18:13:26 UTC (rev 41291)
@@ -62,6 +62,8 @@
public ArrayList Values;
public System.Type ParameterType;
public string paramName = null;
+ public bool VBCStyleBoolean;
+ public bool SecondLevelHelp;
private string ExtractParamName(string shortDescription)
{
@@ -116,37 +118,37 @@
}
}
+ private string optionHelp = null;
+
public override string ToString()
{
- string optionHelp;
- // TODO: Yet not that good
- string shortPrefix;
- string longPrefix;
- bool hasLongForm = (this.LongForm != null &&
this.LongForm != string.Empty);
- if(this.OptionBundle.ParsingMode ==
OptionsParsingMode.Windows)
+ if (optionHelp == null)
{
- shortPrefix = "/";
- longPrefix = "/";
- }
- else
- {
- shortPrefix = "-";
- longPrefix = linuxLongPrefix;
+ string shortPrefix;
+ string longPrefix;
+ bool hasLongForm = (this.LongForm != null &&
this.LongForm != string.Empty);
+ if (this.OptionBundle.ParsingMode ==
OptionsParsingMode.Windows) {
+ shortPrefix = "/";
+ longPrefix = "/";
+ } else {
+ shortPrefix = "-";
+ longPrefix = linuxLongPrefix;
+ }
+ optionHelp = " ";
+ optionHelp += (this.ShortForm != string.Empty)
? shortPrefix+this.ShortForm+" " : " ";
+ optionHelp += hasLongForm ?
longPrefix+this.LongForm : "";
+ if (NeedsParameter) {
+ if (hasLongForm)
+ optionHelp += ":";
+ optionHelp += ParamName;
+ } else if (BooleanOption && VBCStyleBoolean) {
+ optionHelp += "[+|-]";
+ }
+ optionHelp += "\t" + this.ShortDescription;
+ if (this.AlternateForm != string.Empty &&
this.AlternateForm != null)
+ optionHelp += " [short form: "+
shortPrefix + this.AlternateForm + "]";
}
- optionHelp = " ";
- optionHelp += (this.ShortForm != string.Empty) ?
shortPrefix+this.ShortForm+" " : " ";
- optionHelp += hasLongForm ? longPrefix+this.LongForm :
"";
- if (NeedsParameter)
- {
- if (hasLongForm)
- optionHelp += ":";
- optionHelp += ParamName;
- }
- optionHelp = optionHelp.PadRight(32) + " ";
- optionHelp += this.ShortDescription;
- if (this.AlternateForm != string.Empty &&
this.AlternateForm != null)
- optionHelp += " [/"+this.AlternateForm + "]";
- return optionHelp;
+ return optionHelp;
}
private static System.Type TypeOfMember(MemberInfo memberInfo)
@@ -188,6 +190,9 @@
this.NeedsParameter = false;
this.Values = null;
this.MaxOccurs = 1;
+ this.VBCStyleBoolean = option.VBCStyleBoolean;
+ this.SecondLevelHelp = option.SecondLevelHelp;
+
this.ParameterType = TypeOfMember(memberInfo);
if (this.ParameterType != null)
@@ -234,7 +239,9 @@
internal string Key
{
- get { return this.ShortForm + this.LongForm; }
+ get {
+ return this.LongForm + " " + this.ShortForm;
+ }
}
int IComparable.CompareTo(object other)
@@ -352,7 +359,9 @@
{
if (arg != null && arg != string.Empty)
{
- arg = arg.TrimStart('-', '/');
+ arg = arg.TrimStart('-', '/');
+ if (VBCStyleBoolean)
+ arg = arg.TrimEnd('-', '+');
return (arg == ShortForm || arg == LongForm ||
arg == AlternateForm);
}
return false;
@@ -364,7 +373,10 @@
{
if (!NeedsParameter)
{
- DoIt(true); // in preparation for
vbc-like booleans
+ if (VBCStyleBoolean &&
arg.EndsWith("-"))
+ DoIt(false);
+ else
+ DoIt(true);
return
OptionProcessingResult.OptionAlone;
}
else
Modified: trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionList.cs
===================================================================
--- trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionList.cs
2005-02-28 18:11:24 UTC (rev 41290)
+++ trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/OptionList.cs
2005-02-28 18:13:26 UTC (rev 41291)
@@ -61,6 +61,8 @@
private ArrayList arguments = new ArrayList();
private ArrayList argumentsTail = new ArrayList();
private MethodInfo argumentProcessor = null;
+
+ private bool HasSecondLevelHelp = false;
internal bool MaybeAnOption(string arg)
{
@@ -178,10 +180,11 @@
foreach(MemberInfo mi in
optionBundle.GetType().GetMembers())
{
object[] attribs =
mi.GetCustomAttributes(typeof(OptionAttribute), true);
- if (attribs != null && attribs.Length > 0)
- list.Add(new OptionDetails(mi,
(OptionAttribute)attribs[0], optionBundle));
- else
- {
+ if (attribs != null && attribs.Length > 0) {
+ OptionDetails option = new
OptionDetails(mi, (OptionAttribute)attribs[0], optionBundle);
+ list.Add(option);
+ HasSecondLevelHelp = HasSecondLevelHelp
|| option.SecondLevelHelp;
+ } else {
attribs =
mi.GetCustomAttributes(typeof(ArgumentProcessorAttribute), true);
if (attribs != null && attribs.Length >
0)
AddArgumentProcessor(mi);
@@ -198,9 +201,18 @@
#region Prebuilt Options
+ private bool bannerAlreadyShown = false;
+
+ public void ShowBanner()
+ {
+ if (!bannerAlreadyShown)
+ Console.WriteLine(appTitle + " " + appVersion
+ " - " + appCopyright);
+ bannerAlreadyShown = true;
+ }
+
private void ShowTitleLines()
{
- Console.WriteLine(appTitle + " " + appVersion + " - "
+ appCopyright);
+ ShowBanner();
Console.WriteLine(appDescription);
Console.WriteLine();
}
@@ -222,13 +234,36 @@
Console.WriteLine(sb.ToString());
}
- private void ShowHelp()
+ private void ShowHelp(bool showSecondLevelHelp)
{
ShowTitleLines();
Console.WriteLine(Usage);
Console.WriteLine("Options:");
+ ArrayList lines = new ArrayList(list.Count);
+ int tabSize = 0;
foreach (OptionDetails option in list)
- Console.WriteLine(option);
+ if (option.SecondLevelHelp ==
showSecondLevelHelp) {
+ string[] optionLines =
option.ToString().Split('\n');
+ foreach(string line in optionLines) {
+ int pos = line.IndexOf('\t');
+ if (pos > tabSize)
+ tabSize = pos;
+ lines.Add(line);
+ }
+ }
+ tabSize += 2;
+ foreach (string line in lines) {
+ string[] parts = line.Split('\t');
+ Console.Write(parts[0].PadRight(tabSize));
+ Console.WriteLine(parts[1]);
+ if (parts.Length > 2) {
+ string spacer = new string(' ',
tabSize);
+ for(int i = 2; i < parts.Length; i++) {
+ Console.Write(spacer);
+ Console.WriteLine(parts[i]);
+ }
+ }
+ }
}
private void ShowUsage()
@@ -261,10 +296,16 @@
internal WhatToDoNext DoHelp()
{
- ShowHelp();
+ ShowHelp(false);
return WhatToDoNext.AbandonProgram;
}
+ internal WhatToDoNext DoHelp2()
+ {
+ ShowHelp(true);
+ return WhatToDoNext.AbandonProgram;
+ }
+
#endregion
#region Arguments Processing
@@ -316,29 +357,23 @@
bool ParsingOptions = true;
ArrayList result = new ArrayList();
- foreach(string arg in ExpandResponseFiles(args))
- {
- if (arg.Length > 0)
- {
- if (ParsingOptions)
- {
- if
(endOptionProcessingWithDoubleDash && (arg == "--"))
- {
+ foreach(string arg in ExpandResponseFiles(args)) {
+ if (arg.Length > 0) {
+ if (ParsingOptions) {
+ if
(endOptionProcessingWithDoubleDash && (arg == "--")) {
ParsingOptions = false;
continue;
}
if ((parsingMode &
OptionsParsingMode.Linux) > 0 &&
arg[0] == '-' &&
arg.Length > 1 && arg[1] != '-' &&
-
breakSingleDashManyLettersIntoManyOptions)
- {
+
breakSingleDashManyLettersIntoManyOptions) {
foreach(char c in
arg.Substring(1)) // many single-letter options
result.Add("-"
+ c); // expand into individualized options
continue;
}
- if (MaybeAnOption(arg))
- {
+ if (MaybeAnOption(arg)) {
int pos =
IndexOfAny(arg, ':', '=');
if(pos < 0)
@@ -349,9 +384,7 @@
}
continue;
}
- }
- else
- {
+ } else {
argumentsTail.Add(arg);
continue;
}
@@ -374,11 +407,9 @@
args = NormalizeArgs(args);
- try
- {
+ try {
int argc = args.Length;
- for (int i = 0; i < argc; i++)
- {
+ for (int i = 0; i < argc; i++) {
arg = args[i];
if (i+1 < argc)
nextArg = args[i+1];
@@ -387,13 +418,10 @@
OptionWasProcessed = false;
- if (arg.Length > 1 &&
(arg.StartsWith("-") || arg.StartsWith("/")))
- {
- foreach(OptionDetails option in
list)
- {
+ if (arg.Length > 1 &&
(arg.StartsWith("-") || arg.StartsWith("/"))) {
+ foreach(OptionDetails option in
list) {
OptionProcessingResult
result = option.ProcessArgument(arg, nextArg);
- if (result !=
OptionProcessingResult.NotThisOption)
- {
+ if (result !=
OptionProcessingResult.NotThisOption) {
OptionWasProcessed = true;
if (result ==
OptionProcessingResult.OptionConsumedParameter)
i++;
@@ -403,28 +431,18 @@
}
if (!OptionWasProcessed)
- {
- if (OptionDetails.Verbose)
-
Console.WriteLine("argument [" + arg + "]");
-
- arguments.Add(arg);
- }
+ ProcessNonOption(arg);
}
foreach(OptionDetails option in list)
option.TransferValues();
foreach(string argument in argumentsTail)
- arguments.Add(argument);
+ ProcessNonOption(argument);
- if (argumentProcessor == null)
- return
(string[])arguments.ToArray(typeof(string));
-
- foreach(string argument in arguments)
- argumentProcessor.Invoke(optionBundle,
new object[] { argument });
- }
- catch (Exception ex)
- {
+ return
(string[])arguments.ToArray(typeof(string));
+
+ } catch (Exception ex) {
System.Console.WriteLine(ex.ToString());
System.Environment.Exit(1);
}
@@ -432,6 +450,16 @@
return null;
}
+ private void ProcessNonOption(string argument)
+ {
+ if (OptionDetails.Verbose)
+ Console.WriteLine("argument [" +
argument + "]");
+ if (argumentProcessor == null)
+ arguments.Add(argument);
+ else
+ argumentProcessor.Invoke(optionBundle, new
object[] { argument });
+ }
+
#endregion
}
Modified: trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/Options.cs
===================================================================
--- trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/Options.cs 2005-02-28
18:11:24 UTC (rev 41290)
+++ trunk/mcs/class/Mono.GetOptions/Mono.GetOptions/Options.cs 2005-02-28
18:13:26 UTC (rev 41291)
@@ -46,25 +46,36 @@
RemainingArguments = optionParser.ProcessArgs(args);
}
- [Option("Show this help list", '?',"help")]
+ public void ShowBanner()
+ {
+ optionParser.ShowBanner();
+ }
+
+ [Option("Show this help list", '?', "help")]
public virtual WhatToDoNext DoHelp()
{
return optionParser.DoHelp();
}
+ [Option("Show an additional help list", "help2")]
+ public virtual WhatToDoNext DoHelp2()
+ {
+ return optionParser.DoHelp2();
+ }
+
[Option("Display version and licensing information", 'V',
"version")]
public virtual WhatToDoNext DoAbout()
{
return optionParser.DoAbout();
}
- [Option("Show usage syntax and exit", ' ',"usage")]
+ [Option("Show usage syntax and exit", "usage")]
public virtual WhatToDoNext DoUsage()
{
return optionParser.DoUsage();
}
- [Option("Show verbose parsing of options", '
',"verbosegetoptions")]
+ [Option("Show verbose parsing of options", "verbosegetoptions",
SecondLevelHelp = true)]
public bool VerboseParsingOfOptions
{
set { OptionDetails.Verbose = value;}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches