]>
git.proxmox.com Git - wasi-libc.git/blob - libc-top-half/musl/src/stdio/open_wmemstream.c
1 #include "stdio_impl.h"
25 static off_t
wms_seek(FILE *f
, off_t off
, int whence
)
28 struct cookie
*c
= f
->cookie
;
34 base
= (size_t [3]){0, c
->pos
, c
->len
}[whence
];
35 if (off
< -base
|| off
> SSIZE_MAX
/4-base
) goto fail
;
36 memset(&c
->mbs
, 0, sizeof c
->mbs
);
37 return c
->pos
= base
+off
;
40 static size_t wms_write(FILE *f
, const unsigned char *buf
, size_t len
)
42 struct cookie
*c
= f
->cookie
;
45 if (len
+ c
->pos
>= c
->space
) {
46 len2
= 2*c
->space
+1 | c
->pos
+len
+1;
47 if (len2
> SSIZE_MAX
/4) return 0;
48 newbuf
= realloc(c
->buf
, len2
*4);
49 if (!newbuf
) return 0;
50 *c
->bufp
= c
->buf
= newbuf
;
51 memset(c
->buf
+ c
->space
, 0, 4*(len2
- c
->space
));
55 len2
= mbsnrtowcs(c
->buf
+c
->pos
, (void *)&buf
, len
, c
->space
-c
->pos
, &c
->mbs
);
56 if (len2
== -1) return 0;
58 if (c
->pos
>= c
->len
) c
->len
= c
->pos
;
63 static int wms_close(FILE *f
)
68 FILE *open_wmemstream(wchar_t **bufp
, size_t *sizep
)
73 if (!(f
=malloc(sizeof *f
))) return 0;
74 if (!(buf
=malloc(sizeof *buf
))) {
78 memset(&f
->f
, 0, sizeof f
->f
);
79 memset(&f
->c
, 0, sizeof f
->c
);
84 f
->c
.pos
= f
->c
.len
= f
->c
.space
= *sizep
= 0;
85 f
->c
.buf
= *bufp
= buf
;
93 f
->f
.write
= wms_write
;
95 f
->f
.close
= wms_close
;
97 if (!libc
.threaded
) f
->f
.lock
= -1;
101 return __ofl_add(&f
->f
);