diff options
author | Jiyoung Yun <jy910.yun@samsung.com> | 2016-11-23 19:09:09 +0900 |
---|---|---|
committer | Jiyoung Yun <jy910.yun@samsung.com> | 2016-11-23 19:09:09 +0900 |
commit | 4b4aad7217d3292650e77eec2cf4c198ea9c3b4b (patch) | |
tree | 98110734c91668dfdbb126fcc0e15ddbd93738ca /src/mscorlib/src/System/IO/StringReader.cs | |
parent | fa45f57ed55137c75ac870356a1b8f76c84b229c (diff) | |
download | coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.tar.gz coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.tar.bz2 coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.zip |
Imported Upstream version 1.1.0upstream/1.1.0
Diffstat (limited to 'src/mscorlib/src/System/IO/StringReader.cs')
-rw-r--r-- | src/mscorlib/src/System/IO/StringReader.cs | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/IO/StringReader.cs b/src/mscorlib/src/System/IO/StringReader.cs new file mode 100644 index 0000000000..e5fa811453 --- /dev/null +++ b/src/mscorlib/src/System/IO/StringReader.cs @@ -0,0 +1,187 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +/*============================================================ +** +** +** +** +** Purpose: For reading text from strings +** +** +===========================================================*/ + +using System; +using System.Runtime.InteropServices; +using System.Diagnostics.Contracts; +using System.Security.Permissions; +using System.Threading.Tasks; + +namespace System.IO { + // This class implements a text reader that reads from a string. + // + [Serializable] + [ComVisible(true)] + public class StringReader : TextReader + { + private String _s; + private int _pos; + private int _length; + + public StringReader(String s) { + if (s == null) + throw new ArgumentNullException("s"); + Contract.EndContractBlock(); + _s = s; + _length = s == null? 0: s.Length; + } + + // Closes this StringReader. Following a call to this method, the String + // Reader will throw an ObjectDisposedException. + public override void Close() { + Dispose(true); + } + + protected override void Dispose(bool disposing) { + _s = null; + _pos = 0; + _length = 0; + base.Dispose(disposing); + } + + // Returns the next available character without actually reading it from + // the underlying string. The current position of the StringReader is not + // changed by this operation. The returned value is -1 if no further + // characters are available. + // + [Pure] + public override int Peek() { + if (_s == null) + __Error.ReaderClosed(); + if (_pos == _length) return -1; + return _s[_pos]; + } + + // Reads the next character from the underlying string. The returned value + // is -1 if no further characters are available. + // + public override int Read() { + if (_s == null) + __Error.ReaderClosed(); + if (_pos == _length) return -1; + return _s[_pos++]; + } + + // Reads a block of characters. This method will read up to count + // characters from this StringReader into the buffer character + // array starting at position index. Returns the actual number of + // characters read, or zero if the end of the string is reached. + // + public override int Read([In, Out] char[] buffer, int index, int count) { + if (buffer==null) + throw new ArgumentNullException("buffer", Environment.GetResourceString("ArgumentNull_Buffer")); + if (index < 0) + throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); + if (count < 0) + throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); + if (buffer.Length - index < count) + throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen")); + Contract.EndContractBlock(); + if (_s == null) + __Error.ReaderClosed(); + + int n = _length - _pos; + if (n > 0) { + if (n > count) n = count; + _s.CopyTo(_pos, buffer, index, n); + _pos += n; + } + return n; + } + + public override String ReadToEnd() + { + if (_s == null) + __Error.ReaderClosed(); + String s; + if (_pos==0) + s = _s; + else + s = _s.Substring(_pos, _length - _pos); + _pos = _length; + return s; + } + + // Reads a line. A line is defined as a sequence of characters followed by + // a carriage return ('\r'), a line feed ('\n'), or a carriage return + // immediately followed by a line feed. The resulting string does not + // contain the terminating carriage return and/or line feed. The returned + // value is null if the end of the underlying string has been reached. + // + public override String ReadLine() { + if (_s == null) + __Error.ReaderClosed(); + int i = _pos; + while (i < _length) { + char ch = _s[i]; + if (ch == '\r' || ch == '\n') { + String result = _s.Substring(_pos, i - _pos); + _pos = i + 1; + if (ch == '\r' && _pos < _length && _s[_pos] == '\n') _pos++; + return result; + } + i++; + } + if (i > _pos) { + String result = _s.Substring(_pos, i - _pos); + _pos = i; + return result; + } + return null; + } + + #region Task based Async APIs + [ComVisible(false)] + public override Task<String> ReadLineAsync() + { + return Task.FromResult(ReadLine()); + } + + [ComVisible(false)] + public override Task<String> ReadToEndAsync() + { + return Task.FromResult(ReadToEnd()); + } + + [ComVisible(false)] + public override Task<int> ReadBlockAsync(char[] buffer, int index, int count) + { + if (buffer==null) + throw new ArgumentNullException("buffer", Environment.GetResourceString("ArgumentNull_Buffer")); + if (index < 0 || count < 0) + throw new ArgumentOutOfRangeException((index < 0 ? "index" : "count"), Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); + if (buffer.Length - index < count) + throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen")); + + Contract.EndContractBlock(); + + return Task.FromResult(ReadBlock(buffer, index, count)); + } + + [ComVisible(false)] + public override Task<int> ReadAsync(char[] buffer, int index, int count) + { + if (buffer==null) + throw new ArgumentNullException("buffer", Environment.GetResourceString("ArgumentNull_Buffer")); + if (index < 0 || count < 0) + throw new ArgumentOutOfRangeException((index < 0 ? "index" : "count"), Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); + if (buffer.Length - index < count) + throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen")); + Contract.EndContractBlock(); + + return Task.FromResult(Read(buffer, index, count)); + } + #endregion + } +} |