diff options
Diffstat (limited to 'runtime/CSharp2/Sources/Antlr3.Runtime/Antlr.Runtime/ANTLRFileStream.cs')
-rw-r--r-- | runtime/CSharp2/Sources/Antlr3.Runtime/Antlr.Runtime/ANTLRFileStream.cs | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/runtime/CSharp2/Sources/Antlr3.Runtime/Antlr.Runtime/ANTLRFileStream.cs b/runtime/CSharp2/Sources/Antlr3.Runtime/Antlr.Runtime/ANTLRFileStream.cs new file mode 100644 index 0000000..f66bbfc --- /dev/null +++ b/runtime/CSharp2/Sources/Antlr3.Runtime/Antlr.Runtime/ANTLRFileStream.cs @@ -0,0 +1,150 @@ +/* +[The "BSD licence"] +Copyright (c) 2005-2007 Kunle Odutola +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code MUST RETAIN the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form MUST REPRODUCE the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior WRITTEN permission. +4. Unless explicitly state otherwise, any contribution intentionally + submitted for inclusion in this work to the copyright owner or licensor + shall be under the terms and conditions of this license, without any + additional terms or conditions. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +namespace Antlr.Runtime +{ + using System; + using StreamReader = System.IO.StreamReader; + using FileInfo = System.IO.FileInfo; + using Encoding = System.Text.Encoding; + + /// <summary> + /// A character stream - an <see cref="ICharStream"/> - that loads + /// and caches the contents of it's underlying file fully during + /// object construction + /// </summary> + /// <remarks> + /// This looks very much like an ANTLReaderStream or an ANTLRInputStream + /// but, it is a special case. Since we know the exact size of the file to + /// load, we can avoid lots of data copying and buffer resizing. + /// </remarks> + public class ANTLRFileStream : ANTLRStringStream + { + #region Constructors + + /// <summary> + /// Initializes a new instance of the ANTLRFileStream class + /// </summary> + protected ANTLRFileStream() + { + } + + /// <summary> + /// Initializes a new instance of the ANTLRFileStream class for the + /// specified file name + /// </summary> + public ANTLRFileStream(string fileName) : + this(fileName, Encoding.Default) + { + } + + /// <summary> + /// Initializes a new instance of the ANTLRFileStream class for the + /// specified file name and encoding + /// </summary> + public ANTLRFileStream(string fileName, Encoding encoding) + { + this.fileName = fileName; + Load(fileName, encoding); + } + + /// <summary> + /// Gets the file name of this ANTLRFileStream underlying file + /// </summary> + override public string SourceName + { + get { return fileName; } + } + + #endregion + + + #region Public API + + /// <summary> + /// Loads and buffers the specified file to be used as this + /// ANTLRFileStream's source + /// </summary> + /// <param name="fileName">File to load</param> + /// <param name="encoding">Encoding to apply to file</param> + public virtual void Load(string fileName, Encoding encoding) + { + if (fileName == null) + return; + + StreamReader fr = null; + try + { + FileInfo f = new FileInfo(fileName); + int filelen = (int)GetFileLength(f); + data = new char[filelen]; + if (encoding != null) + fr = new StreamReader(fileName, encoding); + else + fr = new StreamReader(fileName, Encoding.Default); + n = fr.Read((Char[])data, 0, data.Length); + } + finally + { + if (fr != null) + { + fr.Close(); + } + } + } + + #endregion + + + #region Data Members + + /// <summary>Fully qualified name of the stream's underlying file</summary> + protected string fileName; + + #endregion + + + #region Private Members + + private long GetFileLength(FileInfo file) + { + if (file.Exists) + return file.Length; + else + return 0; + } + + #endregion + } +}
\ No newline at end of file |