Index: fusl/src/stdio/fwrite.c |
diff --git a/fusl/src/stdio/fwrite.c b/fusl/src/stdio/fwrite.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..81ec271e1bcb7ba477f92c8af74e4cc159deb032 |
--- /dev/null |
+++ b/fusl/src/stdio/fwrite.c |
@@ -0,0 +1,37 @@ |
+#include "stdio_impl.h" |
+#include <string.h> |
+ |
+size_t __fwritex(const unsigned char *restrict s, size_t l, FILE *restrict f) |
+{ |
+ size_t i=0; |
+ |
+ if (!f->wend && __towrite(f)) return 0; |
+ |
+ if (l > f->wend - f->wpos) return f->write(f, s, l); |
+ |
+ if (f->lbf >= 0) { |
+ /* Match /^(.*\n|)/ */ |
+ for (i=l; i && s[i-1] != '\n'; i--); |
+ if (i) { |
+ if (f->write(f, s, i) < i) |
+ return i; |
+ s += i; |
+ l -= i; |
+ } |
+ } |
+ |
+ memcpy(f->wpos, s, l); |
+ f->wpos += l; |
+ return l+i; |
+} |
+ |
+size_t fwrite(const void *restrict src, size_t size, size_t nmemb, FILE *restrict f) |
+{ |
+ size_t k, l = size*nmemb; |
+ FLOCK(f); |
+ k = __fwritex(src, l, f); |
+ FUNLOCK(f); |
+ return k==l ? nmemb : k/size; |
+} |
+ |
+weak_alias(fwrite, fwrite_unlocked); |