initial check-in, version 0.5.0
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
#include "stdio_impl.h"
|
||||
|
||||
size_t __fwritex(const unsigned char *s, size_t l, FILE *f)
|
||||
{
|
||||
size_t i = 0;
|
||||
size_t k = f->wend - f->wpos;
|
||||
|
||||
/* Handle line-buffered mode by breaking into 2 parts */
|
||||
if (f->lbf >= 0) {
|
||||
/* Match /^(.*\n|)/ */
|
||||
for (i=l; i && s[i-1] != '\n'; i--);
|
||||
if (i) {
|
||||
f->lbf = EOF;
|
||||
__fwritex(s, i, f);
|
||||
f->lbf = '\n';
|
||||
__oflow(f);
|
||||
return ferror(f) ? 0 : i + __fwritex(s+i, l-i, f);
|
||||
}
|
||||
}
|
||||
|
||||
/* Buffer initial segment */
|
||||
if (k > l) k = l;
|
||||
memcpy(f->wpos, s, k);
|
||||
f->wpos += k;
|
||||
if (f->wpos < f->wend) return l;
|
||||
|
||||
/* If there's work left to do, flush buffer */
|
||||
__oflow(f);
|
||||
if (ferror(f)) return 0;
|
||||
|
||||
/* If the remainder will not fit in buffer, write it directly */
|
||||
if (l - k >= f->wend - f->wpos)
|
||||
return k + f->write(f, s+k, l-k);
|
||||
|
||||
/* Otherwise, buffer the remainder */
|
||||
memcpy(f->wpos, s+k, l-k);
|
||||
f->wpos += l-k;
|
||||
return l;
|
||||
}
|
||||
|
||||
size_t fwrite(const void *src, size_t size, size_t nmemb, FILE *f)
|
||||
{
|
||||
size_t l = size*nmemb;
|
||||
if (!l) return l;
|
||||
FLOCK(f);
|
||||
l = __fwritex(src, l, f);
|
||||
FUNLOCK(f);
|
||||
return l/size;
|
||||
}
|
||||
|
||||
weak_alias(fwrite, fwrite_unlocked);
|
||||
Reference in New Issue
Block a user