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

Reply via email to