private void ParseArguments(IList <string> tmpReasons) { bool doHelp = Arguments.Count == 0; InputFiles = new List <string>(); CSharpFileOptions.Builder builder = FileOptions.ToBuilder(); Dictionary <string, FieldDescriptor> fields = new Dictionary <string, FieldDescriptor>(StringComparer.OrdinalIgnoreCase); foreach (FieldDescriptor fld in builder.DescriptorForType.Fields) { fields.Add(fld.Name, fld); } foreach (string argument in Arguments) { if (StringComparer.OrdinalIgnoreCase.Equals("-help", argument) || StringComparer.OrdinalIgnoreCase.Equals("/help", argument) || StringComparer.OrdinalIgnoreCase.Equals("-?", argument) || StringComparer.OrdinalIgnoreCase.Equals("/?", argument)) { doHelp = true; break; } Match m = ArgMatch.Match(argument); if (m.Success) { FieldDescriptor fld; string name = m.Groups["name"].Value; string value = m.Groups["value"].Value; if (fields.TryGetValue(name, out fld)) { object obj; if (TryCoerceType(value, fld, out obj, tmpReasons)) { builder[fld] = obj; } } else if (name == "line_break") { string tmp; if (LineBreaks.TryGetValue(value, out tmp)) { LineBreak = tmp; } else { tmpReasons.Add("Invalid value for 'line_break': " + value + "."); } } else if (!File.Exists(argument)) { doHelp = true; tmpReasons.Add("Unknown argument '" + name + "'."); } else { InputFiles.Add(argument); } } else { InputFiles.Add(argument); } } if (doHelp || InputFiles.Count == 0) { tmpReasons.Add("Arguments:"); foreach (KeyValuePair <string, FieldDescriptor> field in fields) { tmpReasons.Add(String.Format("-{0}=[{1}]", field.Key, field.Value.FieldType)); } tmpReasons.Add("-line_break=[" + string.Join("|", new List <string>(LineBreaks.Keys).ToArray()) + "]"); tmpReasons.Add("followed by one or more file paths."); } else { FileOptions = builder.Build(); } }