/// <summary>パスを走査して、テーブルを取得する。</summary>
        /// <param name="table">カレントテーブル。</param>
        /// <param name="keyStr">キー名称。</param>
        /// <param name="answer">取得したテーブル。</param>
        /// <returns>0はエラー、1は作成済みのテーブル、2は新規作成。</returns>
        internal static int SearchPathTable(this TomlTable table, string keyStr, out TomlTable answer)
        {
            ITomlValue tmp;

            if (table.Contains(keyStr))
            {
                // 指定のキーが登録済みならば、紐付く項目を返す
                //
                // 1. テーブルを返す
                // 2. テーブル配列のテーブルを返す
                // 3. テーブルの新規作成を依頼
                switch (table.Member(keyStr).ValueType)
                {
                case TomlValueType.TomlTableValue:          // 1
                    answer = (TomlTable)table.Member(keyStr);
                    return(1);

                case TomlValueType.TomlTableArrayValue:     // 2
                    tmp    = table.Member(keyStr);
                    answer = (TomlTable)tmp[tmp.Length - 1];
                    return(1);

                default:
                    answer = null;
                    return(0);
                }
            }
            else
            {
                answer = null;                              // 3
                return(2);
            }
        }
Esempio n. 2
0
        /// <summary>テーブル配列を作成する。</summary>
        /// <param name="iter">イテレータ。</param>
        /// <param name="table">カレントテーブル。</param>
        private void AnalisysTableArray(TomlInnerBuffer.TomlIter iter, TomlTable table)
        {
            // '.' で区切られたテーブル名を事前に収集する
            var keyPtr = iter.GetKeys();

            // テーブル配列が閉じられているか確認
            if (!iter.CloseTableArray())
            {
                throw new TomlAnalisysException(Resources.TABLE_ARRAY_SYNTAX_ERR, iter);
            }

            // 最下層のテーブル以外のテーブル参照を収集する
            //
            // 1. テーブル参照を取得
            // 2. エラーが有れば終了
            // 3. 既に作成済みならばカレントを変更
            // 4. 作成されていなければテーブルを作成し、カレントに設定
            TomlTable curTable = table;
            TomlTable newTable = null;
            string    keystr   = "";

            for (int i = 0; i < keyPtr.Count - 1; ++i)
            {
                keystr = keyPtr[i];

                switch (curTable.SearchPathTable(keystr, out newTable))     // 1
                {
                case 0:                                                     // 2
                    throw new TomlAnalisysException(Resources.TABLE_REDEFINITION_ERR, iter);

                case 1:
                    curTable = newTable;                                    // 3
                    break;

                default:
                    newTable = new TomlTable();                             // 4
                    curTable.AddKeyAndValue(keystr, newTable);
                    curTable = newTable;
                    break;
                }
            }

            // 最下層のテーブルは新規作成となる
            //
            // 1. 登録する名前(キー文字列)を取得
            // 2. 親のテーブルに最下層のテーブル名が登録されている
            //    2-1. 登録されている名前のデータを取得する
            //    2-2. テーブル配列が登録されているならば、新規テーブルを作成し、カレントテーブルとする
            //    2-3. テーブル配列でないならばエラーとする
            // 3. 親のテーブルに最下層のテーブル名が登録されていない
            //    3-1. テーブル配列を作成し、テーブルを追加、追加されたテーブルが次のカレントテーブルになる
            keystr = keyPtr[keyPtr.Count - 1];                              // 1

            if (curTable.Contains(keystr))                                  // 2-1
            {
                var val = curTable.Member(keystr);
                if (val.ValueType == TomlValueType.TomlTableArrayValue)     // 2-2
                {
                    newTable = new TomlTable();
                    ((Array <TomlTable>)val).Add(newTable);
                }
                else                                                        // 2-3
                {
                    throw new TomlAnalisysException(Resources.DEFINED_KEY_ERR, iter);
                }
            }
            else
            {
                newTable = new TomlTable();                                 // 3-1
                var newArr = TomlValue.Create(new TomlTable[] { newTable });
                curTable.AddKeyAndValue(keystr, newArr);
            }

            // カレントのテーブルを作成したテーブルに変更
            this.current = newTable;
            iter.SkipSpace();
        }