summaryrefslogtreecommitdiff
path: root/lib/libc/stdio/fwrite.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/stdio/fwrite.c')
-rw-r--r--lib/libc/stdio/fwrite.c53
1 files changed, 26 insertions, 27 deletions
diff --git a/lib/libc/stdio/fwrite.c b/lib/libc/stdio/fwrite.c
index 4adbca81..c21054da 100644
--- a/lib/libc/stdio/fwrite.c
+++ b/lib/libc/stdio/fwrite.c
@@ -1,10 +1,9 @@
-#include "__stdio.h" // for _IO_ERR
+#include "__stdio.h" // for __FILE, _IO_ERR
#include "stddef.h" // for NULL
#include <atomic.h> // for LIBC_UNLOCK, LIBC_LOCK
#include <errno.h> // for errno, EOVERFLOW, EBADF, EINVAL, EIO
#include <fcntl.h> // for O_ACCMODE, O_RDONLY
-#include <libc.h> // for __IMPL
#include <stdio.h> // for fflush, fwrite, BUFSIZ, FILE, _IOFBF, _IOLBF
#include <string.h> // for memcpy, memchr
#include <unistd.h> // for size_t, ssize_t, write
@@ -27,16 +26,16 @@ size_t fwrite(const void *restrict ptr, size_t size, size_t nitems,
return 0;
}
- if (__IMPL(stream)->fd == -1 && __IMPL(stream)->buf != NULL) {
+ if (__FILE(stream)->fd == -1 && __FILE(stream)->buf != NULL) {
if (__builtin_mul_overflow(size, nitems, &total_bytes)) {
errno = EOVERFLOW;
return 0;
}
size_t space_left =
- __IMPL(stream)->buf_size > __IMPL(stream)->buf_len ?
- __IMPL(stream)->buf_size -
- __IMPL(stream)->buf_len - 1 :
+ __FILE(stream)->buf_size > __FILE(stream)->buf_len ?
+ __FILE(stream)->buf_size -
+ __FILE(stream)->buf_len - 1 :
0;
if (space_left == 0) {
@@ -47,9 +46,9 @@ size_t fwrite(const void *restrict ptr, size_t size, size_t nitems,
space_left;
if (to_copy > 0) {
- memcpy(__IMPL(stream)->buf + __IMPL(stream)->buf_len,
+ memcpy(__FILE(stream)->buf + __FILE(stream)->buf_len,
data, to_copy);
- __IMPL(stream)->buf_len += to_copy;
+ __FILE(stream)->buf_len += to_copy;
}
return to_copy == total_bytes ? nitems : to_copy / size;
@@ -60,24 +59,24 @@ size_t fwrite(const void *restrict ptr, size_t size, size_t nitems,
return 0;
}
- if ((__IMPL(stream)->flags & O_ACCMODE) == O_RDONLY) {
+ if ((__FILE(stream)->flags & O_ACCMODE) == O_RDONLY) {
errno = EBADF;
return 0;
}
- if (__IMPL(stream)->flags & _IO_ERR) {
+ if (__FILE(stream)->flags & _IO_ERR) {
errno = EIO;
return 0;
}
- LIBC_LOCK(__IMPL(stream)->lock);
+ LIBC_LOCK(__FILE(stream)->lock);
- if (__IMPL(stream)->type == _IONBF) {
- ssize_t result = write(__IMPL(stream)->fd, data, total_bytes);
- LIBC_UNLOCK(__IMPL(stream)->lock);
+ if (__FILE(stream)->type == _IONBF) {
+ ssize_t result = write(__FILE(stream)->fd, data, total_bytes);
+ LIBC_UNLOCK(__FILE(stream)->lock);
if (result < 0) {
- __IMPL(stream)->flags |= _IO_ERR;
+ __FILE(stream)->flags |= _IO_ERR;
return 0;
}
@@ -88,48 +87,48 @@ size_t fwrite(const void *restrict ptr, size_t size, size_t nitems,
while (remaining > 0) {
size_t space_available =
- __IMPL(stream)->buf_size - __IMPL(stream)->buf_len;
+ __FILE(stream)->buf_size - __FILE(stream)->buf_len;
if (space_available == 0) {
- LIBC_UNLOCK(__IMPL(stream)->lock);
+ LIBC_UNLOCK(__FILE(stream)->lock);
if (fflush(stream) != 0) {
return written / size;
}
- space_available = __IMPL(stream)->buf_size;
+ space_available = __FILE(stream)->buf_size;
}
size_t to_copy = remaining < space_available ? remaining :
space_available;
- memcpy(__IMPL(stream)->buf + __IMPL(stream)->buf_len,
+ memcpy(__FILE(stream)->buf + __FILE(stream)->buf_len,
data + written, to_copy);
- __IMPL(stream)->buf_len += to_copy;
+ __FILE(stream)->buf_len += to_copy;
written += to_copy;
remaining -= to_copy;
- if (__IMPL(stream)->type == _IOLBF) {
+ if (__FILE(stream)->type == _IOLBF) {
char *newline_pos = memchr(
- __IMPL(stream)->buf + __IMPL(stream)->buf_len -
+ __FILE(stream)->buf + __FILE(stream)->buf_len -
to_copy,
'\n', to_copy);
if (newline_pos != NULL) {
- LIBC_UNLOCK(__IMPL(stream)->lock);
+ LIBC_UNLOCK(__FILE(stream)->lock);
if (fflush(stream) != 0) {
return written / size;
}
}
}
- else if (__IMPL(stream)->type == _IOFBF &&
- __IMPL(stream)->buf_len == __IMPL(stream)->buf_size) {
- LIBC_UNLOCK(__IMPL(stream)->lock);
+ else if (__FILE(stream)->type == _IOFBF &&
+ __FILE(stream)->buf_len == __FILE(stream)->buf_size) {
+ LIBC_UNLOCK(__FILE(stream)->lock);
if (fflush(stream) != 0) {
return written / size;
}
}
}
- LIBC_UNLOCK(__IMPL(stream)->lock);
+ LIBC_UNLOCK(__FILE(stream)->lock);
return written == total_bytes ? nitems : written / size;
}