/// <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); } }
/// <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(); }