Esempio n. 1
0
 private static void ReadBlockEntry(BinaryReader reader, out UnicodeBlock value)
 => value = new UnicodeBlock(new UnicodeCodePointRange(ReadCodePoint(reader), ReadCodePoint(reader)), reader.ReadString());
Esempio n. 2
0
        internal static void ReadFromStream(Stream stream, out Version unicodeVersion, out UnicodeCharacterData[] unicodeCharacterData, out UnihanCharacterData[] unihanCharacterData, out CjkRadicalData[] radicals, out UnicodeBlock[] blocks, out int maxContiguousIndex)
        {
            using (var reader = new BinaryReader(stream, Encoding.UTF8))
            {
                int i;

                if (reader.ReadByte() != 'U'
                    | reader.ReadByte() != 'C'
                    | reader.ReadByte() != 'D')
                {
                    throw new InvalidDataException();
                }

                byte formatVersion = reader.ReadByte();

                if (formatVersion != 2)
                {
                    throw new InvalidDataException();
                }

                var fileUnicodeVersion = new Version(reader.ReadUInt16(), reader.ReadByte(), reader.ReadByte());

                var    unicodeCharacterDataEntries = new UnicodeCharacterData[ReadCodePoint(reader)];              // Allocate one extra entry to act as a dummy entry.
                byte[] nameBuffer = new byte[128];
                int    mci        = 0;

                for (i = 0; i < unicodeCharacterDataEntries.Length; ++i)
                {
                    ReadUnicodeCharacterDataEntry(reader, nameBuffer, out unicodeCharacterDataEntries[i]);
                    if (unicodeCharacterDataEntries[i].CodePointRange.Contains(i))
                    {
                        mci = i;
                    }
                    else
                    {
                        ++i;
                        break;
                    }
                }

                maxContiguousIndex = mci;

                for (; i < unicodeCharacterDataEntries.Length; ++i)
                {
                    ReadUnicodeCharacterDataEntry(reader, nameBuffer, out unicodeCharacterDataEntries[i]);
                }

                var blockEntries = new UnicodeBlock[reader.ReadUInt16()];

                for (i = 0; i < blockEntries.Length; ++i)
                {
                    ReadBlockEntry(reader, out blockEntries[i]);
                }

                var cjkRadicalEntries = new CjkRadicalData[reader.ReadByte()];

                for (i = 0; i < cjkRadicalEntries.Length; ++i)
                {
                    ReadCjkRadicalInfo(reader, out cjkRadicalEntries[i]);
                }

                var unihanCharacterDataEntries = new UnihanCharacterData[ReadCodePoint(reader)];

                for (i = 0; i < unihanCharacterDataEntries.Length; ++i)
                {
                    ReadUnihanCharacterDataEntry(reader, out unihanCharacterDataEntries[i]);
                }

                unicodeVersion       = fileUnicodeVersion;
                unicodeCharacterData = unicodeCharacterDataEntries;
                unihanCharacterData  = unihanCharacterDataEntries;
                radicals             = cjkRadicalEntries;
                blocks = blockEntries;
            }
        }
Esempio n. 3
0
        public static UnicodeData ReadFromStream(Stream stream)
        {
            using (var reader = new BinaryReader(stream, Encoding.UTF8))
            {
                int i;

                if (reader.ReadByte() != 'U'
                    | reader.ReadByte() != 'C'
                    | reader.ReadByte() != 'D')
                {
                    throw new InvalidDataException();
                }

                byte formatVersion = reader.ReadByte();

                if (formatVersion != 2)
                {
                    throw new InvalidDataException();
                }

                var fileUnicodeVersion = new Version(reader.ReadUInt16(), reader.ReadByte(), reader.ReadByte());

                var    unicodeCharacterDataEntries = new UnicodeCharacterData[ReadCodePoint(reader)];              // Allocate one extra entry to act as a dummy entry.
                byte[] nameBuffer         = new byte[128];
                int    maxContiguousIndex = 0;

                for (i = 0; i < unicodeCharacterDataEntries.Length; ++i)
                {
                    ReadUnicodeCharacterDataEntry(reader, nameBuffer, out unicodeCharacterDataEntries[i]);
                    if (unicodeCharacterDataEntries[i].CodePointRange.Contains(i))
                    {
                        maxContiguousIndex = i;
                    }
                    else
                    {
                        ++i;
                        break;
                    }
                }

                for (; i < unicodeCharacterDataEntries.Length; ++i)
                {
                    ReadUnicodeCharacterDataEntry(reader, nameBuffer, out unicodeCharacterDataEntries[i]);
                }

                var blockEntries = new UnicodeBlock[reader.ReadUInt16()];

                for (i = 0; i < blockEntries.Length; ++i)
                {
                    ReadBlockEntry(reader, out blockEntries[i]);
                }

                var cjkRadicalEntries = new CjkRadicalData[reader.ReadByte()];

                for (i = 0; i < cjkRadicalEntries.Length; ++i)
                {
                    ReadCjkRadicalInfo(reader, out cjkRadicalEntries[i]);
                }

                var unihanCharacterDataEntries = new UnihanCharacterData[ReadCodePoint(reader)];

                for (i = 0; i < unihanCharacterDataEntries.Length; ++i)
                {
                    ReadUnihanCharacterDataEntry(reader, out unihanCharacterDataEntries[i]);
                }

                return(new UnicodeData
                       (
                           fileUnicodeVersion,
                           unicodeCharacterDataEntries,
                           unihanCharacterDataEntries,
                           blockEntries,
                           cjkRadicalEntries,
                           maxContiguousIndex
                       ));
            }
        }