[mono-symbolicate] Use Mono.Options.
authorMarcos Henrich <marcos.henrich@xamarin.com>
Fri, 8 Jul 2016 13:12:55 +0000 (14:12 +0100)
committerMarcos Henrich <marcos.henrich@xamarin.com>
Fri, 8 Jul 2016 21:45:49 +0000 (22:45 +0100)
mcs/tools/mono-symbolicate/mono-symbolicate.exe.sources
mcs/tools/mono-symbolicate/symbolicate.cs

index 672f7ffe2ef3451ef65dfb9b00efdf041e8d3006..b6f80e99aceec3c0d00a110dc0e07c8945041c66 100644 (file)
@@ -4,3 +4,4 @@ SeqPointInfo.cs
 StackFrameData.cs
 StackTraceMetadata.cs
 SymbolManager.cs
+../../class/Mono.Options/Mono.Options/Options.cs
index a99c9d01204b3c06e74e3862fbe88b2aa59bbb15..6479a48b8637c4fd6f8835c320ca27c168343b88 100644 (file)
@@ -4,40 +4,87 @@ using System.Text;
 using System.Linq;
 using System.Collections.Generic;
 using System.Globalization;
+using Mono.Options;
 
 namespace Mono
 {
        public class Symbolicate
        {
+               class Command {
+                       public readonly int MinArgCount;
+                       public readonly int MaxArgCount;
+                       public readonly Action<List<string>> Action;
+
+                       public Command (Action<List<string>> action, int minArgCount = 0, int maxArgCount = int.MaxValue)
+                       {
+                               Action = action;
+                               MinArgCount = minArgCount;
+                               MaxArgCount = maxArgCount;
+                       }
+               }
+
                public static int Main (String[] args)
                {
-                       if (args.Length != 2 && (args[0] == "store-symbols" && args.Length < 3)) {
+                       var showHelp = false;
+                       List<string> extra = null;
+
+                       Command cmd = null;
+
+                       if (args[0] == "store-symbols")
+                               cmd = new Command (StoreSymbolsAction, 2);
+
+                       if (cmd != null) {
+                               args = args.Skip (1).ToArray ();
+                       } else {
+                               cmd = new Command (SymbolicateAction, 2, 2);
+                       }
+
+                       var options = new OptionSet {
+                               { "h|help", "Show this help", v => showHelp = true },
+                       };
+
+                       try {
+                               extra = options.Parse (args);
+                       } catch (OptionException e) {
+                               Console.WriteLine ("Option error: {0}", e.Message);
+                               showHelp = true;
+                       }
+
+                       if (showHelp || extra == null || extra.Count < cmd.MinArgCount || extra.Count > cmd.MaxArgCount) {
                                Console.Error.WriteLine ("Usage: symbolicate <msym dir> <input file>");
                                Console.Error.WriteLine ("       symbolicate store-symbols <msym dir> [<dir>]+");
+                               Console.WriteLine ();
+                               Console.WriteLine ("Available options:");
+                               options.WriteOptionDescriptions (Console.Out);
                                return 1;
                        }
 
-                       if (args[0] == "store-symbols") {
-                               var msymDir = args[1];
-                               var lookupDirs = args.Skip (1).ToArray ();
+                       cmd.Action (extra);
 
-                               var symbolManager = new SymbolManager (msymDir);
-
-                               symbolManager.StoreSymbols (lookupDirs);
+                       return 0;
+               }
 
-                       } else {
-                               var msymDir = args [0];
-                               var inputFile = args [1];
+               private static void SymbolicateAction (List<string> args)
+               {
+                       var msymDir = args [0];
+                       var inputFile = args [1];
 
-                               var symbolManager = new SymbolManager (msymDir);
+                       var symbolManager = new SymbolManager (msymDir);
 
-                               using (StreamReader r = new StreamReader (inputFile)) {
-                                       var sb = Process (r, symbolManager);
-                                       Console.Write (sb.ToString ());
-                               }
+                       using (StreamReader r = new StreamReader (inputFile)) {
+                               var sb = Process (r, symbolManager);
+                               Console.Write (sb.ToString ());
                        }
+               }
 
-                       return 0;
+               private static void StoreSymbolsAction (List<string> args)
+               {
+                       var msymDir = args[0];
+                       var lookupDirs = args.Skip (1).ToArray ();
+
+                       var symbolManager = new SymbolManager (msymDir);
+
+                       symbolManager.StoreSymbols (lookupDirs);
                }
 
                public static StringBuilder Process (StreamReader reader, SymbolManager symbolManager)