fwrite.c 732 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #include "stdio_impl.h"
  2. #include <string.h>
  3. size_t __fwritex(const unsigned char *restrict s, size_t l, FILE *restrict f)
  4. {
  5. size_t i=0;
  6. if (!f->wend && __towrite(f)) return 0;
  7. if (l > f->wend - f->wpos) return f->write(f, s, l);
  8. if (f->lbf >= 0) {
  9. /* Match /^(.*\n|)/ */
  10. for (i=l; i && s[i-1] != '\n'; i--);
  11. if (i) {
  12. size_t n = f->write(f, s, i);
  13. if (n < i) return n;
  14. s += i;
  15. l -= i;
  16. }
  17. }
  18. memcpy(f->wpos, s, l);
  19. f->wpos += l;
  20. return l+i;
  21. }
  22. size_t fwrite(const void *restrict src, size_t size, size_t nmemb, FILE *restrict f)
  23. {
  24. size_t k, l = size*nmemb;
  25. if (!size) nmemb = 0;
  26. FLOCK(f);
  27. k = __fwritex(src, l, f);
  28. FUNLOCK(f);
  29. return k==l ? nmemb : k/size;
  30. }
  31. weak_alias(fwrite, fwrite_unlocked);