/** Parse a single argument taking things like the double-dash (--) option into consideration. */ public void Parse(string argument) { // barf on empty parameters if (argument.Length == 0) throw new System.ArgumentException(argument); // handle -script parameters if (_script) { _arguments.Add(argument); return; } // handle verbatim, and positional parameters if (_verbatim || "@-".IndexOf(argument[0]) == -1) { _sources.Add(argument); return; } // handle response files if (argument[0] == '@') { Load(argument.Substring(1)); return; } // handle options aka named parameters string name; string data; int pos = argument.IndexOf(':'); if (pos == -1) { name = argument; data = null; } else { name = argument.Substring(0, pos); data = argument.Substring(pos + 1); } switch (name) { case "--": // handy POSIX option: disable further processing _verbatim = true; break; case "-entry": if (data == null) throw new SetupError("Argument missing in option: " + argument); _entry = data; break; case "-h": case "-help": case "--help": // GNU compatibility option if (data != null) throw new SetupError("Excess argument in option: " + argument); throw new ShowHelpError(); case "-license": case "--license": // GNU compatibility option if (data != null) throw new SetupError("Excess argument in option: " + argument); throw new ShowInfoError(); case "-mode": if (data == null) throw new SetupError("Argument missing in option: " + argument); switch (data) { case "ship": _mode = ModeKind.Ship; break; case "test": _mode = ModeKind.Test; break; case "time": _mode = ModeKind.Time; break; default : throw new SetupError("Invalid argument in option: " + argument); } break; case "-name": if (data == null) throw new SetupError("Argument missing in option: " + argument); _name = data; break; case "-output": if (data == null) throw new SetupError("Argument missing in option: " + argument); _output = data; break; case "-quiet": if (data == null) throw new SetupError("Argument missing in option: " + argument); uint quiet; if (!uint.TryParse(data, out quiet) || quiet > 1) throw new SetupError("Invalid argument in option: " + argument); _quiet = (quiet == 0) ? false : true; break; case "-recurse": if (data != null) throw new SetupError("Excess argument in option: " + argument); _recurse = true; break; case "-script": _script = true; break; #if USED case "-target": if (data == null) throw new SetupError("Argument missing in option: " + argument); _target = new Target(data); break; #endif case "-todo": if (data == null) throw new SetupError("Argument missing in option: " + argument); switch (data) { case "erase": _todo = TodoKind.Erase; break; case "throw": _todo = TodoKind.Throw; break; case "warn" : _todo = TodoKind.Warn; break; default : throw new SetupError("Invalid argument in option: " + argument); } break; case "-trace": if (data == null) throw new SetupError("Argument missing in option: " + argument); uint value; if (!uint.TryParse(data, out value) || value > 6) throw new SetupError("Invalid argument in option: " + argument); _trace = value; break; case "-version": case "--version": // GNU compatibility option if (data != null) throw new SetupError("Excess argument in option: " + argument); throw new ShowLogoError(); case "-writer": if (data == null) throw new SetupError("Argument missing in option: " + argument); switch (data) { case "Braceless0": case "C": case "C++": case "C#": case "D2": case "LLVM": case "MSIL": case "PHP5": case "Python2": break; default: throw new SetupError("Unknown writer (backend) in option: " + argument); } if (_writers.IndexOf(data) != -1) throw new SetupError("Writer already specified once: " + argument); _writers.Add(data); break; default: throw new SetupError("Unknown option: " + argument); } }
/** Parse a single command-line parameter. */ public void Parse(string arg) { // an empty argument if (arg.Length == 0) throw new TestError("Empty parameter detected"); // a response file if (arg[0] == '@') { Load(arg.Substring(1)); return; } // a named argument (an option) if (arg[0] == '-') { int pos = arg.IndexOf(':'); string name; string data; if (pos == -1) { name = arg.Substring(1); data = null; } else { name = arg.Substring(1, pos - 1); data = arg.Substring(pos + 1).TrimEnd(); } switch (name.ToLower()) { case "bootstrap": if (data != null) throw new TestError("Extranous argument in option: " + arg); _bootstrap = true; break; case "compiler": if (data == null || data.Length == 0) throw new TestError("Missing argument in option: + " + arg); _compiler = data; break; case "?": case "h": case "help": case "-help": throw new ShowHelpError(); case "mode": if (data == null || data.Length == 0) throw new TestError("Missing argument in option: + " + arg); switch (data.ToLower()) { case "ship": _mode = ModeKind.Ship; break; case "test": _mode = ModeKind.Test; break; default: throw new TestError("Invalid mode in option: " + data); } break; #if false /* this does not yet work due to hard-coded assumptions about the location of the output path in Bugfind.cs. */ case "output": if (data == null || data.Trim().Length == 0) throw new TestError("Missing argument in option: + " + arg); _output = data; if (_output.Length > 1 && _output[_output.Length - 1] != System.IO.Path.DirectorySeparatorChar) _output += System.IO.Path.DirectorySeparatorChar; break; #endif case "platform": if (data == null || data.Length == 0) throw new TestError("Missing argument in option: " + arg); switch (data) { case ".NET": case "Mono": case "dotGNU": _platform = data; break; default: throw new TestError("Invalid platform name in option: " + arg); } break; case "target": if (data == null || data.Length == 0) throw new TestError("Missing argument in option: " + arg); try { Target target = new Target(data); _targets.Add(target); } catch (TestError) { throw new TestError("Invalid target specification: " + data); } break; case "trace": if (data == null || data.Length == 0) throw new TestError("Missing argument in option: " + arg); _trace = int.Parse(data); if (_trace < 0 || _trace > 5) throw new TestError("Invalid argument in option (must be between 0 and 5): " + arg); break; case "threads": try { _threads = int.Parse(data); } catch (System.Exception) { throw new TestError("Invalid number of threads in option: " + arg); } break; case "version": throw new ShowInfoError(); default: throw new TestError("Unknown option: " + arg); } return; } // a positional argument _sources.Add(arg); }