/* Returns TRUE on success. Sets errno on error. */ int my_print(SV* sv) { GV* const gv = PL_defoutgv; IO* io; MAGIC* mg; PerlIO* fp; int success; const char* buf; STRLEN to_write; io = GvIO(gv); if (!io && GvEGV(gv)) { io = GvIO(GvEGV(gv)); } if (!io) { return FALSE; } mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar); if (mg) { dSP; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(SvTIED_obj((SV*)io, mg)); XPUSHs(sv); PUTBACK; call_method("PRINT", G_SCALAR); SPAGAIN; success = 0 != POPi; PUTBACK; FREETMPS; LEAVE; return success; } fp = IoOFP(io); if (!fp) { return FALSE; } buf = SvPV(sv, to_write); while (to_write > 0) { int written = PerlIO_write(fp, buf, to_write); if (written < 0) { return FALSE; } buf += written; to_write -= written; } return TRUE; }