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 (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; }
358 __JAFFAR_COMMON__INLINE__
void setReadOnly() { _readonly =
true; }
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;
504 _bufferSize = newBufferSize;
505 _buffer = (uint8_t*)realloc(_buffer, newBufferSize);
517 size_t _bufferSize = 0;
522 uint8_t* _buffer =
nullptr;
527 bool _readonly =
false;
532 bool _writeonly =
false;
537 bool _opened =
false;
552 bool _writeCallbackDefined =
false;
557 std::function<void(
const int64_t, MemoryFile*
const)> _writeCallback;
562 bool _readCallbackDefined =
false;
567 std::function<void(
const int64_t, MemoryFile*
const)> _readCallback;
589 __JAFFAR_COMMON__INLINE__
MemoryFile*
fopen(
const std::string filename,
const std::string mode)
592 mode_t openMode = mode_t::none;
593 if (mode.find(
"r") != std::string::npos) openMode = mode_t::read;
594 if (mode.find(
"w") != std::string::npos)
596 if (openMode != mode_t::none)
return NULL;
597 openMode = mode_t::write;
599 if (mode.find(
"a") != std::string::npos)
601 if (openMode != mode_t::none)
return NULL;
602 openMode = mode_t::append;
606 if (openMode == mode_t::append)
return NULL;
609 if (openMode == mode_t::none)
return NULL;
612 bool extendedMode =
false;
613 if (mode.find(
"+") != std::string::npos) extendedMode =
true;
616 bool noCreateMode =
false;
617 if (mode.find(
"x") != std::string::npos) noCreateMode =
true;
620 bool fileExists = _fileMap.contains(filename);
623 bool createFile =
false;
626 if (fileExists ==
false)
629 if (noCreateMode ==
true)
return NULL;
632 if (openMode == mode_t::read)
return NULL;
639 if (fileExists ==
true)
642 if (_fileMap.at(filename)->isOpened() ==
true)
return NULL;
645 if (openMode == mode_t::write) createFile =
true;
649 if (createFile ==
true) _fileMap[filename] = std::make_unique<MemoryFile>();
652 MemoryFile* file = _fileMap.at(filename).get();
658 if (openMode == mode_t::read)
665 if (openMode == mode_t::write)
672 if (extendedMode ==
true)
693 if (file == NULL)
return -1;
696 if (file->
isOpened() ==
false)
return -2;
713 if (_fileMap.contains(filename) ==
false)
return -1;
716 MemoryFile* file = _fileMap.at(filename).get();
719 if (file->
isOpened() ==
true)
return -2;
722 _fileMap.erase(filename);
733 bool contains(
const std::string& filename)
const {
return _fileMap.contains(filename); }
743 if (
contains(filename) ==
false)
return -1;
744 return _fileMap.at(filename)->getSize();
755 if (
contains(filename) ==
false)
return nullptr;
756 return _fileMap.at(filename)->getBuffer();
774 std::map<std::string, std::unique_ptr<MemoryFile>> _fileMap;
uint8_t * getFileBuffer(const std::string &filename) const
Definition file.hpp:753
bool contains(const std::string &filename) const
Definition file.hpp:733
__JAFFAR_COMMON__INLINE__ MemoryFile * fopen(const std::string filename, const std::string mode)
Definition file.hpp:589
int64_t getFileSize(const std::string &filename) const
Definition file.hpp:741
int fdestroy(const std::string &filename)
Definition file.hpp:710
int fclose(MemoryFile *const file)
Definition file.hpp:691
static __JAFFAR_COMMON__INLINE__ void clearerr(MemoryFile *const file)
Definition file.hpp:339
__JAFFAR_COMMON__INLINE__ void setReadOnly()
Definition file.hpp:358
static __JAFFAR_COMMON__INLINE__ int64_t ftello64(MemoryFile *const file)
Definition file.hpp:206
__JAFFAR_COMMON__INLINE__ void setOpened()
Definition file.hpp:378
__JAFFAR_COMMON__INLINE__ void setReadCallback(const std::function< void(const int64_t, MemoryFile *)> callback)
Definition file.hpp:419
__JAFFAR_COMMON__INLINE__ bool isReadOnly() const
Definition file.hpp:389
__JAFFAR_COMMON__INLINE__ bool isWriteOnly() const
Definition file.hpp:395
__JAFFAR_COMMON__INLINE__ size_t getSize() const
Definition file.hpp:489
static __JAFFAR_COMMON__INLINE__ int fseeko64(MemoryFile *const file, const int64_t offset, const int origin)
Definition file.hpp:274
__JAFFAR_COMMON__INLINE__ int resize(const size_t newSize)
Definition file.hpp:443
__JAFFAR_COMMON__INLINE__ void setWriteOnly()
Definition file.hpp:368
~MemoryFile()
Definition file.hpp:98
__JAFFAR_COMMON__INLINE__ void unsetOpened()
Definition file.hpp:383
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__ void setSize(const size_t size)
Definition file.hpp:482
__JAFFAR_COMMON__INLINE__ void unsetReadOnly()
Definition file.hpp:363
static __JAFFAR_COMMON__INLINE__ int fflush(MemoryFile *file)
Definition file.hpp:251
static __JAFFAR_COMMON__INLINE__ void rewind(MemoryFile *const file)
Definition file.hpp:232
static __JAFFAR_COMMON__INLINE__ int feof(MemoryFile *const file)
Definition file.hpp:321
__JAFFAR_COMMON__INLINE__ void unsetWriteCallback()
Definition file.hpp:428
__JAFFAR_COMMON__INLINE__ void unsetWriteOnly()
Definition file.hpp:373
__JAFFAR_COMMON__INLINE__ void setWriteCallback(const std::function< void(const int64_t, MemoryFile *)> callback)
Definition file.hpp:408
__JAFFAR_COMMON__INLINE__ void unsetReadCallback()
Definition file.hpp:433
__JAFFAR_COMMON__INLINE__ bool isOpened() const
Definition file.hpp:401
static __JAFFAR_COMMON__INLINE__ int ferror(MemoryFile *const file)
Definition file.hpp:353
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
static __JAFFAR_COMMON__INLINE__ int64_t ftell(MemoryFile *const file)
Definition file.hpp:214
static __JAFFAR_COMMON__INLINE__ int fseek(MemoryFile *const file, const int64_t offset, const int origin)
Definition file.hpp:285
static __JAFFAR_COMMON__INLINE__ bool loadStringFromFile(std::string &dst, const std::string &fileName)
Definition file.hpp:45
static __JAFFAR_COMMON__INLINE__ bool saveStringToFile(const std::string &src, const std::string &fileName)
Definition file.hpp:68
static __JAFFAR_COMMON__INLINE__ std::string slurp(std::ifstream &in)
Definition file.hpp:31