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