SSize_t PerlIOEncode_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count) { PerlIOEncode *e = PerlIOSelf(f, PerlIOEncode); if (e->flags & NEEDS_LINES) { SSize_t done = 0; const char *ptr = (const char *) vbuf; const char *end = ptr+count; while (ptr < end) { const char *nl = ptr; while (nl < end && *nl++ != '\n') /* empty body */; done = PerlIOBuf_write(aTHX_ f, ptr, nl-ptr); if (done != nl-ptr) { if (done > 0) { ptr += done; } break; } ptr += done; if (ptr[-1] == '\n') { if (PerlIOEncode_flush(aTHX_ f) != 0) { break; } } } return (SSize_t) (ptr - (const char *) vbuf); } else { return PerlIOBuf_write(aTHX_ f, vbuf, count); } }
SSize_t PerlIOMmap_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count) { PerlIOMmap * const m = PerlIOSelf(f, PerlIOMmap); PerlIOBuf * const b = &m->base; if (!b->buf || !(PerlIOBase(f)->flags & PERLIO_F_WRBUF)) { /* * No, or wrong sort of, buffer */ if (m->len) { if (PerlIOMmap_unmap(aTHX_ f) != 0) return 0; } /* * If unmap took the "buffer" see if we have one from before */ if (!b->buf && m->bbuf) b->buf = m->bbuf; if (!b->buf) { PerlIOBuf_get_base(aTHX_ f); m->bbuf = b->buf; } } return PerlIOBuf_write(aTHX_ f, vbuf, count); }