// (C) Ximian, Inc. http://www.ximian.com\r
//\r
\r
-\r
using System;\r
using System.Text;\r
\r
\r
public class StreamReader : TextReader {\r
\r
+ // buffering members\r
+ private char[] buffer;\r
+ private int pos;\r
+\r
private Encoding internalEncoding;\r
+ private Decoder decoder;\r
\r
private Stream internalStream;\r
\r
- // new public static readonly StreamReader Null;\r
+ public new static readonly StreamReader Null = new StreamReader((Stream)null);\r
\r
public StreamReader(Stream stream)\r
: this (stream, null, false, 0) { }\r
public StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)\r
: this (stream, encoding, detectEncodingFromByteOrderMarks, 0) { }\r
\r
+ [MonoTODO]\r
public StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize)\r
{\r
internalStream = stream;\r
\r
- if (encoding == null)\r
+ // use detect encoding flag\r
+ if (encoding == null) {\r
internalEncoding = Encoding.UTF8;\r
- else\r
+ decoder = Encoding.UTF8.GetDecoder ();\r
+ } else {\r
internalEncoding = encoding;\r
+ decoder = encoding.GetDecoder ();\r
+ }\r
\r
+ buffer = null;\r
}\r
\r
public StreamReader(string path)\r
public StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)\r
: this (path, encoding, detectEncodingFromByteOrderMarks, 0) { }\r
\r
+ [MonoTODO]\r
public StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize)\r
{\r
- //internalStream = stream;\r
-\r
- if (encoding == null)\r
+ // use detect encoding flag\r
+ if (encoding == null) {\r
internalEncoding = Encoding.UTF8;\r
- else\r
+ decoder = Encoding.UTF8.GetDecoder ();\r
+ } else {\r
internalEncoding = encoding;\r
+ decoder = encoding.GetDecoder ();\r
+ }\r
+\r
+ internalStream = (Stream) File.OpenRead (path);\r
\r
+ buffer = null;\r
}\r
\r
public virtual Stream BaseStream\r
}\r
\r
[MonoTODO]\r
+ public override void Close ()\r
+ {\r
+ Dispose (true);\r
+ }\r
+\r
+ [MonoTODO]\r
+ public void DiscardBufferedData ()\r
+ {\r
+ }\r
+\r
public override int Peek ()\r
{\r
- // FIXME: handle encoding....\r
- int val = internalStream.ReadByte ();\r
- if (val != -1)\r
- internalStream.Seek (-1, SeekOrigin.Current);\r
- return val;\r
+ if (!internalStream.CanSeek)\r
+ return -1;\r
+\r
+ if ((buffer == null) || ((pos + 1) == buffer.Length)) {\r
+ int cnt = internalEncoding.GetMaxByteCount (1);\r
+ byte[] bytes = new byte[cnt];\r
+ int actcnt = internalStream.Read (bytes, 0, cnt);\r
+ internalStream.Seek (-actcnt, SeekOrigin.Current);\r
+\r
+ if (actcnt <= 0) \r
+ return -1;\r
+\r
+ int bufcnt = decoder.GetCharCount (bytes, 0, cnt);\r
+ char[] chars = new char [bufcnt];\r
+ bufcnt = decoder.GetChars (bytes, 0, cnt, chars, 0);\r
+ return chars [0];\r
+ }\r
+\r
+ return buffer [pos + 1];\r
}\r
\r
public override int Read ()\r
{\r
- return internalStream.ReadByte ();\r
+ if ((buffer == null) || (++pos == buffer.Length)) {\r
+ byte[] bytes = new byte [8192];\r
+ int cnt = internalStream.Read (bytes, 0, 8192);\r
+\r
+ if (cnt <= 0) \r
+ return -1;\r
+\r
+ int bufcnt = decoder.GetCharCount (bytes, 0, cnt);\r
+ buffer = new char [bufcnt];\r
+ bufcnt = decoder.GetChars (bytes, 0, cnt, buffer, 0);\r
+ pos = 0;\r
+ }\r
+\r
+ return buffer[pos];\r
}\r
\r
+ [MonoTODO]\r
public override int Read (char[] buffer, int index, int count)\r
{\r
return 0;\r
}\r
\r
+ [MonoTODO]\r
public override string ReadLine()\r
{\r
return String.Empty;\r
}\r
\r
+ [MonoTODO]\r
public override string ReadToEnd()\r
{\r
return String.Empty;\r