/// <summary>"'" で囲まれた文字列を取得する。</summary>
        /// <param name="iter">イテレータ。</param>
        /// <returns>取得した文字列。</returns>
        internal static string GetMultiLiteralStringValue(this TomlInnerBuffer.TomlIter iter)
        {
            var  buf = new List <byte>();
            UTF8 c;
            bool eof;

            // 先頭の改行は取り除く
            iter.SkipHeadLineFeed();

            do
            {
                eof = iter.IsEndStream;

                while ((c = iter.GetChar(0)).ch1 != 0)
                {
                    switch (c.ch1)
                    {
                    case (byte)'\'':
                        // " を取得したら文字列終了
                        if (iter.GetChar(2).ch1 == '\'' &&
                            iter.GetChar(1).ch1 == '\'')
                        {
                            iter.Skip(3);
                            return(Encoding.UTF8.GetString(buf.ToArray()));
                        }
                        else
                        {
                            buf.Add(c.ch1);
                            iter.Skip(1);
                        }
                        break;

                    default:
                        // 上記以外は普通の文字として取得
                        c.Expand(buf);
                        iter.Skip(1);
                        break;
                    }
                }
                iter.ReadLine();
            } while (!eof);

            // " で終了できなかったためエラー
            throw new TomlAnalisysException(Resources.MULTI_LITERAL_STRING_ERR, iter);
        }
        //---------------------------------------------------------------------
        // 文字列解析
        //---------------------------------------------------------------------
        /// <summary>""" で囲まれた文字列を取得する。</summary>
        /// <param name="iter">イテレータ。</param>
        /// <returns>取得した文字列。</returns>
        internal static string GetMultiStringValue(this TomlInnerBuffer.TomlIter iter)
        {
            var  buf = new List <byte>();
            UTF8 c, nc;
            bool eof;
            bool skipSpace = false;

            byte[] lastC = new byte[2];

            // 先頭の改行は取り除く
            iter.SkipHeadLineFeed();

            do
            {
                eof = iter.IsEndStream;

                while ((c = iter.GetChar(0)).ch1 != 0)
                {
                    switch (c.ch1)
                    {
                    case (byte)'"':
                        // " を取得したら文字列終了
                        if (iter.GetChar(2).ch1 == '"' &&
                            iter.GetChar(1).ch1 == '"')
                        {
                            iter.Skip(3);
                            return(Encoding.UTF8.GetString(buf.ToArray()));
                        }
                        else
                        {
                            buf.Add(c.ch1);
                            iter.Skip(1);
                        }
                        break;

                    case (byte)'\\':
                        // \のエスケープ文字判定
                        nc = iter.GetChar(1);
                        if ((nc.ch1 == '\r' || nc.ch1 == '\n' || nc.ch1 == '\t' || nc.ch1 == ' ') &&
                            iter.CheckLineEnd())
                        {
                            skipSpace = true;
                            iter.Skip(1);
                        }
                        else
                        {
                            AppendEscapeChar(iter, buf);
                        }
                        break;

                    case (byte)' ':
                    case (byte)'\t':
                        // 空白文字を追加する
                        if (!skipSpace)
                        {
                            buf.Add(c.ch1);
                        }
                        iter.Skip(1);
                        break;

                    default:
                        // 上記以外は普通の文字として取得
                        if (c.ch1 > 0x1f)
                        {
                            skipSpace = false;
                            c.Expand(buf);
                        }
                        else
                        {
                            lastC[1] = lastC[0];
                            lastC[0] = (byte)(c.ch1 & 0x1f);
                        }
                        iter.Skip(1);
                        break;
                    }
                }

                // 改行の読み飛ばし指定がなければ追加する
                if (!skipSpace)
                {
                    if (lastC[1] == '\r' && lastC[0] == '\n')
                    {
                        buf.Add((byte)'\r');
                        buf.Add((byte)'\n');
                    }
                    else if (lastC[0] == '\n')
                    {
                        buf.Add((byte)'\n');
                    }
                }
                iter.ReadLine();
            } while (!eof);

            // " で終了できなかったためエラー
            throw new TomlAnalisysException(Resources.MULTI_QUOAT_STRING_ERR, iter);
        }