So anyway, I think there are probably some good reasons to do the
merging in __fwritex rather than in the __stdio_write backend. But it
should be a lot simpler than what you initially proposed.

Rich

Thanks for your feedback!  In interest of keeping the proposal as simple as possible, I've gone with just one extra line of code (see below).  It simply does copying for  i <= 8.

It works on my initial testing and I'm getting zero lengths in the 2nd writev iovec (as expected), but I'll test it more in coming week.

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 (i <= 8) for (; i; i--, l--) *(f->wpos)++ = *s++;

size_t n = f->write(f, s, i);

if (!f->wpos || n < i) return n;

l -= i;

s += i;

}

}


memcpy(f->wpos, s, l);

f->wpos += l;

return l+i;

}