Example #1
0
        [System.Security.SecurityCritical]  // auto-generated
        private unsafe bool FindCodePage(int codePage)
        {
            Debug.Assert(m_codePageHeader != null && m_codePageHeader.Length == CODEPAGE_HEADER_SIZE, "m_codePageHeader expected to match in size the struct CodePageHeader");

            // Loop through all of the m_pCodePageIndex[] items to find our code page
            byte[] codePageIndex = new byte[sizeof(CodePageIndex)];

            lock (s_streamLock)
            {
                // seek to the first CodePageIndex entry
                s_codePagesEncodingDataStream.Seek(CODEPAGE_DATA_FILE_HEADER_SIZE, SeekOrigin.Begin);

                int codePagesCount;
                fixed(byte *pBytes = &s_codePagesDataHeader[0])
                {
                    CodePageDataFileHeader *pDataHeader = (CodePageDataFileHeader *)pBytes;

                    codePagesCount = pDataHeader->CodePageCount;
                }

                fixed(byte *pBytes = &codePageIndex[0])
                {
                    CodePageIndex *pCodePageIndex = (CodePageIndex *)pBytes;

                    for (int i = 0; i < codePagesCount; i++)
                    {
                        s_codePagesEncodingDataStream.Read(codePageIndex, 0, codePageIndex.Length);

                        if (pCodePageIndex->CodePage == codePage)
                        {
                            // Found it!
                            long position = s_codePagesEncodingDataStream.Position;
                            s_codePagesEncodingDataStream.Seek((long)pCodePageIndex->Offset, SeekOrigin.Begin);
                            s_codePagesEncodingDataStream.Read(m_codePageHeader, 0, m_codePageHeader.Length);
                            m_firstDataWordOffset = (int)s_codePagesEncodingDataStream.Position; // stream now pointing to the codepage data

                            if (i == codePagesCount - 1)                                         // last codepage
                            {
                                m_dataSize = (int)(s_codePagesEncodingDataStream.Length - pCodePageIndex->Offset - m_codePageHeader.Length);
                            }
                            else
                            {
                                // Read Next codepage data to get the offset and then calculate the size
                                s_codePagesEncodingDataStream.Seek(position, SeekOrigin.Begin);
                                int currentOffset = pCodePageIndex->Offset;
                                s_codePagesEncodingDataStream.Read(codePageIndex, 0, codePageIndex.Length);
                                m_dataSize = pCodePageIndex->Offset - currentOffset - m_codePageHeader.Length;
                            }

                            return(true);
                        }
                    }
                }
            }

            // Couldn't find it
            return(false);
        }
 private static unsafe CodePageHeader *FindCodePage(int codePage)
 {
     for (int i = 0; i < m_pCodePageFileHeader.CodePageCount; i++)
     {
         CodePageIndex *indexPtr = &m_pCodePageFileHeader.CodePages + i;
         if (indexPtr->CodePage == codePage)
         {
             return((CodePageHeader *)(m_pCodePageFileHeader + indexPtr->Offset));
         }
     }
     return(null);
 }
Example #3
0
        [System.Security.SecurityCritical]  // auto-generated
        private static unsafe CodePageHeader *FindCodePage(int codePage)
        {
            // We'll have to loop through all of the m_pCodePageIndex[] items to find our code page, this isn't
            // binary or anything so its not monsterously fast.
            for (int i = 0; i < m_pCodePageFileHeader->CodePageCount; i++)
            {
                CodePageIndex *pCodePageIndex = (&(m_pCodePageFileHeader->CodePages)) + i;

                if (pCodePageIndex->CodePage == codePage)
                {
                    // Found it!
                    CodePageHeader *pCodePage =
                        (CodePageHeader *)((byte *)m_pCodePageFileHeader + pCodePageIndex->Offset);
                    return(pCodePage);
                }
            }

            // Couldn't find it
            return(null);
        }
Example #4
0
        internal static unsafe void ReadCodePageIndex(Stream stream, Span <byte> codePageIndex)
        {
            stream.Read(codePageIndex);
            if (!BitConverter.IsLittleEndian)
            {
                fixed(byte *pBytes = &codePageIndex[0])
                {
                    CodePageIndex *p             = (CodePageIndex *)pBytes;
                    char *         pCodePageName = &p->CodePageName;

                    for (int i = 0; i < 16; i++)
                    {
                        pCodePageName[i] = (char)BinaryPrimitives.ReverseEndianness((ushort)pCodePageName[i]);
                    }
                    p->CodePage  = BinaryPrimitives.ReverseEndianness(p->CodePage);
                    p->ByteCount = BinaryPrimitives.ReverseEndianness(p->ByteCount);
                    p->Offset    = BinaryPrimitives.ReverseEndianness(p->Offset);
                }
            }
        }
Example #5
0
        [System.Security.SecurityCritical]  // auto-generated
        internal static unsafe int GetCodePageByteSize(int codePage)
        {
            // Loop through all of the m_pCodePageIndex[] items to find our code page
            byte[] codePageIndex = new byte[sizeof(CodePageIndex)];

            lock (s_streamLock)
            {
                // seek to the first CodePageIndex entry
                s_codePagesEncodingDataStream.Seek(CODEPAGE_DATA_FILE_HEADER_SIZE, SeekOrigin.Begin);

                int codePagesCount;
                fixed(byte *pBytes = &s_codePagesDataHeader[0])
                {
                    CodePageDataFileHeader *pDataHeader = (CodePageDataFileHeader *)pBytes;

                    codePagesCount = pDataHeader->CodePageCount;
                }

                fixed(byte *pBytes = &codePageIndex[0])
                {
                    CodePageIndex *pCodePageIndex = (CodePageIndex *)pBytes;

                    for (int i = 0; i < codePagesCount; i++)
                    {
                        s_codePagesEncodingDataStream.Read(codePageIndex, 0, codePageIndex.Length);

                        if (pCodePageIndex->CodePage == codePage)
                        {
                            Debug.Assert(pCodePageIndex->ByteCount == 1 || pCodePageIndex->ByteCount == 2,
                                         "[BaseCodePageEncoding] Code page (" + codePage + ") has invalid byte size (" + pCodePageIndex->ByteCount + ") in table");
                            // Return what it says for byte count
                            return(pCodePageIndex->ByteCount);
                        }
                    }
                }
            }

            // Couldn't find it
            return(0);
        }
        private static unsafe void ReadCodePageIndex(Stream stream, Span <byte> codePageIndex)
        {
            Debug.Assert(stream is UnmanagedMemoryStream, "UnmanagedMemoryStream will read a full buffer on one call to Read.");
            int bytesRead = stream.Read(codePageIndex);

            Debug.Assert(bytesRead == codePageIndex.Length);

            if (!BitConverter.IsLittleEndian)
            {
                fixed(byte *pBytes = &codePageIndex[0])
                {
                    CodePageIndex *p             = (CodePageIndex *)pBytes;
                    char *         pCodePageName = &p->CodePageName;

                    for (int i = 0; i < 16; i++)
                    {
                        pCodePageName[i] = (char)BinaryPrimitives.ReverseEndianness((ushort)pCodePageName[i]);
                    }
                    p->CodePage  = BinaryPrimitives.ReverseEndianness(p->CodePage);
                    p->ByteCount = BinaryPrimitives.ReverseEndianness(p->ByteCount);
                    p->Offset    = BinaryPrimitives.ReverseEndianness(p->Offset);
                }
            }
        }