fxlibc/src/libc/stdio/fwrite.c

43 lines
896 B
C

#include <stdio.h>
#include <string.h>
#include "fileutil.h"
size_t fwrite(void const *data, size_t membsize, size_t nmemb, FILE *fp)
{
size_t size;
if(__builtin_umul_overflow(membsize, nmemb, &size)) {
fp->error = 1;
return 0;
}
if(!fp->buf) {
ssize_t rc = __fp_write(fp, data, size);
return (rc == EOF) ? 0 : rc;
}
__fp_buffer_mode_write(fp);
// TODO: fwrite: line buffering
size_t size_written = 0;
while(size_written < size) {
/* Fill the buffer */
size_t size_frag = fp->bufsize - fp->bufpos;
if(size_frag > size - size_written)
size_frag = size - size_written;
memcpy(fp->buf + fp->bufpos, data + size_written, size_frag);
size_written += size_frag;
fp->bufpos += size_frag;
if(fp->bufpos >= fp->bufsize) {
ssize_t rc = __fp_write(fp, fp->buf, fp->bufpos);
if(rc <= 0) /* error */
break;
fp->bufpos = 0;
}
}
return size_written;
}