32FILE *fmemopen(
void *buf,
size_t size,
const char *mode);
39typedef struct fmem fmem_t;
41static int readfn(
void *handler,
char *buf,
int size) {
42 fmem_t *mem = handler;
43 size_t available = mem->size - mem->pos;
45 if (size > available) {
48 memmove(buf, mem->buffer + mem->pos,
sizeof(
char) * size);
54static int writefn(
void *handler,
const char *buf,
int size) {
55 fmem_t *mem = handler;
56 size_t available = mem->size - mem->pos;
58 if (size > available) {
61 memmove(mem->buffer + mem->pos, buf,
sizeof(
char) * size);
67static fpos_t seekfn(
void *handler, fpos_t offset,
int whence) {
69 fmem_t *mem = handler;
81 if (offset >= 0 || (
size_t)(-offset) <= mem->pos) {
82 pos = mem->pos + (size_t)offset;
88 case SEEK_END: pos = mem->size + (size_t)offset;
break;
92 if (pos > mem->size) {
100static int closefn(
void *handler) {
105FILE *fmemopen(
void *buf,
size_t size,
const char *mode) {
107 fmem_t* mem = (fmem_t *) malloc(
sizeof(fmem_t));
110 memset(mem, 0,
sizeof(fmem_t));
116 return funopen(mem, readfn, writefn, seekfn, closefn);