31static __JAFFAR_COMMON_INLINE__ std::string
slurp(std::ifstream& in)
33 std::ostringstream sstr;
45static __JAFFAR_COMMON_INLINE__
bool loadStringFromFile(std::string& dst,
const std::string& fileName)
47 std::ifstream fi(fileName);
50 if (fi.good() ==
false)
return false;
68static __JAFFAR_COMMON_INLINE__
bool saveStringToFile(
const std::string& src,
const std::string& fileName)
70 FILE* fid = fopen(fileName.c_str(),
"w");
73 fwrite(src.c_str(), 1, src.size(), fid);
80class MemoryFileDirectory;
112 static __JAFFAR_COMMON_INLINE__ int64_t
fread(
void*
const buffer,
const size_t size,
const size_t count,
MemoryFile*
const file)
117 file->_errorCode = -1;
118 return file->_errorCode;
124 file->_errorCode = -2;
125 return file->_errorCode;
129 size_t newCount = count;
130 if (size > 0 && file->_head + (size * count) > file->_size) newCount = (file->_size - file->_head) / size;
133 const size_t requestedSize = size * newCount;
136 if (requestedSize > 0) std::memcpy(buffer, &file->_buffer[file->_head], requestedSize);
139 file->_head += requestedSize;
142 if (file->_readCallbackDefined ==
true) file->_readCallback(requestedSize, file);
145 file->_errorCode = 0;
161 static __JAFFAR_COMMON_INLINE__ int64_t
fwrite(
const void* buffer,
const size_t size,
const size_t count,
MemoryFile*
const file)
166 file->_errorCode = -1;
167 return file->_errorCode;
173 file->_errorCode = -2;
174 return file->_errorCode;
178 const size_t requestedSize = size * count;
181 const size_t endHeadPos = file->_head + requestedSize;
182 if (endHeadPos > file->_bufferSize) file->resizeToFit(endHeadPos + 1);
185 if (requestedSize > 0) memcpy(&file->_buffer[file->_head], buffer, requestedSize);
188 file->_head += requestedSize;
189 if (file->_head > file->_size) file->_size = file->_head;
192 if (file->_writeCallbackDefined ==
true) file->_writeCallback(requestedSize, file);
195 file->_errorCode = 0;
219 file->_errorCode = -1;
220 return file->_errorCode;
223 file->_errorCode = 0;
237 file->_errorCode = -1;
241 file->_errorCode = 0;
256 file->_errorCode = -1;
257 return file->_errorCode;
260 file->_errorCode = 0;
274 static __JAFFAR_COMMON_INLINE__
int fseeko64(
MemoryFile*
const file,
const int64_t offset,
const int origin) {
return fseek(file, offset, origin); }
285 static __JAFFAR_COMMON_INLINE__
int fseek(
MemoryFile*
const file,
const int64_t offset,
const int origin)
290 file->_errorCode = -1;
291 return file->_errorCode;
294 int64_t startPos = file->_head;
295 if (origin == SEEK_SET) startPos = 0;
296 if (origin == SEEK_END) startPos = file->_size;
298 int64_t desiredPos = startPos + offset;
301 file->_errorCode = -2;
302 return file->_errorCode;
304 if (desiredPos > (int64_t)file->_size)
306 file->_errorCode = -3;
307 return file->_errorCode;
310 file->_head = desiredPos;
311 file->_errorCode = 0;
326 file->_errorCode = -1;
327 return file->_errorCode;
330 file->_errorCode = 0;
331 return file->_head == file->_size;
342 if (file->
isOpened() ==
false)
return;
344 file->_errorCode = 0;
353 static __JAFFAR_COMMON_INLINE__
int ferror(
MemoryFile*
const file) {
return file->_errorCode; }
378 __JAFFAR_COMMON_INLINE__
void setOpened() { _opened =
true; }
389 __JAFFAR_COMMON_INLINE__
bool isReadOnly()
const {
return _readonly; }
395 __JAFFAR_COMMON_INLINE__
bool isWriteOnly()
const {
return _writeonly; }
401 __JAFFAR_COMMON_INLINE__
bool isOpened()
const {
return _opened; }
410 _writeCallback = callback;
411 _writeCallbackDefined =
true;
421 _readCallback = callback;
422 _readCallbackDefined =
true;
443 __JAFFAR_COMMON_INLINE__
int resize(
const size_t newSize)
464 if (_bufferSize < _size)
467 if (_buffer ==
nullptr)
return -1;
471 if (_head > _size) _head = _size;
482 __JAFFAR_COMMON_INLINE__
void setSize(
const size_t size) { _size = size; }
489 __JAFFAR_COMMON_INLINE__
size_t getSize()
const {
return _size; }
492 uint8_t* getBuffer()
const {
return _buffer; }
494 void resizeToFit(
const size_t target)
497 size_t newBufferSize = _bufferSize;
498 if (newBufferSize == 0) newBufferSize = 1;
501 while (newBufferSize < target) newBufferSize <<= 1;
506 uint8_t* newBuffer = (uint8_t*)realloc(_buffer, newBufferSize);
507 if (newBuffer ==
nullptr)
return;
509 _bufferSize = newBufferSize;
521 size_t _bufferSize = 0;
526 uint8_t* _buffer =
nullptr;
531 bool _readonly =
false;
536 bool _writeonly =
false;
541 bool _opened =
false;
556 bool _writeCallbackDefined =
false;
561 std::function<void(
const int64_t, MemoryFile*
const)> _writeCallback;
566 bool _readCallbackDefined =
false;
571 std::function<void(
const int64_t, MemoryFile*
const)> _readCallback;
593 __JAFFAR_COMMON_INLINE__
MemoryFile*
fopen(
const std::string filename,
const std::string mode)
596 mode_t openMode = mode_t::none;
597 if (mode.find(
"r") != std::string::npos) openMode = mode_t::read;
598 if (mode.find(
"w") != std::string::npos)
600 if (openMode != mode_t::none)
return NULL;
601 openMode = mode_t::write;
603 if (mode.find(
"a") != std::string::npos)
605 if (openMode != mode_t::none)
return NULL;
606 openMode = mode_t::append;
610 if (openMode == mode_t::append)
return NULL;
613 if (openMode == mode_t::none)
return NULL;
616 bool extendedMode =
false;
617 if (mode.find(
"+") != std::string::npos) extendedMode =
true;
620 bool noCreateMode =
false;
621 if (mode.find(
"x") != std::string::npos) noCreateMode =
true;
624 bool fileExists = _fileMap.contains(filename);
627 bool createFile =
false;
630 if (fileExists ==
false)
633 if (noCreateMode ==
true)
return NULL;
636 if (openMode == mode_t::read)
return NULL;
643 if (fileExists ==
true)
646 if (_fileMap.at(filename)->isOpened() ==
true)
return NULL;
649 if (openMode == mode_t::write) createFile =
true;
653 if (createFile ==
true) _fileMap[filename] = std::make_unique<MemoryFile>();
656 MemoryFile* file = _fileMap.at(filename).get();
662 if (openMode == mode_t::read)
669 if (openMode == mode_t::write)
676 if (extendedMode ==
true)
697 if (file == NULL)
return -1;
700 if (file->
isOpened() ==
false)
return -2;
717 if (_fileMap.contains(filename) ==
false)
return -1;
720 MemoryFile* file = _fileMap.at(filename).get();
723 if (file->
isOpened() ==
true)
return -2;
726 _fileMap.erase(filename);
737 bool contains(
const std::string& filename)
const {
return _fileMap.contains(filename); }
747 if (
contains(filename) ==
false)
return -1;
748 return _fileMap.at(filename)->getSize();
759 if (
contains(filename) ==
false)
return nullptr;
760 return _fileMap.at(filename)->getBuffer();
778 std::map<std::string, std::unique_ptr<MemoryFile>> _fileMap;
uint8_t * getFileBuffer(const std::string &filename) const
Definition file.hpp:757
bool contains(const std::string &filename) const
Definition file.hpp:737
int64_t getFileSize(const std::string &filename) const
Definition file.hpp:745
__JAFFAR_COMMON_INLINE__ MemoryFile * fopen(const std::string filename, const std::string mode)
Definition file.hpp:593
int fdestroy(const std::string &filename)
Definition file.hpp:714
int fclose(MemoryFile *const file)
Definition file.hpp:695
__JAFFAR_COMMON_INLINE__ void unsetOpened()
Definition file.hpp:383
static __JAFFAR_COMMON_INLINE__ int64_t ftell(MemoryFile *const file)
Definition file.hpp:214
static __JAFFAR_COMMON_INLINE__ int64_t fwrite(const void *buffer, const size_t size, const size_t count, MemoryFile *const file)
Definition file.hpp:161
__JAFFAR_COMMON_INLINE__ void unsetReadOnly()
Definition file.hpp:363
static __JAFFAR_COMMON_INLINE__ void clearerr(MemoryFile *const file)
Definition file.hpp:339
static __JAFFAR_COMMON_INLINE__ int fseek(MemoryFile *const file, const int64_t offset, const int origin)
Definition file.hpp:285
__JAFFAR_COMMON_INLINE__ int resize(const size_t newSize)
Definition file.hpp:443
__JAFFAR_COMMON_INLINE__ bool isOpened() const
Definition file.hpp:401
__JAFFAR_COMMON_INLINE__ void setOpened()
Definition file.hpp:378
__JAFFAR_COMMON_INLINE__ void setWriteCallback(const std::function< void(const int64_t, MemoryFile *)> callback)
Definition file.hpp:408
__JAFFAR_COMMON_INLINE__ void unsetWriteCallback()
Definition file.hpp:428
static __JAFFAR_COMMON_INLINE__ void rewind(MemoryFile *const file)
Definition file.hpp:232
__JAFFAR_COMMON_INLINE__ void unsetWriteOnly()
Definition file.hpp:373
__JAFFAR_COMMON_INLINE__ void setSize(const size_t size)
Definition file.hpp:482
~MemoryFile()
Definition file.hpp:98
static __JAFFAR_COMMON_INLINE__ int64_t ftello64(MemoryFile *const file)
Definition file.hpp:206
static __JAFFAR_COMMON_INLINE__ int feof(MemoryFile *const file)
Definition file.hpp:321
static __JAFFAR_COMMON_INLINE__ int ferror(MemoryFile *const file)
Definition file.hpp:353
__JAFFAR_COMMON_INLINE__ bool isReadOnly() const
Definition file.hpp:389
__JAFFAR_COMMON_INLINE__ void setReadCallback(const std::function< void(const int64_t, MemoryFile *)> callback)
Definition file.hpp:419
static __JAFFAR_COMMON_INLINE__ int64_t fread(void *const buffer, const size_t size, const size_t count, MemoryFile *const file)
Definition file.hpp:112
__JAFFAR_COMMON_INLINE__ size_t getSize() const
Definition file.hpp:489
__JAFFAR_COMMON_INLINE__ void setReadOnly()
Definition file.hpp:358
static __JAFFAR_COMMON_INLINE__ int fseeko64(MemoryFile *const file, const int64_t offset, const int origin)
Definition file.hpp:274
__JAFFAR_COMMON_INLINE__ bool isWriteOnly() const
Definition file.hpp:395
static __JAFFAR_COMMON_INLINE__ int fflush(MemoryFile *file)
Definition file.hpp:251
__JAFFAR_COMMON_INLINE__ void setWriteOnly()
Definition file.hpp:368
__JAFFAR_COMMON_INLINE__ void unsetReadCallback()
Definition file.hpp:433
static __JAFFAR_COMMON_INLINE__ bool loadStringFromFile(std::string &dst, const std::string &fileName)
Definition file.hpp:45
static __JAFFAR_COMMON_INLINE__ std::string slurp(std::ifstream &in)
Definition file.hpp:31
static __JAFFAR_COMMON_INLINE__ bool saveStringToFile(const std::string &src, const std::string &fileName)
Definition file.hpp:68