]>
git.proxmox.com Git - wasi-libc.git/blob - libc-top-half/musl/src/stdio/fmemopen.c
1 #include "stdio_impl.h"
17 unsigned char buf
[UNGET
+BUFSIZ
], buf2
[];
20 static off_t
mseek(FILE *f
, off_t off
, int whence
)
23 struct cookie
*c
= f
->cookie
;
29 #ifdef __wasilibc_unmodified_upstream // WASI's SEEK_* constants have different values.
30 base
= (size_t [3]){0, c
->pos
, c
->len
}[whence
];
38 if (off
< -base
|| off
> (ssize_t
)c
->size
-base
) goto fail
;
39 return c
->pos
= base
+off
;
42 static size_t mread(FILE *f
, unsigned char *buf
, size_t len
)
44 struct cookie
*c
= f
->cookie
;
45 size_t rem
= c
->len
- c
->pos
;
46 if (c
->pos
> c
->len
) rem
= 0;
51 memcpy(buf
, c
->buf
+c
->pos
, len
);
54 if (rem
> f
->buf_size
) rem
= f
->buf_size
;
56 f
->rend
= f
->buf
+ rem
;
57 memcpy(f
->rpos
, c
->buf
+c
->pos
, rem
);
62 static size_t mwrite(FILE *f
, const unsigned char *buf
, size_t len
)
64 struct cookie
*c
= f
->cookie
;
66 size_t len2
= f
->wpos
- f
->wbase
;
69 if (mwrite(f
, f
->wpos
, len2
) < len2
) return 0;
71 if (c
->mode
== 'a') c
->pos
= c
->len
;
72 rem
= c
->size
- c
->pos
;
73 if (len
> rem
) len
= rem
;
74 memcpy(c
->buf
+c
->pos
, buf
, len
);
76 if (c
->pos
> c
->len
) {
78 if (c
->len
< c
->size
) c
->buf
[c
->len
] = 0;
79 else if ((f
->flags
&F_NORD
) && c
->size
) c
->buf
[c
->size
-1] = 0;
84 static int mclose(FILE *m
)
89 FILE *fmemopen(void *restrict buf
, size_t size
, const char *restrict mode
)
92 int plus
= !!strchr(mode
, '+');
94 if (!strchr("rwa", *mode
)) {
99 if (!buf
&& size
> PTRDIFF_MAX
) {
104 f
= malloc(sizeof *f
+ (buf
?0:size
));
106 memset(&f
->f
, 0, sizeof f
->f
);
110 f
->f
.buf
= f
->buf
+ UNGET
;
111 f
->f
.buf_size
= sizeof f
->buf
- UNGET
;
114 memset(buf
, 0, size
);
117 memset(&f
->c
, 0, sizeof f
->c
);
122 if (!plus
) f
->f
.flags
= (*mode
== 'r') ? F_NOWR
: F_NORD
;
123 if (*mode
== 'r') f
->c
.len
= size
;
124 else if (*mode
== 'a') f
->c
.len
= f
->c
.pos
= strnlen(buf
, size
);
125 else if (plus
) *f
->c
.buf
= 0;
132 #if defined(__wasilibc_unmodified_upstream) || defined(_REENTRANT)
133 if (!libc
.threaded
) f
->f
.lock
= -1;
136 return __ofl_add(&f
->f
);