|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
#include <windows.h>
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
#include <string>
|
|
Packit |
c32a2d |
#include <vector>
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
#include <IIEP_FileIn.H>
|
|
Packit |
c32a2d |
#include <IIEP_Hash.H>
|
|
Packit |
c32a2d |
#include <IIEP_String.H>
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
struct MEM_FILE_IDX
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
MEM_FILE_IDX(void)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
m_dwID = 0;
|
|
Packit |
c32a2d |
m_dwLength = 0;
|
|
Packit |
c32a2d |
m_pucData = 0;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
DWORD m_dwID; // hash ID of filename
|
|
Packit |
c32a2d |
DWORD m_dwLength; // file length
|
|
Packit |
c32a2d |
PBYTE m_pucData; // memory pointer
|
|
Packit |
c32a2d |
};
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
static std::vector <MEM_FILE_IDX> s_vecMemFile;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: SearchMemFile()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
static std::vector <MEM_FILE_IDX> :: iterator SearchMemFile(PCWSTR pcwsFileName)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
DWORD dwID = IIEP::HashFNV_1a(pcwsFileName);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
std::vector <MEM_FILE_IDX>::iterator it;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
for (it = s_vecMemFile.begin(); it < s_vecMemFile.end(); it ++)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (it -> m_dwID == dwID) return it;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return s_vecMemFile.end();
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
static std::vector <MEM_FILE_IDX> :: iterator SearchMemFile(const char *pcszFileName)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
WORD wzNameBuffer[0x1000];
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
wzNameBuffer[0] = 0;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
IIEP::StringFromANSI(pcszFileName, wzNameBuffer, 0x1000);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return SearchMemFile(wzNameBuffer);
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: CreateMemoryFile()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
bool IIEP::CreateMemoryFile(PVOID pMemory, DWORD dwLength, PCWSTR pcwsFileName)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (0 == pcwsFileName || 0 == *pcwsFileName) return false;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
RemoveMemoryFile(pcwsFileName);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
DWORD dwID = IIEP::HashFNV_1a(pcwsFileName);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
MEM_FILE_IDX soIDX;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
soIDX.m_dwID = dwID;
|
|
Packit |
c32a2d |
soIDX.m_dwLength = dwLength;
|
|
Packit |
c32a2d |
soIDX.m_pucData = (PBYTE) pMemory;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
s_vecMemFile.push_back(soIDX);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
bool IIEP::CreateMemoryFile(PVOID pMemory, DWORD dwLength, const char *pcszFileName)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
WORD wzNameBuffer[0x1000];
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
wzNameBuffer[0] = 0;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
StringFromANSI(pcszFileName, wzNameBuffer, 0x1000);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return CreateMemoryFile(pMemory, dwLength, wzNameBuffer);
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: RemoveMemoryFile()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
bool IIEP::RemoveMemoryFile(PCWSTR pcwsFileName)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (0 == pcwsFileName || 0 == *pcwsFileName) return false;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
std::vector <MEM_FILE_IDX>::iterator it = SearchMemFile(pcwsFileName);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (it == s_vecMemFile.end()) return false;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
s_vecMemFile.erase(it);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
bool IIEP::RemoveMemoryFile(const char *pcszFileName)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
WORD wzNameBuffer[0x1000];
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
wzNameBuffer[0] = 0;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
StringFromANSI(pcszFileName, wzNameBuffer, 0x1000);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return RemoveMemoryFile(wzNameBuffer);
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
void IIEP::RemoveMemoryFile(void)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
s_vecMemFile.clear();
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: CFileIn()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
IIEP::CFileIn::CFileIn(void)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
m_pFile = 0;
|
|
Packit |
c32a2d |
m_pucMemData = 0;
|
|
Packit |
c32a2d |
m_dwLength = 0;
|
|
Packit |
c32a2d |
m_dwReadPos = 0;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: ~CFileIn()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
IIEP::CFileIn::~CFileIn(void)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
Close();
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: Open()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
bool IIEP::CFileIn::Open(const char *pcszFileName)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
WORD wzNameBuffer[0x1000];
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
wzNameBuffer[0] = 0;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
StringFromANSI(pcszFileName, wzNameBuffer, 0x1000);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return Open(wzNameBuffer);
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
bool IIEP::CFileIn::Open(const WORD *pcwsFileName)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
Close();
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (0 == pcwsFileName || 0 == *pcwsFileName) return false;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
std::vector <MEM_FILE_IDX>::iterator it = SearchMemFile(pcwsFileName);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (it == s_vecMemFile.end()) // not found in memory
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
m_pFile = _wfopen(pcwsFileName, L"rb");
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (m_pFile)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
return true; // found DOS file
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return false;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (s_vecMemFile.empty()) return false;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
m_pucMemData = it -> m_pucData;
|
|
Packit |
c32a2d |
m_dwLength = it -> m_dwLength;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: Close()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
void IIEP::CFileIn::Close(void)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (m_pFile)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
fclose(m_pFile);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
m_pFile = 0;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
m_pucMemData = 0;
|
|
Packit |
c32a2d |
m_dwLength = 0;
|
|
Packit |
c32a2d |
m_dwReadPos = 0;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: GetFileSize()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
DWORD IIEP::CFileIn::GetFileSize(void) const
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (m_pFile)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
DWORD dwPostion = ftell(m_pFile);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
fseek(m_pFile, 0, SEEK_END);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
DWORD dwFileSize = ftell(m_pFile);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
fseek(m_pFile, dwPostion, SEEK_SET);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return dwFileSize;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return m_dwLength;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: GetReadPosition()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
DWORD IIEP::CFileIn::GetReadPosition(void) const
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (m_pFile)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
return ftell(m_pFile);
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return m_dwReadPos;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: Seek()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
bool IIEP::CFileIn::Seek(long nOffset, long nOrigin)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (m_pFile)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
return (0 == fseek(m_pFile, nOffset, nOrigin));
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (m_pucMemData)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
switch (nOrigin)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
case SEEK_SET:
|
|
Packit |
c32a2d |
if (nOffset < 0 || nOffset >= (long) m_dwLength) return false;
|
|
Packit |
c32a2d |
m_dwReadPos = nOffset;
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
case SEEK_CUR:
|
|
Packit |
c32a2d |
nOffset += m_dwReadPos;
|
|
Packit |
c32a2d |
if (nOffset < 0 || nOffset >= (long) m_dwLength) return false;
|
|
Packit |
c32a2d |
m_dwReadPos = nOffset;
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
case SEEK_END:
|
|
Packit |
c32a2d |
ASSERT(nOffset <= 0); // 这个必须是负数
|
|
Packit |
c32a2d |
nOffset = m_dwLength - 1 + nOffset;
|
|
Packit |
c32a2d |
if (nOffset < 0 || nOffset >= (long) m_dwLength) return false;
|
|
Packit |
c32a2d |
m_dwReadPos = nOffset;
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return false;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: Read()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
DWORD IIEP::CFileIn::Read(PVOID pDataBuffer, DWORD dwReadSize)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (m_pFile)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
return (DWORD) fread(pDataBuffer, 1, dwReadSize, m_pFile);
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (m_pucMemData)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (m_dwReadPos + dwReadSize > m_dwLength) dwReadSize = m_dwLength - m_dwReadPos;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
memcpy(pDataBuffer, m_pucMemData + m_dwReadPos, dwReadSize);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
m_dwReadPos += dwReadSize;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return dwReadSize;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return 0;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: ReadAnsiLine()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
bool IIEP::CFileIn::ReadAnsiLine(std::string &strLine)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
BYTE ucChar = 0;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
strLine.clear();
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
while (ReadB(ucChar))
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (0x0D == ucChar)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
else
|
|
Packit |
c32a2d |
if (0x0A == ucChar)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
else
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
strLine.push_back(ucChar);
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (strLine.empty()) return false;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: ReadUnicodeLine()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
bool IIEP::CFileIn::ReadUnicodeLine(std::wstring &wstrLine, bool bBigEndian)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
WORD wChar = 0;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
wstrLine.clear();
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
while (bBigEndian ? ReadInverseW(wChar) : ReadW(wChar))
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (0x000D == wChar)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
else
|
|
Packit |
c32a2d |
if (0x000A == wChar)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
else
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
wstrLine.push_back(wChar);
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (wstrLine.empty()) return false;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: ReadAnsiString()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
bool IIEP::CFileIn::ReadAnsiString(char *pszBuffer, DWORD dwBufferLength)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
DWORD dwIndex = 0;
|
|
Packit |
c32a2d |
BYTE ucChar;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
while (ReadB(ucChar))
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (dwIndex >= dwBufferLength) return true;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
pszBuffer[dwIndex ++] = ucChar;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (0 == ucChar)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return false;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
// name: ReadUnicodeString()
|
|
Packit |
c32a2d |
// desc:
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
bool IIEP::CFileIn::ReadUnicodeString(WORD *pwzBuffer, DWORD dwBufferLength)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
DWORD dwIndex = 0;
|
|
Packit |
c32a2d |
WORD wChar;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
ReadInverseW(wChar);
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (wChar == 0xFFFE) // Unicode
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
while (ReadW(wChar))
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (dwIndex >= dwBufferLength) return true;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
pwzBuffer[dwIndex ++] = wChar;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (0 == wChar)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
else
|
|
Packit |
c32a2d |
if (wChar == 0xFEFF) // Unicode big endian
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
while (ReadInverseW(wChar))
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
if (dwIndex >= dwBufferLength) return true;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
pwzBuffer[dwIndex ++] = wChar;
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
if (0 == wChar)
|
|
Packit |
c32a2d |
{
|
|
Packit |
c32a2d |
return true;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
return false;
|
|
Packit |
c32a2d |
}
|
|
Packit |
c32a2d |
|
|
Packit |
c32a2d |
// ------------------------------------------------------------------------------------------------
|