-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSStreamReader.cs
144 lines (126 loc) · 4.51 KB
/
SStreamReader.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using System;
using System.IO;
using System.Text;
namespace Monkeyspeak
{
[Serializable()]
public class SStreamReader : StreamReader
{
private long _position;
#region Constructors
public SStreamReader(Stream stream) : base(stream)
{
if (IsPreamble())
{
_position = this.CurrentEncoding.GetPreamble().Length;
}
}
public SStreamReader(Stream stream, bool detectEncodingFromByteOrderMarks) : base(stream, detectEncodingFromByteOrderMarks)
{
if (IsPreamble())
{
_position = this.CurrentEncoding.GetPreamble().Length;
}
}
public SStreamReader(Stream stream, Encoding encoding) : base(stream, encoding)
{
if (IsPreamble())
{
_position = this.CurrentEncoding.GetPreamble().Length;
}
}
public SStreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks) : base(stream, encoding, detectEncodingFromByteOrderMarks)
{
}
public SStreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize) : base(stream, encoding, detectEncodingFromByteOrderMarks, bufferSize)
{
}
public SStreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen) : base(stream, encoding, detectEncodingFromByteOrderMarks, bufferSize, leaveOpen)
{
}
public SStreamReader(string path) : base(path)
{
if (IsPreamble())
{
_position = this.CurrentEncoding.GetPreamble().Length;
}
}
public SStreamReader(string path, bool detectEncodingFromByteOrderMarks) : base(path, detectEncodingFromByteOrderMarks)
{
if (IsPreamble())
{
_position = this.CurrentEncoding.GetPreamble().Length;
}
}
public SStreamReader(string path, Encoding encoding) : base(path, encoding)
{
if (IsPreamble())
{
_position = this.CurrentEncoding.GetPreamble().Length;
}
}
public SStreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks) : base(path, encoding, detectEncodingFromByteOrderMarks)
{
if (IsPreamble())
{
_position = this.CurrentEncoding.GetPreamble().Length;
}
}
public SStreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize) : base(path, encoding, detectEncodingFromByteOrderMarks, bufferSize)
{
if (IsPreamble())
{
_position = this.CurrentEncoding.GetPreamble().Length;
}
}
#endregion Constructors
/// <summary>
/// Encoding can really haven't preamble
/// </summary>
public bool IsPreamble()
{
byte[] preamble = this.CurrentEncoding.GetPreamble();
bool res = true;
for (int i = 0; i < preamble.Length; i++)
{
int dd = base.BaseStream.ReadByte();
if (preamble[i] != dd)
{
res = false;
break;
}
}
Position = 0;
return res;
}
/// <summary>
/// Use this property for get and set real position in file.
/// Position in BaseStream can be not right.
/// </summary>
public long Position
{
get { return _position; }
set
{
_position = base.BaseStream.Seek(value, SeekOrigin.Begin);
this.DiscardBufferedData();
}
}
public override int Read()
{
var ch = base.Read();
_position += CurrentEncoding.GetByteCount(new char[] { (char)ch });
return ch;
}
public override string ReadLine()
{
string line = base.ReadLine();
if (line != null)
{
_position += CurrentEncoding.GetByteCount(line);
}
_position += CurrentEncoding.GetByteCount(Environment.NewLine);
return line;
}
}
}