Blame ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP

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
// ------------------------------------------------------------------------------------------------