/// <summary> /// option コマンドを処理します。 /// </summary> private void HandleOption(Scanner scanner) { var option = UsiOption.Parse(scanner.Text); // "usi"は一度しか送っていないので同じ名前のoptionが二度送られてくることは想定しなくて良いはずなのだが、 // 一応きちんと処理しておく。 AddOption(option); }
/// <summary> /// OptionListにoptionを追加する。 /// nameが重複していれば追加せずに置き換える。 /// </summary> /// <param name="option"></param> private void AddOption(UsiOption option) { for (int i = 0; i < OptionList.Count; ++i) { if (OptionList[i].Name == option.Name) { OptionList[i] = option; return; } } OptionList.Add(option); }
/// <summary> /// USIのsetoptionの行のparseをする。 /// </summary> public static UsiOption Parse(string command) { if (string.IsNullOrEmpty(command)) { throw new UsiException("Parse()でcommand == null"); } var option = new UsiOption(); // スペースをセパレータとして分離する var scanner = new Scanner(command); if (scanner.ParseText() != "option") { throw new UsiException( command + ": invalid command."); } var value = string.Empty; while (!scanner.IsEof) { switch (scanner.ParseText()) { case "name": option.Name = ParseName(scanner); break; case "type": option.OptionType = ParseType(scanner.ParseText()); break; case "default": value = scanner.ParseText(); break; case "min": option.MinValue = long.Parse(scanner.ParseText()); break; case "max": option.MaxValue = long.Parse(scanner.ParseText()); break; case "var": var varText = scanner.ParseText(); option.ComboList.Add(varText); break; default: throw new UsiException( "invalid command: " + command); } } // 範囲調整を行っているため、値は最後に設定する。 if (!string.IsNullOrEmpty(value)) { option.SetDefault(value); } return(option); }