//======================================================================== // // InMemoryFile.h // // Represents a file in-memory with GNU's stdio wrappers. // NOTE as of this writing, open() depends on the glibc 'fopencookie' // extension and is not supported on other platforms. The // HAVE_IN_MEMORY_FILE macro is intended to reflect whether this class is // usable. // // This file is licensed under the GPLv2 or later // // Copyright (C) 2018, 2019 Greg Knight // //======================================================================== #ifndef IN_MEMORY_FILE_H #define IN_MEMORY_FILE_H #include #include #include #if defined(__USE_GNU) && !defined(__ANDROID_API__) # define HAVE_IN_MEMORY_FILE (1) # define HAVE_IN_MEMORY_FILE_FOPENCOOKIE (1) // used internally #endif class InMemoryFile { private: size_t iohead; std::vector data; FILE *fptr; #ifdef HAVE_IN_MEMORY_FILE_FOPENCOOKIE ssize_t _read(char *buf, size_t sz); ssize_t _write(const char *buf, size_t sz); int _seek(off64_t *offset, int whence); #endif public: InMemoryFile(); public: /* Returns a file handle for this file. This is scoped to this object * and must be fclosed() by the caller before destruction. */ FILE *open(const char *mode); const std::vector &getBuffer() const { return data; } }; #endif // IN_MEMORY_FILE_H