aboutsummaryrefslogtreecommitdiff
path: root/ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP
diff options
context:
space:
mode:
Diffstat (limited to 'ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP')
-rw-r--r--ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP462
1 files changed, 462 insertions, 0 deletions
diff --git a/ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP b/ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP
new file mode 100644
index 0000000..aa0445e
--- /dev/null
+++ b/ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP
@@ -0,0 +1,462 @@
+// ------------------------------------------------------------------------------------------------
+
+#include <windows.h>
+
+#include <string>
+#include <vector>
+
+#include <IIEP_FileIn.H>
+#include <IIEP_Hash.H>
+#include <IIEP_String.H>
+
+// ------------------------------------------------------------------------------------------------
+
+struct MEM_FILE_IDX
+{
+ MEM_FILE_IDX(void)
+ {
+ m_dwID = 0;
+ m_dwLength = 0;
+ m_pucData = 0;
+ }
+
+ DWORD m_dwID; // hash ID of filename
+ DWORD m_dwLength; // file length
+ PBYTE m_pucData; // memory pointer
+};
+
+static std::vector <MEM_FILE_IDX> s_vecMemFile;
+
+// ------------------------------------------------------------------------------------------------
+// name: SearchMemFile()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+static std::vector <MEM_FILE_IDX> :: iterator SearchMemFile(PCWSTR pcwsFileName)
+{
+ DWORD dwID = IIEP::HashFNV_1a(pcwsFileName);
+
+ std::vector <MEM_FILE_IDX>::iterator it;
+
+ for (it = s_vecMemFile.begin(); it < s_vecMemFile.end(); it ++)
+ {
+ if (it -> m_dwID == dwID) return it;
+ }
+
+ return s_vecMemFile.end();
+}
+
+// ------------------------------------------------------------------------------------------------
+
+static std::vector <MEM_FILE_IDX> :: iterator SearchMemFile(const char *pcszFileName)
+{
+ WORD wzNameBuffer[0x1000];
+
+ wzNameBuffer[0] = 0;
+
+ IIEP::StringFromANSI(pcszFileName, wzNameBuffer, 0x1000);
+
+ return SearchMemFile(wzNameBuffer);
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: CreateMemoryFile()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+bool IIEP::CreateMemoryFile(PVOID pMemory, DWORD dwLength, PCWSTR pcwsFileName)
+{
+ if (0 == pcwsFileName || 0 == *pcwsFileName) return false;
+
+ RemoveMemoryFile(pcwsFileName);
+
+ DWORD dwID = IIEP::HashFNV_1a(pcwsFileName);
+
+ MEM_FILE_IDX soIDX;
+
+ soIDX.m_dwID = dwID;
+ soIDX.m_dwLength = dwLength;
+ soIDX.m_pucData = (PBYTE) pMemory;
+
+ s_vecMemFile.push_back(soIDX);
+
+ return true;
+}
+
+// ------------------------------------------------------------------------------------------------
+
+bool IIEP::CreateMemoryFile(PVOID pMemory, DWORD dwLength, const char *pcszFileName)
+{
+ WORD wzNameBuffer[0x1000];
+
+ wzNameBuffer[0] = 0;
+
+ StringFromANSI(pcszFileName, wzNameBuffer, 0x1000);
+
+ return CreateMemoryFile(pMemory, dwLength, wzNameBuffer);
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: RemoveMemoryFile()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+bool IIEP::RemoveMemoryFile(PCWSTR pcwsFileName)
+{
+ if (0 == pcwsFileName || 0 == *pcwsFileName) return false;
+
+ std::vector <MEM_FILE_IDX>::iterator it = SearchMemFile(pcwsFileName);
+
+ if (it == s_vecMemFile.end()) return false;
+
+ s_vecMemFile.erase(it);
+
+ return true;
+}
+
+// ------------------------------------------------------------------------------------------------
+
+bool IIEP::RemoveMemoryFile(const char *pcszFileName)
+{
+ WORD wzNameBuffer[0x1000];
+
+ wzNameBuffer[0] = 0;
+
+ StringFromANSI(pcszFileName, wzNameBuffer, 0x1000);
+
+ return RemoveMemoryFile(wzNameBuffer);
+}
+
+// ------------------------------------------------------------------------------------------------
+
+void IIEP::RemoveMemoryFile(void)
+{
+ s_vecMemFile.clear();
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: CFileIn()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+IIEP::CFileIn::CFileIn(void)
+{
+ m_pFile = 0;
+ m_pucMemData = 0;
+ m_dwLength = 0;
+ m_dwReadPos = 0;
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: ~CFileIn()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+IIEP::CFileIn::~CFileIn(void)
+{
+ Close();
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: Open()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+bool IIEP::CFileIn::Open(const char *pcszFileName)
+{
+ WORD wzNameBuffer[0x1000];
+
+ wzNameBuffer[0] = 0;
+
+ StringFromANSI(pcszFileName, wzNameBuffer, 0x1000);
+
+ return Open(wzNameBuffer);
+}
+
+// ------------------------------------------------------------------------------------------------
+
+bool IIEP::CFileIn::Open(const WORD *pcwsFileName)
+{
+ Close();
+
+ if (0 == pcwsFileName || 0 == *pcwsFileName) return false;
+
+ std::vector <MEM_FILE_IDX>::iterator it = SearchMemFile(pcwsFileName);
+
+ if (it == s_vecMemFile.end()) // not found in memory
+ {
+ m_pFile = _wfopen(pcwsFileName, L"rb");
+
+ if (m_pFile)
+ {
+ return true; // found DOS file
+ }
+
+ return false;
+ }
+
+ if (s_vecMemFile.empty()) return false;
+
+ m_pucMemData = it -> m_pucData;
+ m_dwLength = it -> m_dwLength;
+
+ return true;
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: Close()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+void IIEP::CFileIn::Close(void)
+{
+ if (m_pFile)
+ {
+ fclose(m_pFile);
+
+ m_pFile = 0;
+ }
+
+ m_pucMemData = 0;
+ m_dwLength = 0;
+ m_dwReadPos = 0;
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: GetFileSize()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+DWORD IIEP::CFileIn::GetFileSize(void) const
+{
+ if (m_pFile)
+ {
+ DWORD dwPostion = ftell(m_pFile);
+
+ fseek(m_pFile, 0, SEEK_END);
+
+ DWORD dwFileSize = ftell(m_pFile);
+
+ fseek(m_pFile, dwPostion, SEEK_SET);
+
+ return dwFileSize;
+ }
+
+ return m_dwLength;
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: GetReadPosition()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+DWORD IIEP::CFileIn::GetReadPosition(void) const
+{
+ if (m_pFile)
+ {
+ return ftell(m_pFile);
+ }
+
+ return m_dwReadPos;
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: Seek()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+bool IIEP::CFileIn::Seek(long nOffset, long nOrigin)
+{
+ if (m_pFile)
+ {
+ return (0 == fseek(m_pFile, nOffset, nOrigin));
+ }
+
+ if (m_pucMemData)
+ {
+ switch (nOrigin)
+ {
+ case SEEK_SET:
+ if (nOffset < 0 || nOffset >= (long) m_dwLength) return false;
+ m_dwReadPos = nOffset;
+ return true;
+
+ case SEEK_CUR:
+ nOffset += m_dwReadPos;
+ if (nOffset < 0 || nOffset >= (long) m_dwLength) return false;
+ m_dwReadPos = nOffset;
+ return true;
+
+ case SEEK_END:
+ ASSERT(nOffset <= 0); // 这个必须是负数
+ nOffset = m_dwLength - 1 + nOffset;
+ if (nOffset < 0 || nOffset >= (long) m_dwLength) return false;
+ m_dwReadPos = nOffset;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: Read()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+DWORD IIEP::CFileIn::Read(PVOID pDataBuffer, DWORD dwReadSize)
+{
+ if (m_pFile)
+ {
+ return (DWORD) fread(pDataBuffer, 1, dwReadSize, m_pFile);
+ }
+
+ if (m_pucMemData)
+ {
+ if (m_dwReadPos + dwReadSize > m_dwLength) dwReadSize = m_dwLength - m_dwReadPos;
+
+ memcpy(pDataBuffer, m_pucMemData + m_dwReadPos, dwReadSize);
+
+ m_dwReadPos += dwReadSize;
+
+ return dwReadSize;
+ }
+
+ return 0;
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: ReadAnsiLine()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+bool IIEP::CFileIn::ReadAnsiLine(std::string &strLine)
+{
+ BYTE ucChar = 0;
+
+ strLine.clear();
+
+ while (ReadB(ucChar))
+ {
+ if (0x0D == ucChar)
+ {
+ }
+ else
+ if (0x0A == ucChar)
+ {
+ return true;
+ }
+ else
+ {
+ strLine.push_back(ucChar);
+ }
+ }
+
+ if (strLine.empty()) return false;
+
+ return true;
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: ReadUnicodeLine()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+bool IIEP::CFileIn::ReadUnicodeLine(std::wstring &wstrLine, bool bBigEndian)
+{
+ WORD wChar = 0;
+
+ wstrLine.clear();
+
+ while (bBigEndian ? ReadInverseW(wChar) : ReadW(wChar))
+ {
+ if (0x000D == wChar)
+ {
+ }
+ else
+ if (0x000A == wChar)
+ {
+ return true;
+ }
+ else
+ {
+ wstrLine.push_back(wChar);
+ }
+ }
+
+ if (wstrLine.empty()) return false;
+
+ return true;
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: ReadAnsiString()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+bool IIEP::CFileIn::ReadAnsiString(char *pszBuffer, DWORD dwBufferLength)
+{
+ DWORD dwIndex = 0;
+ BYTE ucChar;
+
+ while (ReadB(ucChar))
+ {
+ if (dwIndex >= dwBufferLength) return true;
+
+ pszBuffer[dwIndex ++] = ucChar;
+
+ if (0 == ucChar)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// ------------------------------------------------------------------------------------------------
+// name: ReadUnicodeString()
+// desc:
+// ------------------------------------------------------------------------------------------------
+
+bool IIEP::CFileIn::ReadUnicodeString(WORD *pwzBuffer, DWORD dwBufferLength)
+{
+ DWORD dwIndex = 0;
+ WORD wChar;
+
+ ReadInverseW(wChar);
+
+ if (wChar == 0xFFFE) // Unicode
+ {
+ while (ReadW(wChar))
+ {
+ if (dwIndex >= dwBufferLength) return true;
+
+ pwzBuffer[dwIndex ++] = wChar;
+
+ if (0 == wChar)
+ {
+ return true;
+ }
+ }
+ }
+ else
+ if (wChar == 0xFEFF) // Unicode big endian
+ {
+ while (ReadInverseW(wChar))
+ {
+ if (dwIndex >= dwBufferLength) return true;
+
+ pwzBuffer[dwIndex ++] = wChar;
+
+ if (0 == wChar)
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+// ------------------------------------------------------------------------------------------------ \ No newline at end of file