77typedef struct fmemcookie {
91fmemread(
void *cookie,
char *buf,
int n)
93 fmemcookie *c = (fmemcookie *) cookie;
97 if (n >= c->eof - c->pos)
99 memmove (buf, c->buf + c->pos, n);
107fmemwrite(
void *cookie,
const char *buf,
int n)
109 fmemcookie *c = (fmemcookie *) cookie;
116 else if (c->pos > c->eof)
117 memset (c->buf + c->eof,
'\0', c->pos - c->eof);
119 if (c->pos + n > c->max - c->writeonly)
121 adjust = c->writeonly;
129 if (c->pos + n > c->eof)
132 if (c->eof - adjust < c->max)
133 c->saved = c->buf[c->eof - adjust] =
'\0';
135 else if (c->writeonly)
139 c->saved = c->buf[c->pos + n - adjust];
140 c->buf[c->pos + n - adjust] =
'\0';
147 memmove (c->buf + c->pos - n, buf, n - adjust);
158fmemseek(
void *cookie, fpos_t pos,
int whence)
160 fmemcookie *c = (fmemcookie *) cookie;
161 off_t offset = (off_t) pos;
163 if (whence == SEEK_CUR)
165 else if (whence == SEEK_END)
171 else if (offset > c->max)
177 if (c->writeonly && c->pos < c->eof)
179 c->buf[c->pos] = c->saved;
183 if (c->writeonly && c->pos < c->eof)
185 c->saved = c->buf[c->pos];
186 c->buf[c->pos] =
'\0';
189 return (fpos_t) offset;
194fmemclose(
void *cookie)
196 fmemcookie *c = (fmemcookie *) cookie;
204fmemopen(
void *buf,
size_t size,
const char *mode)
211 if ((flags = __sflags (mode, &dummy)) == 0)
213 if (!size || !(buf || flags & __SAPP))
217 if ((fp = (FILE *) __sfp ()) == NULL)
219 if ((c = (fmemcookie *) malloc (
sizeof *c + (buf ? 0 : size))) == NULL)
230 c->writeonly = (flags & __SWR) != 0;
235 c->buf = (
char *) (c + 1);
236 *(
char *) buf =
'\0';
238 c->append = (flags & __SAPP) != 0;
242 c->buf = (
char *) buf;
247 buf = memchr (c->buf,
'\0', size);
248 c->eof = c->pos = buf ? (
char *) buf - c->buf : size;
249 if (!buf && c->writeonly)
251 c->buf[size - 1] =
'\0';
256 c->pos = c->append = 0;
261 c->pos = c->append = c->eof = 0;
272 fp->_read = flags & (__SRD | __SRW) ? fmemread : NULL;
273 fp->_write = flags & (__SWR | __SRW) ? fmemwrite : NULL;
274 fp->_seek = fmemseek;
275 fp->_close = fmemclose;