[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); }
[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); }
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); } } }
[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); } } }