-
Notifications
You must be signed in to change notification settings - Fork 0
/
CodecIO.cs
92 lines (83 loc) · 1.87 KB
/
CodecIO.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
using System;
using System.IO;
namespace TuckBytesInCode
{
public interface ICodecIO : IDisposable
{
int Read();
void Write(char c);
}
public class CodecIO : ICodecIO, IDisposable
{
public enum Mode { Read = 0, Write = 1 }
public CodecIO(Mode mode, string fileName, ICharLookup codec)
{
IOMode = mode;
if (mode == Mode.Read) {
Data = File.Open(fileName,FileMode.Open,FileAccess.Read,FileShare.Read);
if (!codec.TreatAsBinary) {
Reader = new StreamReader(Data);
}
}
else if (mode == Mode.Write) {
Data = File.Open(fileName,FileMode.Create,FileAccess.Write,FileShare.Read);
if (!codec.TreatAsBinary) {
Writer = new StreamWriter(Data);
}
}
}
public CodecIO(TextReader reader)
{
Reader = reader;
IOMode = Mode.Read;
}
public CodecIO(TextWriter writer)
{
Writer = writer;
IOMode = Mode.Write;
}
public int Read()
{
if (IOMode != Mode.Read) {
throw new InvalidOperationException("not in read mode");
}
int data;
if (Reader != null) {
data = Reader.Read();
} else {
data = Data.ReadByte();
}
// Log.Debug("IO Read "+data);
return data;
}
public void Write(char c)
{
if (IOMode != Mode.Write) {
throw new InvalidOperationException("not in write mode");
}
// Log.Debug("IO Write "+(int)c);
if (Writer != null) {
Writer.Write(c);
} else {
Data.WriteByte((byte)c);
}
}
public void Dispose()
{
if (Writer != null) {
Writer.Dispose();
}
if (Reader != null) {
Reader.Dispose();
}
//only need to dispose data if it was used on it's own
if (Writer == null && Reader == null && Data != null) {
Data.Dispose();
}
}
TextReader Reader = null;
TextWriter Writer = null;
FileStream Data = null;
Mode IOMode = Mode.Read;
}
}