From 205187b561c3b31fa931e73e8f7263f0c4b1de41 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Thu, 15 Jun 2017 13:24:25 -0700 Subject: Rename `CoreLib::*` to `Slang` Getting rid of more namespace complexity and stripping things down to the basics. This also gets rid of some dead code in the "core" library. --- source/core/text-io.cpp | 511 ++++++++++++++++++++++++------------------------ 1 file changed, 253 insertions(+), 258 deletions(-) (limited to 'source/core/text-io.cpp') diff --git a/source/core/text-io.cpp b/source/core/text-io.cpp index cf75c4762..3e5013cf3 100644 --- a/source/core/text-io.cpp +++ b/source/core/text-io.cpp @@ -8,337 +8,332 @@ #define CONVERT_END_OF_LINE #endif -namespace CoreLib +namespace Slang { - namespace IO + class Utf8Encoding : public Encoding { - using namespace CoreLib::Basic; - - class Utf8Encoding : public Encoding + public: + virtual void GetBytes(List & result, const String & str) override { - public: - virtual void GetBytes(List & result, const String & str) override - { - result.AddRange(str.Buffer(), str.Length()); - } - virtual String ToString(const char * bytes, int /*length*/) override - { - return String(bytes); - } - }; + result.AddRange(str.Buffer(), str.Length()); + } + virtual String ToString(const char * bytes, int /*length*/) override + { + return String(bytes); + } + }; - class Utf32Encoding : public Encoding + class Utf32Encoding : public Encoding + { + public: + virtual void GetBytes(List & result, const String & str) override { - public: - virtual void GetBytes(List & result, const String & str) override + int ptr = 0; + while (ptr < str.Length()) { - int ptr = 0; - while (ptr < str.Length()) + int codePoint = GetUnicodePointFromUTF8([&](int) { - int codePoint = GetUnicodePointFromUTF8([&](int) - { - if (ptr < str.Length()) - return str[ptr++]; - else - return '\0'; - }); - result.AddRange((char*)&codePoint, 4); - } + if (ptr < str.Length()) + return str[ptr++]; + else + return '\0'; + }); + result.AddRange((char*)&codePoint, 4); } - virtual String ToString(const char * bytes, int length) override + } + virtual String ToString(const char * bytes, int length) override + { + StringBuilder sb; + int * content = (int*)bytes; + for (int i = 0; i < (length >> 2); i++) { - StringBuilder sb; - int * content = (int*)bytes; - for (int i = 0; i < (length >> 2); i++) - { - char buf[5]; - int count = EncodeUnicodePointToUTF8(buf, content[i]); - for (int j = 0; j < count; j++) - sb.Append(buf[j]); - } - return sb.ProduceString(); + char buf[5]; + int count = EncodeUnicodePointToUTF8(buf, content[i]); + for (int j = 0; j < count; j++) + sb.Append(buf[j]); } - }; + return sb.ProduceString(); + } + }; - class Utf16Encoding : public Encoding //UTF16 + class Utf16Encoding : public Encoding //UTF16 + { + private: + bool reverseOrder = false; + public: + Utf16Encoding(bool pReverseOrder) + : reverseOrder(pReverseOrder) + {} + virtual void GetBytes(List & result, const String & str) override { - private: - bool reverseOrder = false; - public: - Utf16Encoding(bool pReverseOrder) - : reverseOrder(pReverseOrder) - {} - virtual void GetBytes(List & result, const String & str) override + int ptr = 0; + while (ptr < str.Length()) { - int ptr = 0; - while (ptr < str.Length()) + int codePoint = GetUnicodePointFromUTF8([&](int) { - int codePoint = GetUnicodePointFromUTF8([&](int) - { - if (ptr < str.Length()) - return str[ptr++]; - else - return '\0'; - }); - unsigned short buffer[2]; - int count; - if (!reverseOrder) - count = EncodeUnicodePointToUTF16(buffer, codePoint); + if (ptr < str.Length()) + return str[ptr++]; else - count = EncodeUnicodePointToUTF16Reversed(buffer, codePoint); - result.AddRange((char*)buffer, count * 2); - } + return '\0'; + }); + unsigned short buffer[2]; + int count; + if (!reverseOrder) + count = EncodeUnicodePointToUTF16(buffer, codePoint); + else + count = EncodeUnicodePointToUTF16Reversed(buffer, codePoint); + result.AddRange((char*)buffer, count * 2); } - virtual String ToString(const char * bytes, int length) override + } + virtual String ToString(const char * bytes, int length) override + { + int ptr = 0; + StringBuilder sb; + while (ptr < length) { - int ptr = 0; - StringBuilder sb; - while (ptr < length) + int codePoint = GetUnicodePointFromUTF16([&](int) { - int codePoint = GetUnicodePointFromUTF16([&](int) - { - if (ptr < length) - return bytes[ptr++]; - else - return '\0'; - }); - char buf[5]; - int count = EncodeUnicodePointToUTF8(buf, codePoint); - for (int i = 0; i < count; i++) - sb.Append(buf[i]); - } - return sb.ProduceString(); + if (ptr < length) + return bytes[ptr++]; + else + return '\0'; + }); + char buf[5]; + int count = EncodeUnicodePointToUTF8(buf, codePoint); + for (int i = 0; i < count; i++) + sb.Append(buf[i]); } - }; + return sb.ProduceString(); + } + }; - Utf8Encoding __utf8Encoding; - Utf16Encoding __utf16Encoding(false); - Utf16Encoding __utf16EncodingReversed(true); - Utf32Encoding __utf32Encoding; + Utf8Encoding __utf8Encoding; + Utf16Encoding __utf16Encoding(false); + Utf16Encoding __utf16EncodingReversed(true); + Utf32Encoding __utf32Encoding; - Encoding * Encoding::UTF8 = &__utf8Encoding; - Encoding * Encoding::UTF16 = &__utf16Encoding; - Encoding * Encoding::UTF16Reversed = &__utf16EncodingReversed; - Encoding * Encoding::UTF32 = &__utf32Encoding; + Encoding * Encoding::UTF8 = &__utf8Encoding; + Encoding * Encoding::UTF16 = &__utf16Encoding; + Encoding * Encoding::UTF16Reversed = &__utf16EncodingReversed; + Encoding * Encoding::UTF32 = &__utf32Encoding; - const unsigned short Utf16Header = 0xFEFF; - const unsigned short Utf16ReversedHeader = 0xFFFE; + const unsigned short Utf16Header = 0xFEFF; + const unsigned short Utf16ReversedHeader = 0xFFFE; - StreamWriter::StreamWriter(const String & path, Encoding * encoding) + StreamWriter::StreamWriter(const String & path, Encoding * encoding) + { + this->stream = new FileStream(path, FileMode::Create); + this->encoding = encoding; + if (encoding == Encoding::UTF16) { - this->stream = new FileStream(path, FileMode::Create); - this->encoding = encoding; - if (encoding == Encoding::UTF16) - { - this->stream->Write(&Utf16Header, 2); - } - else if (encoding == Encoding::UTF16Reversed) - { - this->stream->Write(&Utf16ReversedHeader, 2); - } + this->stream->Write(&Utf16Header, 2); } - StreamWriter::StreamWriter(RefPtr stream, Encoding * encoding) + else if (encoding == Encoding::UTF16Reversed) { - this->stream = stream; - this->encoding = encoding; - if (encoding == Encoding::UTF16) - { - this->stream->Write(&Utf16Header, 2); - } - else if (encoding == Encoding::UTF16Reversed) - { - this->stream->Write(&Utf16ReversedHeader, 2); - } + this->stream->Write(&Utf16ReversedHeader, 2); } - void StreamWriter::Write(const String & str) + } + StreamWriter::StreamWriter(RefPtr stream, Encoding * encoding) + { + this->stream = stream; + this->encoding = encoding; + if (encoding == Encoding::UTF16) { - encodingBuffer.Clear(); - StringBuilder sb; - String newLine; + this->stream->Write(&Utf16Header, 2); + } + else if (encoding == Encoding::UTF16Reversed) + { + this->stream->Write(&Utf16ReversedHeader, 2); + } + } + void StreamWriter::Write(const String & str) + { + encodingBuffer.Clear(); + StringBuilder sb; + String newLine; #ifdef _WIN32 - newLine = "\r\n"; + newLine = "\r\n"; #else - newLine = "\n"; + newLine = "\n"; #endif - for (int i = 0; i < str.Length(); i++) + for (int i = 0; i < str.Length(); i++) + { + if (str[i] == '\r') + sb << newLine; + else if (str[i] == '\n') { - if (str[i] == '\r') + if (i > 0 && str[i - 1] != '\r') sb << newLine; - else if (str[i] == '\n') - { - if (i > 0 && str[i - 1] != '\r') - sb << newLine; - } - else - sb << str[i]; } - encoding->GetBytes(encodingBuffer, sb.ProduceString()); - stream->Write(encodingBuffer.Buffer(), encodingBuffer.Count()); + else + sb << str[i]; } - void StreamWriter::Write(const char * str) + encoding->GetBytes(encodingBuffer, sb.ProduceString()); + stream->Write(encodingBuffer.Buffer(), encodingBuffer.Count()); + } + void StreamWriter::Write(const char * str) + { + Write(String(str)); + } + + StreamReader::StreamReader(const String & path) + { + stream = new FileStream(path, FileMode::Open); + ReadBuffer(); + encoding = DetermineEncoding(); + if (encoding == 0) + encoding = Encoding::UTF8; + } + StreamReader::StreamReader(RefPtr stream, Encoding * encoding) + { + this->stream = stream; + this->encoding = encoding; + ReadBuffer(); + auto determinedEncoding = DetermineEncoding(); + if (this->encoding == nullptr) + this->encoding = determinedEncoding; + } + + Encoding * StreamReader::DetermineEncoding() + { + if (buffer.Count() >= 3 && (unsigned char)(buffer[0]) == 0xEF && (unsigned char)(buffer[1]) == 0xBB && (unsigned char)(buffer[2]) == 0xBF) { - Write(String(str)); + ptr += 3; + return Encoding::UTF8; } - - StreamReader::StreamReader(const String & path) + else if (*((unsigned short*)(buffer.Buffer())) == 0xFEFF) { - stream = new FileStream(path, FileMode::Open); - ReadBuffer(); - encoding = DetermineEncoding(); - if (encoding == 0) - encoding = Encoding::UTF8; + ptr += 2; + return Encoding::UTF16; } - StreamReader::StreamReader(RefPtr stream, Encoding * encoding) + else if (*((unsigned short*)(buffer.Buffer())) == 0xFFFE) { - this->stream = stream; - this->encoding = encoding; - ReadBuffer(); - auto determinedEncoding = DetermineEncoding(); - if (this->encoding == nullptr) - this->encoding = determinedEncoding; + ptr += 2; + return Encoding::UTF16Reversed; } - - Encoding * StreamReader::DetermineEncoding() + else { - if (buffer.Count() >= 3 && (unsigned char)(buffer[0]) == 0xEF && (unsigned char)(buffer[1]) == 0xBB && (unsigned char)(buffer[2]) == 0xBF) - { - ptr += 3; - return Encoding::UTF8; - } - else if (*((unsigned short*)(buffer.Buffer())) == 0xFEFF) - { - ptr += 2; - return Encoding::UTF16; - } - else if (*((unsigned short*)(buffer.Buffer())) == 0xFFFE) +#ifdef _WIN32 + int flag = IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_REVERSE_SIGNATURE | IS_TEXT_UNICODE_STATISTICS | IS_TEXT_UNICODE_ASCII16; + int rs = IsTextUnicode(buffer.Buffer(), buffer.Count(), &flag); + if (rs) { - ptr += 2; - return Encoding::UTF16Reversed; + if (flag & (IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_STATISTICS)) + return Encoding::UTF16; + else if (flag & (IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_STATISTICS)) + return Encoding::UTF16Reversed; + else if (flag & IS_TEXT_UNICODE_ASCII16) + return Encoding::UTF8; } - else - { -#ifdef _WIN32 - int flag = IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_REVERSE_SIGNATURE | IS_TEXT_UNICODE_STATISTICS | IS_TEXT_UNICODE_ASCII16; - int rs = IsTextUnicode(buffer.Buffer(), buffer.Count(), &flag); - if (rs) - { - if (flag & (IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_STATISTICS)) - return Encoding::UTF16; - else if (flag & (IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_STATISTICS)) - return Encoding::UTF16Reversed; - else if (flag & IS_TEXT_UNICODE_ASCII16) - return Encoding::UTF8; - } #endif - return Encoding::UTF8; - } + return Encoding::UTF8; } + } - void StreamReader::ReadBuffer() + void StreamReader::ReadBuffer() + { + buffer.SetSize(4096); + auto len = stream->Read(buffer.Buffer(), buffer.Count()); + buffer.SetSize((int)len); + ptr = 0; + } + + char StreamReader::ReadBufferChar() + { + if (ptrRead(buffer.Buffer(), buffer.Count()); - buffer.SetSize((int)len); - ptr = 0; + return buffer[ptr++]; } - - char StreamReader::ReadBufferChar() + if (!stream->IsEnd()) + ReadBuffer(); + if (ptrIsEnd()) - ReadBuffer(); - if (ptr