/* * TextMemoryStream.cs * Copyright (c) 2008-2009 kbinani * * This file is part of Boare.Lib.Vsq. * * Boare.Lib.Vsq is free software; you can redistribute it and/or * modify it under the terms of the BSD License. * * Boare.Lib.Vsq is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ using System; using System.IO; using System.Text; using System.Collections.Generic; namespace Boare.Lib.Vsq { public class TextMemoryStream : IDisposable { private static readonly string NL = (char)0x0d + "" + (char)0x0a; private List m_lines; private int m_index; public TextMemoryStream() { m_lines = new List(); m_lines.Add( "" ); m_index = 0; } public TextMemoryStream( string path, Encoding encoding ) { m_lines = new List(); m_index = 0; if ( File.Exists( path ) ) { using ( StreamReader sr = new StreamReader( path, encoding ) ) { while ( sr.Peek() >= 0 ) { string line = sr.ReadLine(); m_lines.Add( line ); m_index++; } } } } public void write( string value ) { appendString( value ); } public void writeLine( string value ) { appendString( value + NL ); } private void appendString( string value ) { string[] lines = value.Split( new string[] { NL }, StringSplitOptions.None ); List lines2 = new List(); for ( int i = 0; i < lines.Length; i++ ) { string[] spl = lines[i].Split( (char)0x0d, (char)0x0a ); for ( int j = 0; j < spl.Length; j++ ) { lines2.Add( spl[j] ); } } int count = lines2.Count; if ( count > 0 ) { m_lines[m_index] += lines2[0]; for ( int i = 1; i < count; i++ ) { m_lines.Add( lines2[i] ); m_index++; } } } public void rewind() { m_index = 0; } public string readLine() { m_index++; return m_lines[m_index - 1]; } public int peek() { if ( m_index < m_lines.Count ) { if ( m_lines[m_index] == "" ) { return -1; } else { return (int)m_lines[m_index][0]; } } else { return -1; } } public void close() { m_lines.Clear(); } public void Dispose() { close(); } } }