diff --git a/CSharp/Libraries/UniversalEditor.Core/IO/Encoding.cs b/CSharp/Libraries/UniversalEditor.Core/IO/Encoding.cs index 4d9ef2bd..c81c5db6 100644 --- a/CSharp/Libraries/UniversalEditor.Core/IO/Encoding.cs +++ b/CSharp/Libraries/UniversalEditor.Core/IO/Encoding.cs @@ -92,7 +92,33 @@ namespace UniversalEditor.IO return GetChars(bytes, 0, bytes.Length); } public abstract char[] GetChars(byte[] bytes, int index, int count); - } + + public virtual int GetMaxByteCount(int count) + { + return count; + } + public virtual int GetMaxCharCount(int count) + { + return count; + } + public virtual int GetByteCount(char[] chars, int index, int count) + { + return 1; + } + public int GetByteCount(char value) + { + return GetByteCount(new char[] { value }, 0, 1); + } + public int GetByteCount(char[] chars) + { + return GetByteCount(chars, 0, chars.Length); + } + public int GetByteCount(string value) + { + char[] chars = value.ToCharArray(); + return GetByteCount(chars, 0, chars.Length); + } + } public class DefaultEncoding : Encoding { public override byte[] GetBytes(char[] chars, int index, int count) @@ -126,6 +152,18 @@ namespace UniversalEditor.IO { return _encoding.GetChars(bytes, index, count); } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } } public class UTF16BigEndianEncoding : Encoding { @@ -139,6 +177,18 @@ namespace UniversalEditor.IO { return _encoding.GetChars(bytes, index, count); } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } } public class UTF16LittleEndianEncoding : Encoding { @@ -152,6 +202,18 @@ namespace UniversalEditor.IO { return _encoding.GetChars(bytes, index, count); } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } } public class UTF32Encoding : Encoding { @@ -165,6 +227,18 @@ namespace UniversalEditor.IO { return _encoding.GetChars(bytes, index, count); } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } } public class UTF7Encoding : Encoding { @@ -178,6 +252,18 @@ namespace UniversalEditor.IO { return _encoding.GetChars(bytes, index, count); } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } } public class UTF8Encoding : Encoding { @@ -191,6 +277,18 @@ namespace UniversalEditor.IO { return _encoding.GetChars(bytes, index, count); } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } } public class ShiftJISEncoding : Encoding { @@ -204,5 +302,17 @@ namespace UniversalEditor.IO { return _encoding.GetChars(bytes, index, count); } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } } } \ No newline at end of file diff --git a/CSharp/Libraries/UniversalEditor.Core/IO/Reader.cs b/CSharp/Libraries/UniversalEditor.Core/IO/Reader.cs index 2d188122..c8fd4021 100644 --- a/CSharp/Libraries/UniversalEditor.Core/IO/Reader.cs +++ b/CSharp/Libraries/UniversalEditor.Core/IO/Reader.cs @@ -81,9 +81,31 @@ namespace UniversalEditor.IO { return ReadBytes(1)[0]; } + + string charBuffer = null; + int charBufferIndex = 0; + public char ReadChar() { - return (char)ReadByte(); + if (charBuffer == null) + { + int maxByteCount = mvarAccessor.DefaultEncoding.GetMaxByteCount(1); + byte[] bytes = PeekBytes(maxByteCount); + charBuffer = mvarAccessor.DefaultEncoding.GetString(bytes); + charBufferIndex = 0; + } + + char c = charBuffer[charBufferIndex]; + charBufferIndex++; + + int ct = mvarAccessor.DefaultEncoding.GetByteCount(c); + Seek(ct, SeekOrigin.Current); + + if (charBufferIndex + 1 > charBuffer.Length) + { + charBuffer = null; + } + return c; } public byte PeekByte() {