Files
Work/common/MEMFILE.HPP
2024-08-07 09:09:36 -04:00

214 lines
4.5 KiB
C++

#ifndef _COMMON_MEMFILE_HPP_
#define _COMMON_MEMFILE_HPP_
#ifndef _COMMON_WINDOWS_HPP_
#include <common/windows.hpp>
#endif
#ifndef _COMMON_STRING_HPP_
#include <common/string.hpp>
#endif
#ifndef _COMMON_TYPES_HPP_
#include <common/types.hpp>
#endif
#ifndef _COMMON_INTEL_HPP_
#include <common/intel.hpp>
#endif
#ifndef _COMMON_GLOBALDATA_HPP_
#include <common/gdata.hpp>
#endif
class MemFile
{
public:
enum SeekFrom{SeekBeginning,SeekCurrent};
enum ByteOrder{BigEndian,LittleEndian};
enum {BufferLength=16384};
MemFile(const String &pathFileName,DWORD lengthBuffer=BufferLength,ByteOrder byteOrder=LittleEndian);
MemFile(DWORD lengthBuffer,ByteOrder byteOrder=LittleEndian);
virtual ~MemFile();
bool rewind(void);
bool read(BYTE &value);
bool read(WORD &value);
bool read(int &value);
bool read(DWORD &value);
DWORD read(char *lpBuffer,DWORD lengthData);
DWORD read(char *lpBuffer,DWORD lengthData,int stopChar);
DWORD getLine(String &lineString);
bool write(BYTE value);
bool write(WORD value);
bool write(DWORD value);
bool write(int value);
bool write(char *lpBuffer,DWORD lengthData);
bool write(char *lpBuffer);
bool flushBuffer(void);
DWORD captureBuffer(GlobalData<BYTE> &memoryBuffer,bool clearDirty);
DWORD tell(void)const;
bool seek(LONG offset,SeekFrom seekFrom);
bool open(DWORD lengthBuffer,ByteOrder byteOrder=LittleEndian);
void close(void);
DWORD size(void)const;
DWORD extent(void)const;
bool isOkay(void)const;
private:
enum {CarriageReturn=0x0D,LineFeed=0x0A,NullChar=0x00};
bool createBuffer(DWORD lengthBuffer);
bool destroyBuffer(void);
HGLOBAL mhGlobalBuffer;
UHUGE *mlpBuffer;
UHUGE *mlpBufferPointer;
ByteOrder mByteOrder;
bool mIsDirty;
DWORD mMaxExtent;
DWORD mBufferLength;
String mPathFileName;
Intel mIntelData;
};
inline
MemFile::MemFile(const String &pathFileName,DWORD lengthBuffer,ByteOrder byteOrder)
: mPathFileName(pathFileName), mlpBuffer(0), mlpBufferPointer(0), mByteOrder(byteOrder),
mIsDirty(false), mMaxExtent(0), mBufferLength(0), mhGlobalBuffer(0)
{
createBuffer(lengthBuffer);
}
inline
MemFile::MemFile(DWORD lengthBuffer,ByteOrder byteOrder)
: mlpBuffer(0), mlpBufferPointer(0), mByteOrder(byteOrder), mIsDirty(false),
mMaxExtent(0), mBufferLength(0), mhGlobalBuffer(0)
{
createBuffer(lengthBuffer);
}
inline
MemFile::~MemFile()
{
close();
}
inline
bool MemFile::open(DWORD lengthBuffer,ByteOrder byteOrder)
{
close();
mByteOrder=byteOrder;
return createBuffer(lengthBuffer);
}
inline
void MemFile::close()
{
if(mIsDirty)flushBuffer();
destroyBuffer();
if(!mPathFileName.isNull())mPathFileName=String("");
}
inline
bool MemFile::isOkay(void)const
{
return (mhGlobalBuffer?true:false);
}
inline
DWORD MemFile::tell(void)const
{
if(!isOkay())return FALSE;
return mlpBufferPointer-mlpBuffer;
}
inline
bool MemFile::read(BYTE &value)
{
if(!isOkay())return false;
if(mlpBufferPointer-mlpBuffer>=mMaxExtent)return false;
value=*(mlpBufferPointer++);
return true;
}
inline
bool MemFile::read(WORD &value)
{
BYTE byteValue;
if(!isOkay())return false;
if(!read(byteValue))return false;
value=byteValue;
if(!read(byteValue))return false;
value|=((WORD)byteValue)<<8;
if(BigEndian==mByteOrder)value=mIntelData.intelData(value);
return true;
}
inline
bool MemFile::read(int &value)
{
return read((DWORD&)value);
}
inline
bool MemFile::read(DWORD &value)
{
WORD wordValue;
if(!isOkay())return false;
if(!read(wordValue))return false;
value=wordValue;
if(!read(wordValue))return false;
value|=((DWORD)wordValue)<<16;
if(BigEndian==mByteOrder)value=mIntelData.intelData(value);
return true;
}
inline
bool MemFile::write(BYTE value)
{
if(!isOkay())return false;
if(mMaxExtent>=mBufferLength)return false;
*(mlpBufferPointer++)=value;
if(mlpBufferPointer-mlpBuffer>mMaxExtent)mMaxExtent=mlpBufferPointer-mlpBuffer;
mIsDirty=true;
return true;
}
inline
bool MemFile::write(WORD value)
{
BYTE byteValue;
if(!isOkay())return false;
if(BigEndian==mByteOrder)value=mIntelData.intelData(value);
byteValue=(BYTE)(value&0x00FF);
if(!write(byteValue))return false;
byteValue=(BYTE)(value>>8);
if(!write(byteValue))return false;
return true;
}
inline
bool MemFile::write(int value)
{
return write((DWORD)value);
}
inline
bool MemFile::write(char *lpBuffer)
{
if(!lpBuffer)return false;
return write(lpBuffer,::strlen(lpBuffer));
}
inline
DWORD MemFile::size(void)const
{
return (mlpBufferPointer-mlpBuffer);
}
inline
DWORD MemFile::extent(void)const
{
return mMaxExtent;
}
#endif