55 lines
1.7 KiB
C++
55 lines
1.7 KiB
C++
|
#ifndef __MMFILE_HXX__
|
||
|
#define __MMFILE_HXX__
|
||
|
|
||
|
#define MMF_EOF (-1)
|
||
|
|
||
|
//
|
||
|
// the file grows a "chunk" at a time. This is the default chunk size.
|
||
|
//
|
||
|
#define MMF_PAGE 4096
|
||
|
#define MMF_CHUNK (MMF_PAGE * 4)
|
||
|
|
||
|
class CMMFile
|
||
|
{
|
||
|
public:
|
||
|
CMMFile(WCHAR const *szFile,BOOL fWrite);
|
||
|
~CMMFile(void);
|
||
|
|
||
|
inline BOOL Ok() { return 0 != _hfFile; }
|
||
|
inline BOOL isWritable() { return _fWrite; }
|
||
|
inline ULONG FileSize() { return _ulFileSize; }
|
||
|
|
||
|
inline void UnGetChar(int x) { if ((_pcCurrent>(char *)_pvView) && ((ULONG)(_pcCurrent-(char *)_pvView)<_ulFileSize)) _pcCurrent--; }
|
||
|
inline int GetChar() { return ((ULONG)(_pcCurrent-(char *)_pvView)<_ulFileSize) ? (int) *_pcCurrent++ : MMF_EOF; }
|
||
|
inline BOOL isEOF() { return ((ULONG)(_pcCurrent-(char *)_pvView)<_ulFileSize) ? FALSE : TRUE; }
|
||
|
int GetS(char *szBuf,int iMaxLen);
|
||
|
|
||
|
inline ULONG Tell() { return (ULONG) (_pcCurrent - (char *) _pvView); }
|
||
|
inline ULONG Seek(ULONG ul) { _pcCurrent = (char *) _pvView + ul; return ul; }
|
||
|
inline int PutChar(int c) { Grow(Tell() + 1); *_pcCurrent++ = (char) c; return c; }
|
||
|
inline int PutS(char *szBuf) { return (PutJustS(szBuf) + PutJustS("\r\n")); }
|
||
|
int PutJustS(char *szBuf);
|
||
|
|
||
|
inline LPVOID GetMapping() { return _pvView; }
|
||
|
|
||
|
ULONG Grow(ULONG ulNewSize);
|
||
|
inline ULONG GetChunkSize(void) { return _ulChunk; }
|
||
|
inline ULONG SetChunkSize(ULONG ulChunk) { _ulChunk = ulChunk; return ulChunk; }
|
||
|
inline int Flush() { return FlushViewOfFile(_pvView,_ulFileSize); }
|
||
|
|
||
|
private:
|
||
|
inline ULONG _RoundUpToChunk(ULONG x) { return ((x) % _ulChunk) ? ((((x) / _ulChunk) + 1) * _ulChunk) : (x); }
|
||
|
|
||
|
BOOL _fWrite;
|
||
|
HANDLE _hfFile;
|
||
|
HANDLE _hMapping;
|
||
|
LPVOID _pvView;
|
||
|
ULONG _ulFileSize;
|
||
|
ULONG _ulChunk;
|
||
|
char *_pcCurrent;
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|