2 #include "stdio_impl.h"
4 static ssize_t mread(FILE *f, unsigned char *buf, size_t len)
6 size_t rem = f->memsize - f->mempos;
7 if (len > rem) len = rem;
8 memcpy(buf, f->membuf+f->mempos, len);
13 static ssize_t mwrite(FILE *f, const unsigned char *buf, size_t len)
16 if (f->memmode == 'a') f->mempos = f->memsize;
17 rem = f->memlim - f->mempos;
18 if (len > rem) len = rem;
19 memcpy(f->membuf+f->mempos, buf, len);
21 if (f->mempos >= f->memsize) {
22 f->memsize = f->mempos;
27 FILE *fmemopen(void *buf, size_t size, const char *mode)
30 int plus = !!strchr(mode, '+');
32 if (!size || !strchr("rwa", *mode)) {
37 if (!buf && size > SIZE_MAX-sizeof(FILE)-BUFSIZ-UNGET) {
42 f = calloc(sizeof(FILE) + UNGET + BUFSIZ + (buf?0:size), 1);
46 f->buf = (unsigned char *)(f+1) + UNGET;
48 if (!buf) buf = f->buf + BUFSIZ;
50 if (!plus) f->flags = (*mode == 'r') ? F_NOWR : F_NORD;
51 if (*mode == 'a') f->mempos = strchr(buf, 0)-buf;