* BinaryReader.cs: Fixed line endings.
[mono.git] / mcs / class / corlib / System.IO / UnexceptionalStreamReader.cs
1 //
2 // System.IO.UnexceptionalStreamReader.cs
3 //
4 // Authors:
5 //   Dietmar Maurer (dietmar@ximian.com)
6 //   Miguel de Icaza (miguel@ximian.com)
7 //   Dick Porter (dick@ximian.com)
8 //   Sebastien Pouliot  <sebastien@ximian.com>
9 //
10 // (C) Ximian, Inc.  http://www.ximian.com
11 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 // 
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 // 
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 //
32
33
34 // This is a wrapper around StreamReader used by System.Console that
35 // catches IOException so that graphical applications don't suddenly
36 // get IO errors when their terminal vanishes.  See
37 // UnexceptionalStreamWriter too.
38
39 using System.Text;
40 using System.Runtime.InteropServices;
41
42 namespace System.IO {
43         internal class UnexceptionalStreamReader : StreamReader {
44
45                 private bool[] newline = new bool [Environment.NewLine.Length];
46
47                 public UnexceptionalStreamReader(Stream stream)
48                         : base (stream)
49                 {
50                 }
51
52                 public UnexceptionalStreamReader(Stream stream, bool detect_encoding_from_bytemarks)
53                         : base (stream, detect_encoding_from_bytemarks)
54                 {
55                 }
56
57                 public UnexceptionalStreamReader(Stream stream, Encoding encoding)
58                         : base (stream, encoding)
59                 {
60                 }
61
62                 public UnexceptionalStreamReader(Stream stream, Encoding encoding, bool detect_encoding_from_bytemarks)
63                         : base (stream, encoding, detect_encoding_from_bytemarks)
64                 {
65                 }
66                 
67                 public UnexceptionalStreamReader(Stream stream, Encoding encoding, bool detect_encoding_from_bytemarks, int buffer_size)
68                         : base (stream, encoding, detect_encoding_from_bytemarks, buffer_size)
69                 {
70                 }
71
72                 public UnexceptionalStreamReader(string path)
73                         : base (path)
74                 {
75                 }
76
77                 public UnexceptionalStreamReader(string path, bool detect_encoding_from_bytemarks)
78                         : base (path, detect_encoding_from_bytemarks)
79                 {
80                 }
81
82                 public UnexceptionalStreamReader(string path, Encoding encoding)
83                         : base (path, encoding)
84                 {
85                 }
86
87                 public UnexceptionalStreamReader(string path, Encoding encoding, bool detect_encoding_from_bytemarks)
88                         : base (path, encoding, detect_encoding_from_bytemarks)
89                 {
90                 }
91                 
92                 public UnexceptionalStreamReader(string path, Encoding encoding, bool detect_encoding_from_bytemarks, int buffer_size)
93                         : base (path, encoding, detect_encoding_from_bytemarks, buffer_size)
94                 {
95                 }
96
97                 public override int Peek ()
98                 {
99                         try {
100                                 return(base.Peek ());
101                         } catch (IOException) {
102                         }
103
104                         return(-1);
105                 }
106
107                 public override int Read ()
108                 {
109                         try {
110                                 return(base.Read ());
111                         } catch (IOException) {
112                         }
113
114                         return(-1);
115                 }
116
117                 public override int Read ([In, Out] char[] dest_buffer,
118                                           int index, int count)
119                 {
120                         if (dest_buffer == null)
121                                 throw new ArgumentNullException ("dest_buffer");
122                         if (index < 0)
123                                 throw new ArgumentOutOfRangeException ("index", "< 0");
124                         if (count < 0)
125                                 throw new ArgumentOutOfRangeException ("count", "< 0");
126                         // ordered to avoid possible integer overflow
127                         if (index > dest_buffer.Length - count)
128                                 throw new ArgumentException ("index + count > dest_buffer.Length");
129
130                         int chars_read = 0;
131                         while (count > 0) {
132                                 int c = Read ();
133                                 if (c < 0)
134                                         break;
135                                 chars_read++;
136                                 count--;
137
138                                 dest_buffer [index] = (char) c;
139                                 if (CheckEOL (dest_buffer [index++]))
140                                         return chars_read;
141                         }
142                         return chars_read;
143                 }
144
145                 private bool CheckEOL (char current)
146                 {
147                         // shortcut when a new line is only one character (e.g. Linux, Mac)
148                         if (newline.Length == 1)
149                                 return (current == Environment.NewLine [0]);
150
151                         // general case for any length (e.g. Windows)
152                         for (int i=0; i < newline.Length; i++) {
153                                 if (!newline [i]) {
154                                         if (current == Environment.NewLine [i]) {
155                                                 newline [i] = true;
156                                                 return (i == newline.Length - 1);
157                                         }
158                                         break;
159                                 }
160                         }
161                         for (int j=0; j < newline.Length; j++)
162                                 newline [j] = false;
163                         return false;
164                 }
165
166                 public override string ReadLine()
167                 {
168                         try {
169                                 return(base.ReadLine ());
170                         } catch (IOException) {
171                         }
172
173                         return(null);
174                 }
175
176                 public override string ReadToEnd()
177                 {
178                         try {
179                                 return(base.ReadToEnd ());
180                         } catch (IOException) {
181                         }
182
183                         return(null);
184                 }
185         }
186 }