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

352 lines
8.4 KiB
C++

#if defined(__FLAT__)
#ifndef _COMMON_PUREVIEWOFFILE_HPP_
#define _COMMON_PUREVIEWOFFILE_HPP_
#ifndef _COMMON_WINDOWS_HPP_
#include <common/windows.hpp>
#endif
#ifndef _COMMON_FILEMAP_HPP_
#include <common/filemap.hpp>
#endif
#ifndef _COMMON_BLOCK_HPP_
#include <common/block.hpp>
#endif
#ifndef _COMMON_PUREDWORD_HPP_
#include <common/puredwrd.hpp>
#endif
class PureViewOfFile
{
public:
enum Access{Write=FILE_MAP_WRITE,Read=FILE_MAP_READ,Copy=FILE_MAP_COPY};
enum SeekMethod{SeekSet,SeekCurr,SeekEnd};
enum {CarriageReturn=0x0D,LineFeed=0x0A,NullChar=0x00};
PureViewOfFile(void);
PureViewOfFile(const FileMap &someFileMap,DWORD offsetHigh,DWORD offsetLow,DWORD byteCount);
PureViewOfFile(const FileMap &someFileMap);
virtual ~PureViewOfFile();
PureViewOfFile &operator+=(DWORD sizeIncrement);
PureViewOfFile &operator++(void);
PureViewOfFile &operator-=(DWORD sizeDecrement);
PureViewOfFile &operator--(void);
PureViewOfFile &operator--(int postFixDummy);
WORD seek(DWORD location,SeekMethod seekMethod=SeekCurr);
WORD write(BYTE someByte);
WORD write(WORD someWord);
WORD write(short someShort);
WORD write(int someInt);
WORD write(double someDouble);
WORD write(float someFloat);
WORD write(const String &someString);
WORD write(BYTE *npBuffer,DWORD sizeBuffer);
WORD read(BYTE &someByte);
WORD read(WORD &someWORD);
WORD read(DWORD &someDWORD);
WORD read(UINT &someUINT);
WORD read(int &someInt);
WORD read(double &someDouble);
WORD read(float &someFloat);
DWORD read(char *npBuffer,DWORD sizeBuffer);
WORD find(const String &findString);
WORD writeLine(const String &lineString);
DWORD getLine(String &lineString);
DWORD peek(BYTE *npBuffer,DWORD sizeBuffer);
WORD peek(BYTE &someByte);
WORD peek(int &someInt);
DWORD tell(void)const;
WORD push(void);
WORD pop(void);
DWORD base(void)const;
DWORD size(void)const;
WORD rewind(void);
BOOL flush(DWORD extent);
BOOL flush(void);
void destroyView(void);
void createView(const FileMap &someFileMap);
void createView(const FileMap &someFileMap,DWORD offsetHigh,DWORD offsetLow,DWORD byteCount);
void createView(DWORD byteCount,DWORD baseAddress);
protected:
void *getBasePointer(void);
private:
enum Disposition{Keep,Delete};
PureViewOfFile(const PureViewOfFile &somePureViewOfFile);
void *mnpCursor;
void *mnpFirstValidAddress;
void *mnpLastValidAddress;
void *mnpPointer;
Block<PureDWORD> mViewPositions;
Disposition mDisposition;
};
inline
PureViewOfFile::PureViewOfFile(void)
: mnpCursor(0), mnpPointer(0), mnpFirstValidAddress(0), mnpLastValidAddress(0), mDisposition(Delete)
{
}
inline
PureViewOfFile::PureViewOfFile(const FileMap &someFileMap,DWORD offsetHigh,DWORD offsetLow,DWORD byteCount)
: mnpCursor(0), mnpPointer(0), mnpFirstValidAddress(0), mnpLastValidAddress(0), mDisposition(Delete)
{
createView(someFileMap,offsetHigh,offsetLow,byteCount);
}
inline
PureViewOfFile::PureViewOfFile(const FileMap &someFileMap)
: mnpCursor(0), mnpPointer(0), mnpFirstValidAddress(0), mnpLastValidAddress(0), mDisposition(Delete)
{
createView(someFileMap,0L,0L,someFileMap.maxExtentLow());
}
inline
PureViewOfFile::~PureViewOfFile()
{
destroyView();
}
inline
PureViewOfFile::PureViewOfFile(const PureViewOfFile &somePureViewOfFile)
: mDisposition(Delete)
{
}
inline
PureViewOfFile &PureViewOfFile::operator+=(DWORD sizeIncrement)
{
if((char*)mnpCursor+sizeIncrement<=mnpLastValidAddress)mnpCursor=(char*)mnpCursor+sizeIncrement;
return *this;
}
inline
PureViewOfFile &PureViewOfFile::operator++(void)
{
return operator+=(1L);
}
inline
PureViewOfFile &PureViewOfFile::operator-=(DWORD sizeDecrement)
{
if((char*)mnpCursor-sizeDecrement>=mnpFirstValidAddress)mnpCursor=(char*)mnpCursor-sizeDecrement;
return *this;
}
inline
PureViewOfFile &PureViewOfFile::operator--(void)
{
return operator-=(1L);
}
inline
PureViewOfFile &PureViewOfFile::operator--(int /*postFixDummy*/)
{ // postfix works the same as prefix
return operator-=(1L);
}
inline
WORD PureViewOfFile::write(WORD someWord)
{
if(!mnpCursor||(mnpCursor>mnpLastValidAddress))return FALSE;
*((WORD*)mnpCursor)=someWord;
mnpCursor=(char*)mnpCursor+sizeof(WORD);
return TRUE;
}
inline
WORD PureViewOfFile::write(BYTE someByte)
{
if(!mnpCursor||(mnpCursor>mnpLastValidAddress))return FALSE;
*((BYTE*)mnpCursor)=someByte;
mnpCursor=(char*)mnpCursor+sizeof(BYTE);
return TRUE;
}
inline
WORD PureViewOfFile::write(int someInt)
{
if(!mnpCursor||(mnpCursor>mnpLastValidAddress))return FALSE;
*((int*)mnpCursor)=someInt;
mnpCursor=(char*)mnpCursor+sizeof(int);
return TRUE;
}
inline
WORD PureViewOfFile::write(short someShort)
{
if(!mnpCursor||(mnpCursor>mnpLastValidAddress))return FALSE;
*((short*)mnpCursor)=someShort;
mnpCursor=(char*)mnpCursor+sizeof(short);
return TRUE;
}
inline
WORD PureViewOfFile::write(double someDouble)
{
if(!mnpCursor||(mnpCursor>mnpLastValidAddress))return FALSE;
*((double*)mnpCursor)=someDouble;
mnpCursor=(char*)mnpCursor+sizeof(double);
return TRUE;
}
inline
WORD PureViewOfFile::write(float someFloat)
{
if(!mnpCursor||(mnpCursor>mnpLastValidAddress))return FALSE;
*((float*)mnpCursor)=someFloat;
mnpCursor=(char*)mnpCursor+sizeof(float);
return TRUE;
}
inline
WORD PureViewOfFile::read(BYTE &someBYTE)
{
if(!mnpCursor||(mnpCursor>mnpLastValidAddress))return FALSE;
someBYTE=*((BYTE*)mnpCursor);
mnpCursor=(char*)mnpCursor+sizeof(BYTE);
return TRUE;
}
inline
DWORD PureViewOfFile::read(char *npBuffer,DWORD sizeBuffer)
{
if(!mnpCursor||mnpCursor>mnpLastValidAddress)return FALSE;
if((char*)mnpCursor+(sizeBuffer-1L)>(char*)mnpLastValidAddress)
sizeBuffer=((char*)mnpLastValidAddress-(char*)mnpCursor)+1L;
::memcpy(npBuffer,(char*)mnpCursor,sizeBuffer);
mnpCursor=(char*)mnpCursor+sizeBuffer;
return sizeBuffer;
}
inline
WORD PureViewOfFile::read(WORD &someWORD)
{
if(!mnpCursor||((char*)mnpCursor+sizeof(WORD)>mnpLastValidAddress))return FALSE;
someWORD=*((WORD*)mnpCursor);
mnpCursor=(char*)mnpCursor+sizeof(WORD);
return TRUE;
}
inline
WORD PureViewOfFile::read(DWORD &someDWORD)
{
if(!mnpCursor||((char*)mnpCursor+sizeof(DWORD)>mnpLastValidAddress))return FALSE;
someDWORD=*((DWORD*)mnpCursor);
mnpCursor=(char*)mnpCursor+sizeof(DWORD);
return TRUE;
}
inline
WORD PureViewOfFile::read(UINT &someUINT)
{
if(!mnpCursor||((char*)mnpCursor+sizeof(UINT)>mnpLastValidAddress))return FALSE;
someUINT=*((UINT*)mnpCursor);
mnpCursor=(char*)mnpCursor+sizeof(UINT);
return TRUE;
}
inline
WORD PureViewOfFile::read(int &someInt)
{
if(!mnpCursor||((char*)mnpCursor+sizeof(int)>mnpLastValidAddress))return FALSE;
someInt=*((int*)mnpCursor);
mnpCursor=(char*)mnpCursor+sizeof(int);
return TRUE;
}
inline
WORD PureViewOfFile::read(double &someDouble)
{
if(!mnpCursor||((char*)mnpCursor+sizeof(double)>mnpLastValidAddress))return FALSE;
someDouble=*((double*)mnpCursor);
mnpCursor=(char*)mnpCursor+sizeof(double);
return TRUE;
}
inline
WORD PureViewOfFile::read(float &someFloat)
{
if(!mnpCursor||((char*)mnpCursor+sizeof(float)>mnpLastValidAddress))return FALSE;
someFloat=*((float*)mnpCursor);
mnpCursor=(char*)mnpCursor+sizeof(float);
return TRUE;
}
inline
WORD PureViewOfFile::peek(BYTE &someByte)
{
if(!mnpCursor||(mnpCursor>mnpLastValidAddress))return FALSE;
someByte=*((BYTE*)mnpCursor);
return TRUE;
}
inline
WORD PureViewOfFile::peek(int &someInt)
{
if(!mnpCursor||((char*)mnpCursor+sizeof(int)>mnpLastValidAddress))return FALSE;
someInt=*((int*)mnpCursor);
return TRUE;
}
inline
WORD PureViewOfFile::rewind(void)
{
if(!mnpCursor)return FALSE;
mnpCursor=mnpFirstValidAddress;
return TRUE;
}
inline
DWORD PureViewOfFile::tell(void)const
{
if(!mnpCursor)return FALSE;
return (DWORD)((char*)mnpCursor-(char*)mnpFirstValidAddress);
}
inline
DWORD PureViewOfFile::base(void)const
{
return (DWORD)mnpFirstValidAddress;
}
inline
DWORD PureViewOfFile::size(void)const
{
return ((BYTE*)mnpLastValidAddress-(BYTE*)mnpFirstValidAddress)+1L;
}
inline
BOOL PureViewOfFile::flush(DWORD extent)
{
return ::FlushViewOfFile(mnpFirstValidAddress,extent);
}
inline
BOOL PureViewOfFile::flush(void)
{
return flush(size());
}
inline
WORD PureViewOfFile::push(void)
{
PureDWORD pureDWORD(tell());
mViewPositions.insert(&pureDWORD);
return TRUE;
}
inline
WORD PureViewOfFile::pop(void)
{
if(!mViewPositions.size())return FALSE;
seek((mViewPositions[mViewPositions.size()-1].getValue()),SeekSet);
mViewPositions.remove(mViewPositions.size()-1);
return TRUE;
}
inline
void *PureViewOfFile::getBasePointer(void)
{
return mnpFirstValidAddress;
}
#endif
#endif