/// <summary>キー文字列を取得する。</summary>
        /// <param name="iter">イテレータ。</param>
        /// <returns>キー文字列。</returns>
        internal static string GetKey(this TomlInnerBuffer.TomlIter iter)
        {
            var  buf = new List <byte>();
            UTF8 c;

            // 空白を読み飛ばす
            iter.SkipSpace();

            // 範囲の開始、終了位置で評価
            //
            // 1. 一文字取得する
            // 2. キー使用可能文字か判定する
            // 3. " なら文字列としてキー文字列を取得する
            while ((c = iter.GetChar(0)).ch1 != 0)          // 1
            {
                if ((c.ch1 >= 'a' && c.ch1 <= 'z') ||       // 2
                    (c.ch1 >= 'A' && c.ch1 <= 'Z') ||
                    (c.ch1 >= '0' && c.ch1 <= '9') ||
                    c.ch1 == '_' || c.ch1 == '-')
                {
                    c.Expand(buf);
                    iter.Skip(1);
                }
                else if (c.ch1 == '"' && buf.Count <= 0)    // 3
                {
                    iter.Skip(1);
                    return(iter.GetStringValue());
                }
                else
                {
                    break;
                }
            }

            // バイトリストを文字列に変換して返す
            if (buf.Count > 0)
            {
                return(Encoding.UTF8.GetString(buf.ToArray()));
            }
            else
            {
                throw new TomlAnalisysException(Resources.KEY_ANALISYS_ERR, iter);
            }
        }
Ejemplo n.º 2
0
        /// <summary>数値(整数/実数/日付)を取得する。</summary>
        /// <param name="iter">イテレータ。</param>
        /// <returns>値情報。</returns>
        private ITomlValue ConvertValue(TomlInnerBuffer.TomlIter iter)
        {
            ITomlValue value = null;

            // 値リテラルを解析する
            if (iter.AnalisysKeyword(out value))
            {
                return(value);
            }

            // 複数ライン文字列を返す
            if (iter.RemnantLength >= 3)
            {
                // 複数ライン文字列を返す
                if (iter.GetChar(2).ch1 == '"' &&
                    iter.GetChar(1).ch1 == '"' &&
                    iter.GetChar(0).ch1 == '"')
                {
                    iter.Skip(3);
                    return(TomlValue.Create(iter.GetMultiStringValue()));
                }

                // 複数ライン文字列(リテラル)を返す
                if (iter.GetChar(2).ch1 == '\'' &&
                    iter.GetChar(1).ch1 == '\'' &&
                    iter.GetChar(0).ch1 == '\'')
                {
                    iter.Skip(3);
                    return(TomlValue.Create(iter.GetMultiLiteralStringValue()));
                }
            }

            // 数値/日付/文字列
            if (iter.RemnantLength > 0)
            {
                switch (iter.GetChar(0).ch1)
                {
                case (byte)'"':
                    // 文字列を取得する
                    iter.Skip(1);
                    return(TomlValue.Create(iter.GetStringValue()));

                case (byte)'\'':
                    // リテラル文字列を取得する
                    iter.Skip(1);
                    return(TomlValue.Create(iter.GetLiteralStringValue()));

                case (byte)'#':
                    // コメントを取得する
                    iter.Skip(1);
                    return(null);

                case (byte)'+':
                    // 数値を取得する
                    iter.Skip(1);
                    return(iter.GetNumberValue(false));

                case (byte)'-':
                    // 数値を取得する
                    iter.Skip(1);
                    return(iter.GetNumberValue(true));

                default:
                    // 日付/数値を取得する
                    return(iter.GetNumberOrDateValue());
                }
            }
            else
            {
                throw new TomlAnalisysException(Resources.NOT_DEFINED_VALUE_ERR, iter);
            }
        }