Пример #1
0
        /// <summary>
        /// option コマンドを処理します。
        /// </summary>
        private void HandleOption(Scanner scanner)
        {
            var option = UsiOption.Parse(scanner.Text);

            // "usi"は一度しか送っていないので同じ名前のoptionが二度送られてくることは想定しなくて良いはずなのだが、
            // 一応きちんと処理しておく。
            AddOption(option);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }