diff options
| -rw-r--r-- | src/stdio/open_memstream.c | 44 | ||||
| -rw-r--r-- | src/stdio/open_wmemstream.c | 44 | 
2 files changed, 50 insertions, 38 deletions
| diff --git a/src/stdio/open_memstream.c b/src/stdio/open_memstream.c index eab024da..ee834234 100644 --- a/src/stdio/open_memstream.c +++ b/src/stdio/open_memstream.c @@ -12,6 +12,12 @@ struct cookie {  	size_t space;  }; +struct ms_FILE { +	FILE f; +	struct cookie c; +	unsigned char buf[BUFSIZ]; +}; +  static off_t ms_seek(FILE *f, off_t off, int whence)  {  	ssize_t base; @@ -57,34 +63,34 @@ static int ms_close(FILE *f)  FILE *open_memstream(char **bufp, size_t *sizep)  { -	FILE *f; -	struct cookie *c; +	struct ms_FILE *f;  	char *buf; -	if (!(f=malloc(sizeof *f + sizeof *c + BUFSIZ))) return 0; +	if (!(f=malloc(sizeof *f))) return 0;  	if (!(buf=malloc(sizeof *buf))) {  		free(f);  		return 0;  	} -	memset(f, 0, sizeof *f + sizeof *c); -	f->cookie = c = (void *)(f+1); +	memset(&f->f, 0, sizeof f->f); +	memset(&f->c, 0, sizeof f->c); +	f->f.cookie = &f->c; -	c->bufp = bufp; -	c->sizep = sizep; -	c->pos = c->len = c->space = *sizep = 0; -	c->buf = *bufp = buf; +	f->c.bufp = bufp; +	f->c.sizep = sizep; +	f->c.pos = f->c.len = f->c.space = *sizep = 0; +	f->c.buf = *bufp = buf;  	*buf = 0; -	f->flags = F_NORD; -	f->fd = -1; -	f->buf = (void *)(c+1); -	f->buf_size = BUFSIZ; -	f->lbf = EOF; -	f->write = ms_write; -	f->seek = ms_seek; -	f->close = ms_close; +	f->f.flags = F_NORD; +	f->f.fd = -1; +	f->f.buf = f->buf; +	f->f.buf_size = sizeof f->buf; +	f->f.lbf = EOF; +	f->f.write = ms_write; +	f->f.seek = ms_seek; +	f->f.close = ms_close; -	if (!libc.threaded) f->lock = -1; +	if (!libc.threaded) f->f.lock = -1; -	return __ofl_add(f); +	return __ofl_add(&f->f);  } diff --git a/src/stdio/open_wmemstream.c b/src/stdio/open_wmemstream.c index 4d90cd97..cb693ea7 100644 --- a/src/stdio/open_wmemstream.c +++ b/src/stdio/open_wmemstream.c @@ -14,6 +14,12 @@ struct cookie {  	mbstate_t mbs;  }; +struct wms_FILE { +	FILE f; +	struct cookie c; +	unsigned char buf[1]; +}; +  static off_t wms_seek(FILE *f, off_t off, int whence)  {  	ssize_t base; @@ -59,34 +65,34 @@ static int wms_close(FILE *f)  FILE *open_wmemstream(wchar_t **bufp, size_t *sizep)  { -	FILE *f; -	struct cookie *c; +	struct wms_FILE *f;  	wchar_t *buf; -	if (!(f=malloc(sizeof *f + sizeof *c))) return 0; +	if (!(f=malloc(sizeof *f))) return 0;  	if (!(buf=malloc(sizeof *buf))) {  		free(f);  		return 0;  	} -	memset(f, 0, sizeof *f + sizeof *c); -	f->cookie = c = (void *)(f+1); +	memset(&f->f, 0, sizeof f->f); +	memset(&f->c, 0, sizeof f->c); +	f->f.cookie = &f->c; -	c->bufp = bufp; -	c->sizep = sizep; -	c->pos = c->len = c->space = *sizep = 0; -	c->buf = *bufp = buf; +	f->c.bufp = bufp; +	f->c.sizep = sizep; +	f->c.pos = f->c.len = f->c.space = *sizep = 0; +	f->c.buf = *bufp = buf;  	*buf = 0; -	f->flags = F_NORD; -	f->fd = -1; -	f->buf = (void *)(c+1); -	f->buf_size = 0; -	f->lbf = EOF; -	f->write = wms_write; -	f->seek = wms_seek; -	f->close = wms_close; +	f->f.flags = F_NORD; +	f->f.fd = -1; +	f->f.buf = f->buf; +	f->f.buf_size = 0; +	f->f.lbf = EOF; +	f->f.write = wms_write; +	f->f.seek = wms_seek; +	f->f.close = wms_close; -	if (!libc.threaded) f->lock = -1; +	if (!libc.threaded) f->f.lock = -1; -	return __ofl_add(f); +	return __ofl_add(&f->f);  } | 
