blob: 3b5baa97fbe7a428df10d2777b8815d9c1e4eafd [file] [log] [blame]
#include "stdio_impl.h"
#include <string.h>
#ifdef STARBOARD
#include "starboard/common/log.h"
#endif // STARBOARD
#ifndef STARBOARD
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) {
size_t n = f->write(f, s, i);
if (n < i) return n;
s += i;
l -= i;
}
}
memcpy(f->wpos, s, l);
f->wpos += l;
return l+i;
}
#endif
size_t fwrite(const void *restrict src, size_t size, size_t nmemb, FILE *restrict f)
{
#ifdef STARBOARD
SB_DCHECK((f == stdout) || (f == stderr));
SbLogRawFormatF("%.*s", size * nmemb, src);
return size * nmemb;
#else // !STARBOARD
size_t k, l = size*nmemb;
if (!size) nmemb = 0;
FLOCK(f);
k = __fwritex(src, l, f);
FUNLOCK(f);
return k==l ? nmemb : k/size;
#endif // STARBOARD
}
weak_alias(fwrite, fwrite_unlocked);