- /* 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;