if (SvROK(arg)) {
if (SvREADONLY(SvRV(arg)) && mode && *mode != 'r') {
if (ckWARN(WARN_LAYER))
- Perl_warner(aTHX_ packWARN(WARN_LAYER), PL_no_modify);
+ Perl_warner(aTHX_ packWARN(WARN_LAYER), "%s", PL_no_modify);
SETERRNO(EINVAL, SS_IVCHAN);
return -1;
}
s->var = SvREFCNT_inc(SvRV(arg));
- if (!SvPOK(s->var) && SvTYPE(SvRV(arg)) > SVt_NULL)
- (void)SvPV_nolen(s->var);
+ SvGETMAGIC(s->var);
+ if (!SvPOK(s->var) && SvOK(s->var))
+ (void)SvPV_nomg_const_nolen(s->var);
}
else {
s->var =
Zero(SvPVX(s->var) + oldcur, newlen - oldcur, char);
/* No SvCUR_set(), though. This is just a seek, not a write. */
}
+ else if (!SvPVX(s->var)) {
+ /* ensure there's always a character buffer */
+ (void)SvGROW(s->var,1);
+ }
SvPOK_on(s->var);
return 0;
}
}
SSize_t
-PerlIOScalar_unread(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
-{
- PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
- char *dst = SvGROW(s->var, (STRLEN)s->posn + count);
- s->posn -= count;
- Move(vbuf, dst + s->posn, count, char);
- SvPOK_on(s->var);
- return count;
-}
-
-SSize_t
PerlIOScalar_write(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
{
if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
return (STDCHAR *) SvPV_nolen(s->var);
}
- return (STDCHAR *) Nullch;
+ return (STDCHAR *) NULL;
}
STDCHAR *
PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
return PerlIOScalar_get_base(aTHX_ f) + s->posn;
}
- return (STDCHAR *) Nullch;
+ return (STDCHAR *) NULL;
}
SSize_t
PerlIOScalar_fileno,
PerlIOScalar_dup,
PerlIOBase_read,
- PerlIOScalar_unread,
+ NULL, /* unread */
PerlIOScalar_write,
PerlIOScalar_seek,
PerlIOScalar_tell,