2002-03-21 Mike Kestner <mkestner@speakeasy.net>
authorMike Kestner <mkestner@gmail.com>
Fri, 22 Mar 2002 02:09:36 +0000 (02:09 -0000)
committerMike Kestner <mkestner@gmail.com>
Fri, 22 Mar 2002 02:09:36 +0000 (02:09 -0000)
* ASCIIEncoding.cs : Fix off by one error in Get(Char|Byte)Count.

2002-03-21  Mike Kestner <mkestner@speakeasy.net>

* StreamReader.cs : Fill out, add buffering, and use encoding.

svn path=/trunk/mcs/; revision=3266

mcs/class/corlib/System.IO/ChangeLog
mcs/class/corlib/System.IO/StreamReader.cs
mcs/class/corlib/System.Text/ASCIIEncoding.cs
mcs/class/corlib/System.Text/ChangeLog

index 67e7e835bbc8425ff0b62d185db956f2eb2c20c7..83c84b3d0493c4526902acd8a5f549ee8d44c502 100644 (file)
@@ -1,3 +1,7 @@
+2002-03-21  Mike Kestner <mkestner@speakeasy.net>
+
+       * StreamReader.cs : Fill out, add buffering, and use encoding.
+
 2002-03-19  Martin Baulig  <martin@gnome.org>
 
        * StreamWriter.cs (StreamWriter (string)): The default is to override
index 3175cec0c7c55d1f8b427bca4d67f4d1f1ab07db..fd31d58b1dbcfeec1f29084f37fee14a64fdedab 100644 (file)
@@ -7,7 +7,6 @@
 // (C) Ximian, Inc.  http://www.ximian.com\r
 //\r
 \r
-\r
 using System;\r
 using System.Text;\r
 \r
@@ -15,11 +14,16 @@ namespace System.IO {
        \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
@@ -33,15 +37,21 @@ namespace System.IO {
                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
@@ -56,15 +66,21 @@ namespace System.IO {
                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
@@ -82,30 +98,70 @@ namespace System.IO {
                }\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
index 13e28d908e94f0fcce2fbf8ccc5debec70f59d8e..c6421b0a02e915eed2b9e5ae4d5589320eeb3a82 100755 (executable)
@@ -46,7 +46,7 @@ namespace System.Text {
                        if (chars == null) 
                                throw new ArgumentNullException ();
 
-                       if ((index < 0) || (count <= 0) || ((index + count) >= chars.Length))
+                       if ((index < 0) || (count <= 0) || ((index + count) > chars.Length))
                                throw new ArgumentOutOfRangeException ();
 
                        return count;
@@ -95,7 +95,7 @@ namespace System.Text {
                        if (bytes == null) 
                                throw new ArgumentNullException ();
 
-                       if ((index < 0) || (count <= 0) || ((index + count) >= bytes.Length))
+                       if ((index < 0) || (count <= 0) || ((index + count) > bytes.Length))
                                throw new ArgumentOutOfRangeException ();
 
                        return count;
index 2963b1a7f88a1bd6d32ce917651c8ab52ba93f1b..513346d516870b04e57f4f8ddfd040b79be08d67 100755 (executable)
@@ -1,3 +1,6 @@
+2002-03-21  Mike Kestner  <mkestner@speakeasy.net>
+
+       * ASCIIEncoding.cs : Fix off by one error in Get(Char|Byte)Count.
 
 Thu Mar 21 17:38:19 CET 2002 Paolo Molaro <lupus@ximian.com>